데이터베이스 모델링 (Modeling)
데이터베이스는 다음과 같이 모델링할 수 있다:
- 엔티티들의 집합(Collection)
- 엔티티들 간의 관계(relationship)
엔티티(Entity)
- 엔티티는 존재하며 다른 객체들과 구별 가능한 객체를 의미한다.
- 예시: 특정 학생 (예: Williams)
속성(Attribute)
- 엔티티는 여러 개의 속성(특징) 을 가진다.
- 예시: 학생은 이름(name), 전화번호(phone number) 등의 속성을 가짐
엔티티 집합(Entity Set) = relation
- 같은 유형(Type)의 엔티티들이 모인 집합이며, 동일한 속성을 공유한다.
- 예시: 모든 학생들의 집합, 모든 학과들의 집합 등
Entity Sets instructor and student
instructor = entity set 각 학생은 entity이다. instructor와 student의 relationship은 모른다.
관계 집합 (Relationship Sets)
관계 (Relationship)
- 관계는 여러 엔티티들 사이의 연관성을 나타낸다.
- 예시:
- 44553 (Peltier) 학생이 22222 (Einstein) 교수의 advisor(지도교수) 라는 관계를 가짐
- 즉, student 엔티티와 instructor 엔티티 사이에 advisor 라는 관계가 형성됨
관계 집합 (Relationship Set)
- 관계 집합은 수학적으로 정의된 것으로, n(≥2)개의 엔티티 집합에서 선택된 엔티티들 간의 조합을 나타냄
- 수학적 표현: {(e1, e2, …, en) | e1 ∈ E1, e2 ∈ E2, …, en ∈ En}
- 여기서 (e1, e2, …, en)은 하나의 관계를 의미함
- E1, E2, ..., En은 각각의 엔티티 집합
- 예시:
- (44553, 22222) ∈ advisor
- 학생 44553과 교수 22222 사이에 advisor 관계가 존재함
Relationship Set advisor 예시
각 학생은 advisor라는 관계 집합으로 교수를 가진다. 그러나 관계집합 advisor을 그저 실선으로는 표현하는데 한계가 있다.
E-R 다이어그램 (E-R Diagrams)
기본 구성 요소
- 사각형(Rectangle): 엔티티 집합(Entity Sets)을 나타냄
- 마름모(Diamond): 관계 집합(Relationship Sets)을 나타냄
- 속성(Attribute): 엔티티 내부에 나열됨
- 밑줄(Underline): 기본 키(Primary Key) 속성을 표시함
관계 집합 (Relationship Sets)
관계집합은 속성을 따로 가질 수도 있다. 테이블에서는 포함 할 수도 있다. 공통적인 속성을 관계집합 그림에 추가한다. 실제 테이블에서는 그 공통 속성을 두 테이블에 추가돼야한다.
- 속성은 관계 집합의 속성으로도 사용될 수 있다.
- 예시:
- instructor와 student 간의 advisor 관계 집합은 date라는 속성을 가질 수 있음
- 이 date 속성은 해당 학생이 언제부터 해당 교수의 지도 학생이 되었는지를 나타냄
Relationship Sets with Attributes 예
관계 집합의 차수 (Degree of a Relationship Set)
이항 관계 (Binary Relationship)
- 두 개의 엔티티 집합이 관여하는 관계
- 즉, 차수(degree)가 2인 관계
- 대부분의 관계는 이항 관계로 구성됨
삼항 관계 (Ternary Relationship)
- 세 개의 엔티티 집합이 관여하는 관계
- 예시:
- 학생들이 교수의 지도 하에 연구 프로젝트를 수행하는 경우
- 이때의 관계인 proj_guide는 instructor, student, project 세 엔티티 집합 간의 삼항 관계
속성 (Attributes)
엔티티와 속성
- 엔티티는 속성들의 집합으로 표현됨
- 속성은 엔티티 집합의 모든 구성원이 가지는 기술적 특성
- 예시:
- instructor = (ID, name, street, city, salary)
- course = (course_id, title, credits)
도메인 (Domain)
- 각 속성이 가질 수 있는 허용된 값들의 집합
속성의 유형
- 단순(Simple) / 복합(Composite) 속성
- 단순: 더 이상 나눌 수 없는 속성 (예: name)
- 복합: 여러 하위 속성으로 구성 (예: address → street, city)
- 단일값(Single-valued) / 다중값(Multivalued) 속성
- 단일값: 하나의 값만 가짐
- 다중값: 여러 값을 가질 수 있음 예시: phone_numbers — 한 사람이 여러 전화번호를 가질 수 있음
- 유도 속성(Derived Attributes)
- 다른 속성으로부터 계산 가능한 속성
- 예시: age는 date_of_birth로부터 계산 가능
Composite Attributes 예
Mapping Cardinality Constraints
관계 집합을 통해 하나의 엔티티가 다른 엔티티와 가질 수 있는 연관의 수량적 범위를 표현하는 제약 조건이다.
특히 이항 관계 집합(binary relationship set) 에서 매우 유용하게 사용된다.
이항 관계에서의 매핑 카디널리티는 다음 네 가지 중 하나로 구분된다:
- One to One (일대일)
- One to Many (일대다)
- Many to One (다대일)
- Many to Many (다대다)
참고: 어떠한 매핑이라고 해도 A와 B의 일부 요소는 상대 집합의 어떤 요소와도 매핑되지 않을 수 있다.
one -> 최대 1개, many -> 최대가 1이 상이다
Keys
키는 하나의 레코드를 고유하게 식별할 수 있는 속성 또는 속성들의 집합(composite) 이다.
- 슈퍼 키(Super key): 엔티티를 고유하게 식별할 수 있는 속성들의 집합
- 예: (ID, name)은 instructor의 슈퍼 키
- 후보 키(Candidate key): 최소한의 속성만으로 구성된 슈퍼 키
- 예: ID는 instructor의 후보 키, course_id는 course의 후보 키
- 기본 키(Primary key): 여러 후보 키 중에서 선택된 대표 키
- 하나의 테이블에는 하나의 기본 키만 존재
Keys for Relationship Sets
관계 집합의 키는 관계에 참여하는 각 엔티티 집합의 기본 키를 조합하여 구성된다.
예시:
- student의 기본 키: s_id
- instructor의 기본 키: i_id → advisor 관계 집합의 슈퍼 키는 (s_id, i_id)
Entity With Composite, Multivalued, and Derived Attributes
복합 속성(composite attribute)은 구성 요소(attribute)를 각각의 개별 속성으로 분해하여 표현한다.
다중값 속성(multivalued attribute)은 무시한다고 가정할 경우,
확장된 instructor 스키마는 다음과 같다:
instructor( ID,
first_name, middle_initial, last_name,
street_number, street_name, apt_number,
city, state, zip_code,
date_of_birth)
들여쓰기 <- composite 속성 구성 요소를 의미한다 name = (first_name, middle_name ..)
{} <- Multivalued 속성을 의미한다 : { phone_number }
() <- derived 속성 의미한다 : age() -> date_of_birth로 계산
Roles
관계 집합에 참여하는 엔티티 집합들은 서로 다른 집합일 필요는 없다.
즉, 같은 엔티티 집합이 관계 내에서 두 번 이상 등장할 수 있다.
이럴 때 각 엔티티가 수행하는 역할을 구분하기 위해 역할(Role) 을 지정한다.
예시: course_id와 prereq_id는 같은 엔티티 집합(course) 내에서 다른 역할을 수행한다.
Cardinality Constraints
카디널리티 제약은 선의 유형으로 표현된다:
- directed line(→): one (하나)
- undirected line(—): many (여러 개)
예시:
- 학생은 advisor 관계를 통해 최대 하나의 instructor와 연관될 수 있다 → one-to-one
- 학생은 stud_dept 관계를 통해 최대 하나의 학과와 연관될 수 있다 → one-to-one
One-to-One Relationship
- instructor와 student 사이의 관계에서 양쪽 모두가 최대 하나의(연결이 안될 수도 있다) 엔티티와만 연결된다.
- 즉, 한 교수는 최대 한 명의 학생과만 advisor 관계를 가지며, 학생도 마찬가지로 하나의 교수만을 가짐.
One-to-Many Relationship
- 한 명의 instructor는 여러 명(0도 포함함) 의 학생들과 advisor 관계를 가질 수 있음.
- 반면 한 명의 학생은 최대 하나의 instructor와만 관계를 가짐.
Many-to-One Relationship
- 여러 학생들이 하나의 instructor와 advisor 관계를 가짐.
- instructor는 한 명의 학생과만 관계를 가짐.
(※ 실제로는 이 정의가 One-to-Many와 동일하게 들릴 수 있지만, 표현 관점에 따라 설명이 반대가 됨. 주의.)
Many-to-Many Relationship
- 한 명의 instructor는 여러 명(0도 포함)의 학생들과 관계 가능
- 한 명의 학생도 여러 명(0도 포함)의 instructor와 관계 가능
Participation of an Entity Set in a Relationship Set
더블라인은 Total Participation을 의미한다. 모든 엔티티가 매칭된다.
관계에 참여하는 엔티티 집합의 참여 정도를 나타낸다:
- 전체 참여(Total Participation): 이중 선으로 표현
- 예시: section은 sec_course 관계에 전체 참여 → 모든 section은 반드시 course와 연결됨
- 엔티티 집합의 모든 엔티티가 적어도 하나의 관계에 참여
- 부분 참여(Partial Participation): 단일 선으로 표현
- 일부 엔티티만 관계에 참여할 수 있음
Alternative Notation for Cardinality Limits
카디널리티 제약은 최소/최대 참여 수를 명시하는 방식으로도 숫자의 범위를 표현할 수 있다.
(min..max)의 형식으로 정의한다 0..* -> 0 부터 N의 관계 가능 1..1 -> 일대일 관계
이를 통해 참여 제약과 카디널리티 제약을 동시에 표현 가능
삼항 관계에서의 카디널리티 제약 (Cardinality Constraints on Ternary Relationship)
삼항(또는 그 이상의 차수) 관계에서 카디널리티 제약은 한가지의 화살표만 허용된다.
예시:
- proj_guide 관계에서 instructor로 향하는 화살표는각 학생이 하나의 프로젝트에 대해 최대 한 명의 지도교수만 가질 수 있음을 의미
화살표가 두 개 이상 존재할 경우 해석이 모호해진다. 예를 들어, A, B, C 세 엔티티 간 관계 R에 대해
B와 C로 동시에 화살표가 향할 경우 다음 두 가지 해석이 가능하다:
- 각 A 엔티티는 B와 C 각각에서 하나의 유일한 엔티티와 연관된다
- (A, B) 쌍은 하나의 C와 연관되고, (A, C) 쌍은 하나의 B와 연관된다
이처럼 해석 방식이 다른 두 가지가 존재하므로 혼동을 피하기 위해 한가지만 허용한다. -> 제일 좋은건 설계시 삼항 관계를 만들지 않는것이다.
약한 엔티티 집합 (Weak Entity Sets)
약한 엔티티 집합은 기본 키(primary key)가 존재하지 않는 엔티티 집합이다.
- 식별자 엔티티 집합(identifying entity set) 에 의존하여 구별됨
- 식별 관계(identifying relationship) 를 통해 관련되며, 이 관계는 전체 참여(total participation) 이며 일대다 관계(one-to-many) 여야 함
- 약한 엔티티 집합의 식별 관계는 이중 마름모(double diamond) 로 표현
- 구별자(discriminator 또는 partial key): 약한 엔티티 집합 내에서 각 엔티티를 구분하는 속성 집합
- 약한 엔티티 집합의 기본 키는:
- 식별자 엔티티 집합의 기본 키
- 약한 엔티티 집합의 구별자 를 결합하여 구성됨
예시:
- section의 기본 키는 (course_id, sec_id, semester, year)
표기법 관련 사항
- 구별자(discriminator) 는 점선 밑줄로 표시
- 식별 관계는 이중 마름모(double diamond) 로 나타냄
주의사항
- 강한 엔티티의 기본 키(course_id 등)는 약한 엔티티에 명시적(explicit)으로 저장되지 않음 → 왜냐하면 식별 관계를 통해 암묵적으로 연결되어 있기 때문(foreign key)
- 만약 course_id를 명시적으로 저장하면 section은 강한 엔티티가 될 수 있으나, 그 경우 course와 section 사이의 관계가 속성과 관계 양쪽에서 중복되어 표현됨
E-R Diagram for a University Enterprise 예시
🎓 1. student (학생)
- 속성: ID, name, tot_cred (총 이수 학점)
- 학생의 기본 정보가 저장된다.
📚 2. takes (수강 관계)
- 관계: student — takes — section
- 학생이 어떤 수업 섹션을 수강했는지 나타냄
- 관계 자체에 grade(성적) 속성이 존재함
예: 학생 A가 2023년 가을학기에 데이터베이스 섹션 02를 수강하고 성적은 A
👨🏫 3. advisor (지도 교수 관계)
- 관계: student — advisor — instructor
- 학생과 지도 교수 사이의 1:1 관계
🏫 4. stud_dept (학생 소속 학과)
- 관계: student — stud_dept — department
- 학생의 소속 학과 정보를 연결
📖 5. course (과목 정보)
- 속성: course_id, title, credits
- 과목의 기본 정보 저장
🧩 6. prereq (선수 과목 관계) ⭐️
- 재귀 관계: course — prereq — course
- 같은 테이블이 두 번 참여하므로, role(역할) 로 구분:
- course_id: 본 과목
- prereq_id: 선수 과목
예: 알고리즘(course_id)의 선수 과목은 자료구조(prereq_id)
🧑🏫 7. teaches (교수 수업 담당 관계)
- 관계: instructor — teaches — section
- 각 교수님이 어떤 섹션을 가르치는지 나타냄
🧱 8. section (수업 섹션)
- 속성: sec_id, semester, year
- 하나의 course는 여러 개의 section(분반)을 가질 수 있음
🏫 9. sec_class (강의실 배정)
- 관계: section — sec_class — classroom
- 수업이 어느 강의실에서 열리는지 나타냄
⏱️ 10. sec_time_slot (시간표 배정)
- 관계: section — sec_time_slot — time_slot
- 수업이 언제 열리는지를 나타냄
- time_slot에는 요일, 시작/종료 시간이 포함됨
🔁 Role이 사용되는 대표적인 예: prereq
- prereq는 course 테이블이 자기 자신과 관계를 맺는 재귀 관계
- 같은 엔티티가 두 번 참여하기 때문에 역할(Role)을 반드시 지정해야 함:
- course_id는 "본 과목" 역할
- prereq_id는 "선수 과목" 역할
요약
항목 | 설명 |
student | 나 자신 (학생) |
takes | 내가 수강한 과목 섹션 |
section | 수업의 분반 정보 |
course | 과목 기본 정보 |
prereq | 선수 과목 관계 (Role 필요) |
instructor | 교수 정보 및 지도 교수 |
advisor | 지도 교수 관계 |
department | 나의 소속 학과 |
classroom | 강의실 정보 |
time_slot | 수업 시간표 |
'CS 지식 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 권한과 권한 그룹(역할) (1) | 2025.04.01 |
---|---|
[데이터베이스] 트랜잭션과 무결성 제약 조건, 도메인 (0) | 2025.04.01 |
[데이터베이스] 뷰(View) 정의와 사용, 삽입 (0) | 2025.03.26 |
[데이터베이스] 조인 연산의 종류와 조건 (0) | 2025.03.26 |
[데이터베이스] 기초 SQL (2) (0) | 2025.03.22 |
댓글