본문 바로가기
CS 지식/데이터베이스

[데이터베이스] 모델링, 관계집합, E-R 다이어그램(ERD)

by 코딩하는 동현 2025. 4. 4.

데이터베이스 모델링 (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)

  • 각 속성이 가질 수 있는 허용된 값들의 집합

속성의 유형

  1. 단순(Simple) / 복합(Composite) 속성
    • 단순: 더 이상 나눌 수 없는 속성 (예: name)
    • 복합: 여러 하위 속성으로 구성 (예: address → street, city)
  2. 단일값(Single-valued) / 다중값(Multivalued) 속성
    • 단일값: 하나의 값만 가짐
    • 다중값: 여러 값을 가질 수 있음 예시: phone_numbers — 한 사람이 여러 전화번호를 가질 수 있음
  3. 유도 속성(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로 동시에 화살표가 향할 경우 다음 두 가지 해석이 가능하다:

  1. 각 A 엔티티는 B와 C 각각에서 하나의 유일한 엔티티와 연관된다
  2. (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 수업 시간표
반응형

댓글