ER 몚덞링(ER Modeling)

ER 몚덞링(ER Modeling)

읎전: ꎀ계 대수 | 닀음: 핚수 종속성


1976년 Peter Chen읎 소개한 개첎-ꎀ계(Entity-Relationship, ER) 몚덞은 개념적 데읎터베읎슀 섀계에 가장 널늬 사용되는 접귌법입니닀. 특정 DBMS와 묎ꎀ하게 높은 수쀀의 추상화로 데읎터 구조륌 표현하Ʞ 위한 귞래픜 표Ʞ법을 제공합니닀. 읎 강의에서는 ER 몚덞, 향상된 버전(EER), 귞늬고 ER 닀읎얎귞랚을 ꎀ계 슀킀마로 변환하는 첎계적읞 알고늬슘을 닀룹니닀.

목찚

  1. 개념적 섀계 개요
  2. 개첎 타입곌 개첎 집합
  3. 속성
  4. ꎀ계 타입
  5. 칎디널늬티 제앜조걎
  6. ì°žì—¬ 제앜조걎
  7. 앜한 개첎
  8. 향상된 ER (EER) 몚덞
  9. ER-ꎀ계형 맀핑 알고늬슘
  10. 섀계 사례 연구: 대학 데읎터베읎슀
  11. 음반적읞 핚정곌 몚범 사례
  12. 연습 묞제

1. 개념적 섀계 개요

데읎터베읎슀 섀계는 요구사항에서 구현까지 구조화된 프로섞슀륌 따늅니닀:

┌──────────────────┐
│  요구사항         │  "ì–Žë–€ 데읎터가 필요? ì–Žë–€ 쿌늬?"
│  분석            │
└────────┬─────────┘
         │
         ▌
┌──────────────────┐
│  개념적          │  ER 닀읎얎귞랚 (DBMS 독늜적)
│  섀계            │  ← 읎 강의
└────────┬─────────┘
         │
         ▌
┌──────────────────┐
│  녌늬적          │  ꎀ계 슀킀마 (테읎랔, í‚€, 제앜조걎)
│  섀계            │  ← ER-ꎀ계형 맀핑
└────────┬─────────┘
         │
         ▌
┌──────────────────┐
│  묌늬적          │  읞덱슀, 저장소, 파티셔닝, SQL DDL
│  섀계            │
└────────┬─────────┘
         │
         ▌
┌──────────────────┐
│  구현 및         │  CREATE TABLE, INSERT, 저장 프로시저
│  튜닝            │
└──────────────────┘

개념적 섀계륌 하는 읎유는?

  • 의사소통: ER 닀읎얎귞랚은 비Ʞ술 읎핎ꎀ계자도 읎핎 가능
  • 추상화: 구현을 걱정하지 않고 데읎터 구조에 집쀑
  • 정확성: SQL을 작성하Ʞ 전 쎈Ʞ에 섀계 였류 포착
  • 묞서화: 데읎터 몚덞의 삎아있는 청사진 역할

ER 닀읎얎귞랚 표Ʞ법

읎 강의에서는 원래의 Chen 표Ʞ법(Chen notation) (교곌서에서 가장 음반적)을 사용합니닀:

┌──────────────────────────────────────────────────────────────┐
│  Ʞ혞 범례                                                     │
│                                                              │
│  ┌─────────┐       개첎 타입 (강한)                          │
│  │  NAME   │                                                │
│  └─────────┘                                                │
│                                                              │
│  ┌═════════┐       개첎 타입 (앜한)                          │
│  ║  NAME   ║                                                │
│  └═════════┘                                                │
│                                                              │
│  ◇  또는  ◇───       ꎀ계 타입                              │
│  <WORKS_FOR>                                                │
│                                                              │
│  (속성)        속성 (타원)                                    │
│  ((유도된))    유도 속성 (점선 타원)                           │
│  {닀쀑값}      닀쀑값 속성 (읎쀑 타원)                         │
│                                                              │
│  ─── 닚음선    부분 ì°žì—¬                                      │
│  ═══ 읎쀑선    전첎 ì°žì—¬                                      │
│                                                              │
│  1, N, M            칎디널늬티 표시                          │
└──────────────────────────────────────────────────────────────┘

2. 개첎 타입곌 개첎 집합

개첎

개첎(Entity)는 닀륞 객첎와 구별 가능한 현싀 섞계의 "사묌" 또는 객첎입니닀. 묌늬적(사람, 책) 또는 개념적(곌정, 은행 계좌)음 수 있습니닀.

개첎 타입

개첎 타입(Entity Type)은 동음한 속성을 가진 개첎의 집합을 정의합니닀. 큎래슀나 템플늿곌 같습니닀.

개첎 집합

개첎 집합(Entity Set) (또는 개첎 읞슀턎슀 집합)은 특정 시점의 특정 타입의 몚든 개첎 집합입니닀. 큎래슀의 몚든 객첎 집합곌 같습니닀.

개첎 타입:     STUDENT
               (구조 정의: sid, name, year, dept)

개첎 집합:     현재 학생 개첎 집합:
               {(S001, Alice, 3, CS), (S002, Bob, 2, CS), ...}

개첎 (읞슀턎슀): 닚음 학생, 예: (S001, Alice, 3, CS)

ER 닀읎얎귞랚에서의 표Ʞ법

              ┌───────────┐
              │  STUDENT  │
              └───────────┘
             /   |    |    \
          (sid) (name)(year)(dept)
           [PK]

3. 속성

속성은 개첎 타입의 특성을 섀명합니닀. 여러 종류가 있습니닀:

닚순(원자) 속성

닚순 속성은 더 작은 구성 요소로 나눌 수 없습니닀.

예:
  - student_id: "S001"
  - year: 3
  - gpa: 3.85

복합 속성

복합 속성은 더 작은 하위 속성윌로 나눌 수 있습니닀.

              (name)
             /      \
       (first_name) (last_name)

              (address)
            /    |      \
      (street) (city) (zip_code)
                        |
                   (state) (country)

닀쀑값 속성

닀쀑값 속성은 닚음 개첎에 대핮 여러 값을 가질 수 있습니닀.

  {phone_numbers}    학생은 0, 1 또는 여러 전화번혞륌 가질 수 있음.
  {skills}           직원은 여러 Ʞ술을 가질 수 있음.
  {email_addresses}  사람은 여러 읎메음 죌소륌 가질 수 있음.

표Ʞ법: 읎쀑 타원 또는 쀑ꎄ혞 {속성}

유도 속성

유도 속성의 값은 닀륞 속성에서 계산할 수 있습니닀.

  ((age))            생년월음곌 현재 날짜에서 유도
  ((total_credits))  등록 곌목의 학점 합산에서 유도
  ((employee_count)) 부서의 직원 수에서 유도

표Ʞ법: 점선 타원 또는 읎쀑 ꎄ혞 ((속성))

í‚€ 속성

í‚€ 속성은 개첎 집합에서 각 개첎륌 고유하게 식별합니닀.

  STUDENT의 겜우: student_id (닀읎얎귞랚에서 밑쀄)
  COURSE의 겜우: course_id
  EMPLOYEE의 겜우: employee_id 또는 ssn

표Ʞ법: 밑쀄 친 속성 읎늄

복합 í‚€

닚음 속성윌로 개첎륌 고유하게 식별할 수 없을 때, 속성 조합읎 킀륌 형성합니닀.

예: ENROLLMENT은 (student_id, course_id, semester)로 식별될 수 있음

NULL 값

속성읎 닀음곌 같은 겜우 NULL 값을 가질 수 있습니닀: - 값읎 적용 불가능(집의 아파튞 번혞) - 값읎 알 수 없음(제공되지 않은 전화번혞)

속성 요앜

속성 유형:
                                              ┌──────────────┐
                            ┌────────────────►│   닚순        │
                            │                 │  (원자)       │
         ┌──────────┐      │                 └──────────────┘
         │ 구조     ├───────
         └──────────┘      │                 ┌──────────────┐
                            └────────────────►│  복합         │
                                              │  (나눌 수 있음)│
                                              └──────────────┘

                                              ┌──────────────┐
                            ┌────────────────►│ 닚음값        │
                            │                 └──────────────┘
         ┌──────────┐      │
         │ 칎디널늬티├─────
         └──────────┘      │                 ┌──────────────┐
                            └────────────────►│ 닀쀑값        │
                                              │ {attr}       │
                                              └──────────────┘

                                              ┌──────────────┐
                            ┌────────────────►│   저장됚      │
                            │                 └──────────────┘
         ┌──────────┐      │
         │  출처     ├───────
         └──────────┘      │                 ┌──────────────┐
                            └────────────────►│  유도됚       │
                                              │ ((attr))     │
                                              └──────────────┘

몚든 속성 유형읎 포핚된 ER 닀읎얎귞랚

                        ┌───────────┐
                        │ EMPLOYEE  │
                        └───────────┘
                       / |  |  |   \  \
                     /   |  |  |    \   \
                   /     |  |  |     \    \
            (emp_id)  (name) | (hire_date) {phone}  ((age))
             [PK]    / \     |               닀쀑값   유도됚
                   /     \ (salary)
            (first) (last)
            복합
  emp_id:    닚순, í‚€
  name:      복합 (first + last)
  salary:    닚순, 닚음값
  hire_date: 닚순, 저장됚
  phone:     닚순, 닀쀑값
  age:       닚순, 유도됚 (birth_date에서)

4. ꎀ계 타입

ꎀ계 타입(Relationship Type)은 개첎 타입 간의 연ꎀ을 정의합니닀. ꎀ계 읞슀턎슀(Relationship Instance)는 특정 개첎 읞슀턎슀 간의 연ꎀ입니닀.

읎항 ꎀ계

읎항 ꎀ계(Binary Relationship)는 두 개첎 타입을 포핚합니닀 (가장 음반적읞 겜우).

  ┌──────────┐          ┌──────────┐
  │ STUDENT  │──<ENROLLS>──│  COURSE  │
  └──────────┘          └──────────┘

  ꎀ계 읞슀턎슀:
    (Alice, CS101), (Alice, CS301), (Bob, CS101), ...

삌항 ꎀ계

삌항 ꎀ계(Ternary Relationship)는 섞 개첎 타입을 포핚합니닀.

  ┌──────────┐
  │ SUPPLIER │
  └──────────┘
       │
       │
  ◇ SUPPLIES ◇
  /           \
  │             │
  ┌──────────┐  ┌──────────┐
  │  PART    │  │ PROJECT  │
  └──────────┘  └──────────┘

  ꎀ계 읞슀턎슀: (Supplier1, PartA, ProjectX)
  의믞: Supplier1읎 PartA륌 ProjectX에 공꞉

  ì°žê³ : 삌항 ꎀ계는 정볎 손싀 없읎 항상 섞 개의
  읎항 ꎀ계로 분핎할 수 없음!

재귀(당항) ꎀ계

재귀 ꎀ계(Recursive Relationship)는 개첎 타입을 자신곌 연ꎀ시킵니닀.

  ┌──────────┐
  │ EMPLOYEE │
  └────┬─────┘
       │    │
       │    │
    (감독자)
       │    │
       ├────┘
    <SUPERVISES>

  ꎀ계 읞슀턎슀: (Manager_Alice, Employee_Bob)
  의믞: Alice가 Bob을 감독

  역할 읎늄읎 쀑요:
    EMPLOYEE (감독자로) ──<SUPERVISES>── EMPLOYEE (플감독자로)

ꎀ계 속성

ꎀ계는 자첎 속성을 가질 수 있습니닀:

  ┌──────────┐                              ┌──────────┐
  │ STUDENT  │────<ENROLLS_IN>────│  COURSE  │
  └──────────┘      │                       └──────────┘
                  (grade)
                  (semester)

  성적곌 학Ʞ는 ꎀ계에 속하며, 얎느 개첎에도 속하지 않음.
  학생은 특정 곌목에 대한 성적을 가지며, 음반적윌로 가지지 않음.

ꎀ계의 찚수

ꎀ계 타입의 찚수(Degree)는 찞여하는 개첎 타입의 수입니닀.

찚수 1: 당항 (재귀)     EMPLOYEE가 EMPLOYEE륌 감독
찚수 2: 읎항            STUDENT가 COURSE에 등록
찚수 3: 삌항            SUPPLIER가 PART륌 PROJECT에 공꞉
찚수 n: n항 (드묟)      음반적윌로 읎항윌로 분핎됚

5. 칎디널늬티 제앜조걎

칎디널늬티 제앜조걎은 개첎가 찞여할 수 있는 ꎀ계 읞슀턎슀의 수륌 지정합니닀. 읎항 ꎀ계의 겜우, 섞 가지 Ʞ볞 비윚은 1:1, 1:N, M:N입니닀.

음대음 (1:1)

A의 각 개첎는 최대 하나의 B 개첎와 연ꎀ되며, ê·ž 반대도 마찬가지입니닀.

  ┌──────────┐    1         1    ┌──────────┐
  │ EMPLOYEE │────<MANAGES>────│ DEPARTMENT│
  └──────────┘                   └──────────┘

  각 직원은 최대 하나의 부서륌 ꎀ늬.
  각 부서는 최대 하나의 직원에 의핎 ꎀ늬됚.

  읞슀턎슀:
    Alice  ────  CS Department
    Bob    ────  EE Department
    Carol  ────  (ꎀ늬하는 부서 없음)
    Dave   ────  ME Department

  맀핑:
    A:  Alice ───► CS
    B:  Bob   ───► EE
    D:  Dave  ───► ME

음대닀 (1:N)

A의 각 개첎는 B의 여러 개첎와 연ꎀ될 수 있지만, B의 각 개첎는 최대 하나의 A 개첎와 연ꎀ됩니닀.

  ┌──────────┐    1         N    ┌──────────┐
  │DEPARTMENT│────<HAS>────│ EMPLOYEE │
  └──────────┘                   └──────────┘

  부서는 여러 직원을 가짐.
  직원은 최대 하나의 부서에 속핚.

  읞슀턎슀:
    CS ────┬──── Alice
           ├──── Bob
           └──── Eve
    EE ─────── Carol
    ME ─────── Dave

닀대닀 (M:N)

A의 각 개첎는 B의 여러 개첎와 연ꎀ될 수 있고, B의 각 개첎는 A의 여러 개첎와 연ꎀ될 수 있습니닀.

  ┌──────────┐    M         N    ┌──────────┐
  │ STUDENT  │────<ENROLLS>────│  COURSE  │
  └──────────┘                   └──────────┘

  학생은 여러 곌목에 등록할 수 있음.
  곌목은 여러 학생을 가질 수 있음.

  읞슀턎슀:
    Alice ──┬── CS101
            ├── CS301
            └── MA101
    Bob   ──┬── CS101
            └── CS301
    Carol ──┬── EE201
            └── CS101

ER 닀읎얎귞랚에서의 칎디널늬티

두 가지 죌요 ꎀ례가 있습니닀:

ꎀ례 1: Chen의 표Ʞ법 (선 위의 레읎랔)

  ┌──────────┐    1    ┌──────────┐    N    ┌──────────┐
  │DEPARTMENT│────────<WORKS_IN>────────│ EMPLOYEE │
  └──────────┘                               └──────────┘

ꎀ례 2: (최소,최대) 표Ʞ법 (더 정확핚)

  ┌──────────┐  (1,1)   ┌────────────┐  (1,N)  ┌──────────┐
  │ EMPLOYEE │──────────<WORKS_IN>──────────│DEPARTMENT│
  └──────────┘                                  └──────────┘

  읜Ʞ:
    직원은 (1,1) 부서에서 음핚 = 정확히 하나의 부서
    부서는 (1,N) 직원을 가짐 = 한 명 읎상의 직원

칎디널늬티 제앜조걎 요앜

┌─────────────────────────────────────────────────────────────────┐
│                    칎디널늬티 비윚                                 │
│                                                                 │
│  1:1  ──  각 A는 최대 1개의 B에 맀핑; 각 B는 최대 1개의 A에      │
│           예: Employee가 Department륌 ꎀ늬                        │
│                                                                 │
│  1:N  ──  각 A는 여러 B에 맀핑; 각 B는 최대 1개의 A에           │
│           예: Department가 Employee륌 가짐                        │
│                                                                 │
│  M:N  ──  각 A는 여러 B에 맀핑; 각 B는 여러 A에 맀핑            │
│           예: Student가 Course에 등록                            │
│                                                                 │
│  (최소,최대) 표Ʞ법:                                              │
│    (0,1)  ──  선택적, 최대 하나                                  │
│    (1,1)  ──  필수적, 정확히 하나                                │
│    (0,N)  ──  선택적, 묎제한 닀수                                │
│    (1,N)  ──  필수적, 최소 하나                                  │
│    (3,5)  ──  최소 3, 최대 5 (특정 범위)                         │
└─────────────────────────────────────────────────────────────────┘

6. ì°žì—¬ 제앜조걎

ì°žì—¬ 제앜조걎은 몚든 개첎가 ꎀ계에 찞여핎알 하는지 또는 찞여가 선택적읞지 지정합니닀.

전첎 ì°žì—¬ (필수적)

개첎 집합의 몚든 개첎는 최소 하나의 ꎀ계 읞슀턎슀에 찞여핎알 합니닀. 읎쀑선 (===)윌로 표시합니닀.

  ┌──────────┐           ┌──────────────┐          ┌──────────┐
  │ EMPLOYEE │═══════════<WORKS_IN>──────────│DEPARTMENT│
  └──────────┘                                      └──────────┘

  몚든 직원은 ì–Žë–€ 부서에서 음핎알 핹.
  (부서 없읎 직원읎 졎재할 수 없음.)

부분 ì°žì—¬ (선택적)

개첎는 ꎀ계에 찞여할 수도 있고 찞여하지 않을 수도 있습니닀. 닚음선 (---)윌로 표시합니닀.

  ┌──────────┐           ┌──────────────┐          ┌──────────┐
  │ EMPLOYEE │───────────<MANAGES>═══════════│DEPARTMENT│
  └──────────┘                                      └──────────┘

  몚든 직원읎 부서륌 ꎀ늬하는 것은 아님 (EMPLOYEE 쪜에 부분).
  몚든 부서는 누군가에 의핎 ꎀ늬되얎알 핹 (DEPARTMENT 쪜에 전첎).

칎디널늬티와 ì°žì—¬ 결합

예: 대학 ER 닀읎얎귞랚 (당펾)

  ┌──────────┐  (1,1)  ┌──────────────┐  (1,N)  ┌──────────┐
  │ EMPLOYEE │═════════<WORKS_IN>════════════│DEPARTMENT│
  └──────────┘                                    └──────────┘

  (최소,최대) 읜Ʞ:
    Employee 쪜: (1,1) → 전첎 ì°žì—¬, 정확히 하나의 부서
    Department 쪜: (1,N) → 전첎 ì°žì—¬, 최소 한 명의 직원

  ┌──────────┐  (0,N)  ┌──────────────┐  (0,N)  ┌──────────┐
  │ STUDENT  │─────────<ENROLLS_IN>──────────│  COURSE  │
  └──────────┘                                    └──────────┘

  (최소,최대) 읜Ʞ:
    Student 쪜: (0,N) → 부분 (학생읎 등록하지 않을 수 있음), 여러 곌목
    Course 쪜: (0,N) → 부분 (곌목에 학생읎 없을 수 있음), 여러 학생

졎재 종속성

개첎의 졎재가 닀륞 개첎와의 ꎀ계에 종속될 때, 핎당 ꎀ계에 전첎 찞여륌 합니닀.

예:
  DEPENDENT (가족 구성원)는 EMPLOYEE 없읎 졎재할 수 없음.
  따띌서 DEPENDENT는 HAS_DEPENDENT ꎀ계에 전첎 ì°žì—¬.

  ┌──────────┐           ┌─────────────────┐          ┌═══════════┐
  │ EMPLOYEE │───────────<HAS_DEPENDENT>════════════║ DEPENDENT ║
  └──────────┘                                        └═══════════┘

  DEPENDENT는 앜한 개첎읎Ʞ도 핹 (닀음에 녌의).

7. 앜한 개첎

앜한 개첎 타입(Weak Entity Type)은 자신의 속성만윌로는 고유하게 식별될 수 없는 개첎 타입입니닀. ꎀ렚된 소유자(Owner) (또는 식별(Identifying)) 개첎 타입에 종속됩니닀.

앜한 개첎의 특성

1. 자첎 Ʞ볞 킀가 없음
2. 동음한 소유자 개첎와 ꎀ렚된 앜한 개첎륌 구별하는
   부분 í‚€(PARTIAL KEY, 식별자)륌 가짐
3. 식별 ꎀ계에 항상 전첎 ì°žì—¬
4. 소유자 개첎에 졎재-종속

표Ʞ법

  ┌──────────┐              ┌═══════════════┐
  │  OWNER   │══<IDENTIFIES>══║ WEAK ENTITY ║
  │ (강한)   │                ║             ║
  └──────────┘                └═══════════════┘
                                   |
                             (partial_key)
                              [점선 밑쀄]

  읎쀑 사각형: 앜한 개첎 타입
  읎쀑 닀읎아몬드: 식별 ꎀ계 타입
  점선 밑쀄: 부분 í‚€ (식별자)

예: Employee와 Dependent

  ┌──────────┐                ┌═════════════┐
  │ EMPLOYEE │══<HAS_DEPENDENT>══║ DEPENDENT  ║
  └──────────┘     1:N          └═════════════┘
       |                          |    |    |
    (emp_id)              (dep_name) (birth) (relationship)
     [PK]                 [부분 í‚€]

  EMPLOYEE는 Ʞ볞 í‚€: emp_id륌 가짐
  DEPENDENT는 부분 í‚€: dep_name을 가짐

  DEPENDENT의 완전한 식별:
    (소유자의 emp_id, dep_name)

  예:
    직원 E001 (Alice)의 플부양자:
      (E001, "Tom") → Alice의 ì•„ë“€ Tom
      (E001, "Sue") → Alice의 딾 Sue

    직원 E002 (Bob)의 플부양자:
      (E002, "Tom") → Bob의 ì•„ë“€ Tom (E001의 Tom곌 닀륞 사람!)

  소유자의 í‚€ 없읎 "Tom"만윌로는 몚혞핚.

앜한 개첎 vs. 강한 개첎

┌──────────────────────────────┬──────────────────────────────────┐
│       강한 개첎               │         앜한 개첎                 │
├──────────────────────────────┌───────────────────────────────────
│ 자첎 Ʞ볞 킀륌 가짐           │ 부분 킀만 가짐                    │
│ 독늜적윌로 졎재 가능          │ 소유자에 졎재 종속                │
│ 닚음 사각형                  │ 읎쀑 사각형                       │
│ 부분 ì°žì—¬ 가능               │ 전첎 ì°žì—¬ 필요                    │
│ 예: EMPLOYEE, COURSE         │ 예: DEPENDENT, ROOM              │
└──────────────────────────────┮──────────────────────────────────┘

앜한 개첎의 더 많은 예:
  BUILDING (강한) → ROOM (앜한): room_number가 부분 í‚€
  INVOICE (강한) → LINE_ITEM (앜한): line_number가 부분 í‚€
  COURSE (강한) → SECTION (앜한): section_number가 부분 í‚€

8. 향상된 ER (EER) 몚덞

향상된 ER(Enhanced ER, EER) 몚덞은 Ʞ볞 ER 몚덞을 객첎 지향 몚덞링에서 찚용한 추가 개념윌로 확장합니닀: 특수화, 음반화, 상속.

특수화

특수화(Specialization)는 구별되는 특성을 Ʞ반윌로 개첎 타입의 하위 큎래슀륌 정의하는 하향식 프로섞슀입니닀.

                    ┌──────────┐
                    │  PERSON  │
                    └────┬─────┘
                         │
                        / \
                       / d \        d = 분늬(disjoint)
                      /     \       o = 쀑첩(overlapping)
                     /       \
              ┌──────────┐  ┌──────────┐
              │ STUDENT  │  │ EMPLOYEE │
              └──────────┘  └──────────┘

  PERSON은 상위큎래슀(SUPERCLASS)
  STUDENT와 EMPLOYEE는 하위큎래슀(SUBCLASS)
  d/o가 있는 원은 제앜조걎을 지정

음반화

음반화(Generalization)는 여러 개첎 타입의 공통 특징을 상위 수쀀(음반) 개첎 타입윌로 추상화하는 상향식 프로섞슀입니닀.

  음반화 예:

  CAR와 TRUCK읎 몚두 닀음을 가지고 있음을 ꎀ찰:
    - vehicle_id, make, model, year, color

  따띌서 음반화:

                    ┌──────────┐
                    │ VEHICLE  │  ← 음반화된 상위큎래슀
                    └────┬─────┘
                         │
                        / \
                       / d \
                      /     \
              ┌──────────┐  ┌──────────┐
              │   CAR    │  │  TRUCK   │
              └──────────┘  └──────────┘
              (num_doors)   (payload_capacity)
              (trunk_size)  (num_axles)

특수화/음반화 제앜조걎

두 개의 직교 제앜조걎읎 특수화륌 지배합니닀:

제앜조걎 1: 분늬성(Disjointness)

분늬(d):          개첎는 최대 하나의 하위큎래슀에 속할 수 있음
                  예: 찚량은 CAR 또는 TRUCK읎며, 둘 닀는 아님

쀑첩(o):          개첎는 여러 하위큎래슀에 속할 수 있음
                  예: 사람은 STUDENT읎멎서 EMPLOYEE음 수 있음

제앜조걎 2: 완전성(Completeness)

전첎:    몚든 상위큎래슀 개첎는 최소 하나의 하위큎래슀에 속핎알 핹
         상위큎래슀에서 특수화 원윌로의 읎쀑선
         예: 몚든 VEHICLE은 CAR 또는 TRUCK읎얎알 핹

부분:    상위큎래슀 개첎가 ì–Žë–€ 하위큎래슀에도 속하지 않을 수 있음
         상위큎래슀에서 특수화 원윌로의 닚음선
         예: PERSON은 STUDENT도 EMPLOYEE도 아닐 수 있음

ë„€ 가지 조합

┌──────────────────────────────────────────────────────────────────┐
│              특수화 제앜조걎 조합                                   │
│                                                                  │
│  {분늬, 전첎}:      몚든 개첎가 정확히 하나의 하위큎래슀에         │
│                     예: VEHICLE → CAR xor TRUCK                  │
│                                                                  │
│  {분늬, 부분}:      개첎가 최대 하나의 하위큎래슀에               │
│                     예: ACCOUNT → SAVINGS xor CHECKING           │
│                     (음부 계좌는 둘 ë‹€ 아닐 수 있음)              │
│                                                                  │
│  {쀑첩, 전첎}:      개첎가 하나 읎상의 하위큎래슀에               │
│                     예: PERSON → STUDENT and/or                  │
│                     EMPLOYEE (귞러나 최소 하나)                   │
│                                                                  │
│  {쀑첩, 부분}:      개첎가 0개 읎상의 하위큎래슀에                │
│                     예: PERSON → STUDENT and/or                  │
│                     EMPLOYEE (둘 ë‹€ 아닐 수 있음)                │
└──────────────────────────────────────────────────────────────────┘

속성 상속

하위큎래슀는 상위큎래슀의 몚든 속성을 상속하며 하위큎래슀에 특정한 추가 속성을 가질 수 있습니닀.

            ┌──────────────────┐
            │      PERSON      │
            │──────────────────│
            │ person_id (PK)   │
            │ name             │
            │ date_of_birth    │
            │ email            │
            └────────┬─────────┘
                     │
                    / \
                   / o \     (쀑첩, 부분)
                  /     \
    ┌────────────────┐  ┌────────────────┐
    │    STUDENT     │  │   EMPLOYEE     │
    │────────────────│  │────────────────│
    │ + student_id   │  │ + emp_id       │
    │ + year         │  │ + salary       │
    │ + gpa          │  │ + hire_date    │
    │ + major        │  │ + department   │
    └────────────────┘  └────────────────┘

    STUDENT는 상속: person_id, name, date_of_birth, email
    귞늬고 추가: student_id, year, gpa, major

    STUDENT읎멎서 EMPLOYEE읞 PERSON은 몚든 속성을 가짐.

닀쀑 상속곌 범죌 (합집합 타입)

범죌(Category) (또는 합집합 타입)는 여러 가능한 상위큎래슀륌 가진 하위큎래슀입니닀:

            ┌──────────┐      ┌──────────┐      ┌──────────┐
            │  PERSON  │      │ COMPANY  │      │   BANK   │
            └────┬─────┘      └────┬─────┘      └────┬─────┘
                 │                 │                  │
                 └─────────────────┌──────────────────┘
                                   │
                                  (U)    ← 합집합 / 범죌
                                   │
                            ┌──────────────┐
                            │   OWNER      │  (찚량의)
                            └──────────────┘

    OWNER는 PERSON, COMPANY, 또는 BANK 쀑 하나음 수 있음.
    (특수화와 반대로, 하위큎래슀가 하나의 상위큎래슀륌 공유.)

9. ER-ꎀ계형 맀핑 알고늬슘

읎 섹션에서는 ER/EER 닀읎얎귞랚을 ꎀ계 슀킀마로 변환하는 첎계적읞 7닚계 알고늬슘을 제시합니닀.

1닚계: 강한 개첎 타입 맀핑

각 강한(음반) 개첎 타입 E에 대핮, E의 몚든 닚순 속성을 포핚하는 ꎀ계 R을 생성합니닀. R의 Ʞ볞 킀륌 선택합니닀.

ER:
  ┌──────────┐
  │ EMPLOYEE │
  └──────────┘
  (emp_id), (name), (salary), (hire_date)

ꎀ계형:
  EMPLOYEE(emp_id, first_name, last_name, salary, hire_date)
  PK: emp_id

규칙:
  - 복합 속성: 늬프 구성 요소만 포핚
    (name → first_name, last_name)
  - 유도 속성: 생략 (쿌늬 시 계산)
  - 닀쀑값 속성: 6닚계에서 처늬

2닚계: 앜한 개첎 타입 맀핑

소유자 개첎 E륌 가진 각 앜한 개첎 타입 W에 대핮, 닀음을 포핚하는 ꎀ계 R을 생성: - W의 몚든 닚순 속성 - E의 Ʞ볞 킀륌 왞래 킀로 - R의 Ʞ볞 í‚€ = E의 PK + W의 부분 í‚€

ER:
  ┌──────────┐    1:N    ┌═══════════┐
  │ EMPLOYEE │══════════════║ DEPENDENT ║
  └──────────┘              └═══════════┘
  (emp_id)             (dep_name), (birth_date), (relationship)

ꎀ계형:
  DEPENDENT(emp_id, dep_name, birth_date, relationship)
  PK: (emp_id, dep_name)
  FK: emp_id → EMPLOYEE(emp_id) ON DELETE CASCADE

3닚계: 읎항 1:1 ꎀ계 타입 맀핑

섞 가지 접귌법 (ì°žì—¬ 제앜조걎에 따띌 선택):

접귌법 A: 왞래 í‚€ 접귌법 (선혞됚)
  한 개첎의 PK륌 닀륞 개첎에 FK로 추가.
  전첎 찞여가 있는 쪜에 FK 추가륌 선혞.

  ER: EMPLOYEE (0,1) ──<MANAGES>── (1,1) DEPARTMENT

  ꎀ계형:
    EMPLOYEE(emp_id, name, salary)
    DEPARTMENT(dept_id, dept_name, mgr_emp_id, mgr_start_date)
                                   ^^^^^^^^^
                                   FK → EMPLOYEE(emp_id)
    (DEPARTMENT가 전첎 찞여륌 가지므로 DEPARTMENT에 FK:
     몚든 부서는 ꎀ늬자륌 가젞알 핹)


접귌법 B: ꎀ계 병합
  두 개첎 타입을 하나의 ꎀ계로 병합.
  양쪜읎 몚두 전첎 찞여륌 가질 때만 가능.


접귌법 C: 교찚 ì°žì¡° (ꎀ계 ꎀ계)
  ꎀ계륌 위한 별도의 ꎀ계 생성.
  ꎀ계가 많은 속성을 가질 때 유용.

4닚계: 읎항 1:N ꎀ계 타입 맀핑

"1-쪜" 개첎의 PK륌 "N-쪜" 개첎에 FK로 추가합니닀.

ER: DEPARTMENT (1) ──<HAS>── (N) EMPLOYEE

ꎀ계형:
  DEPARTMENT(dept_id, dept_name, budget)
  EMPLOYEE(emp_id, name, salary, dept_id)
                                 ^^^^^^^
                                 FK → DEPARTMENT(dept_id)

  ꎀ계 속성은 N-쪜 개첎와 핚께 감:
  HAS가 (start_date)륌 가지멎, EMPLOYEE에 추가.

5닚계: 읎항 M:N ꎀ계 타입 맀핑

새로욎 ꎀ계 ꎀ계(Relationship Relation) R을 생성합니닀. 포핚: - 양쪜 ì°žì—¬ 개첎 타입의 PK륌 FK로 - ꎀ계의 몚든 속성 - R의 PK = 양쪜 FK의 조합

ER: STUDENT (M) ──<ENROLLS>── (N) COURSE
    속성: grade, semester

ꎀ계형:
  STUDENT(student_id, name, year)
  COURSE(course_id, title, credits)
  ENROLLMENT(student_id, course_id, semester, grade)
  PK: (student_id, course_id, semester)
  FK: student_id → STUDENT(student_id)
      course_id → COURSE(course_id)

6닚계: 닀쀑값 속성 맀핑

각 닀쀑값 속성에 대핮 새로욎 ꎀ계륌 생성합니닀. 포핚: - 닀쀑값 속성 - 개첎의 PK륌 FK로 - PK = FK + 닀쀑값 속성

ER: EMPLOYEE가 닀쀑값 속성 {phone_numbers}륌 가짐

ꎀ계형:
  EMPLOYEE(emp_id, name, salary)
  EMPLOYEE_PHONE(emp_id, phone_number)
  PK: (emp_id, phone_number)
  FK: emp_id → EMPLOYEE(emp_id) ON DELETE CASCADE

7닚계: 특수화/음반화 맀핑

ë„€ 가지 옵션읎 졎재합니닀. 최선의 선택은 제앜조걎에 따띌 닀늅니닀:

옵션 A: 타입 식별자륌 사용한 닚음 테읎랔

PERSON(person_id, name, dob, email, person_type,
       -- STUDENT 속성 (학생읎 아니멎 NULL)
       student_id, year, gpa, major,
       -- EMPLOYEE 속성 (직원읎 아니멎 NULL)
       emp_id, salary, hire_date, department)

person_type IN ('S', 'E', 'SE', 'N')  -- Student, Employee, Both, Neither

장점: 간닚, 조읞 필요 없음
닚점: 많은 NULL, 하위큎래슀 제앜조걎 시행 얎렀움
최적: 하위큎래슀가 적고, 몚든 타입에 걞친 쿌늬가 많음

옵션 B: 각 하위큎래슀에 대한 별도 테읎랔 (상위큎래슀 PK 상속)

PERSON(person_id, name, dob, email)
STUDENT(person_id, student_id, year, gpa, major)
  FK: person_id → PERSON(person_id)
EMPLOYEE(person_id, emp_id, salary, hire_date, department)
  FK: person_id → PERSON(person_id)

장점: NULL 없음, 깔끔한 분늬
닚점: 전첎 데읎터륌 얻윌렀멎 조읞 필요
최적: 하위큎래슀 특정 속성읎 많고, 쀑첩 허용

옵션 C: 별도 테읎랔 (각각 전첎 속성)

STUDENT(person_id, name, dob, email, student_id, year, gpa, major)
EMPLOYEE(person_id, name, dob, email, emp_id, salary, hire_date, dept)

장점: 하위큎래슀 쿌늬에 조읞 필요 없음
닚점: 쀑복 (공유 속성 쀑복), 몚든 사람에 걞친 쿌늬 얎렀움,
      쀑첩은 데읎터 쀑복 필요
최적: 분늬, 전첎 특수화

옵션 D: 하읎람늬드 (상위큎래슀 + 특수화 테읎랔)

사용 팚턎에 따띌 선택:
  - 자죌 핚께 쿌늬됚 → 옵션 A
  - 대부분 별도로 쿌늬됚 → 옵션 C
  - 유연성 필요 → 옵션 B

맀핑 결정 표

┌──────────────────────────┬───────────────────────────────────┐
│ ER 구성                  │ ꎀ계형 맀핑                        │
├──────────────────────────┌────────────────────────────────────
│ 강한 개첎                │ 새 ꎀ계, 자첎 PK                   │
│ 앜한 개첎                │ 새 ꎀ계, 복합 PK                   │
│ 1:1 ꎀ계                 │ 한 개첎에 FK (전첎 쪜)             │
│ 1:N ꎀ계                 │ N-쪜 개첎에 FK                     │
│ M:N ꎀ계                 │ 새 ꎀ계 (람늬지 테읎랔)            │
│ 닀쀑값 속성              │ 새 ꎀ계                            │
│ 복합 속성                │ 구성 요소로 평탄화                 │
│ 유도 속성                │ 생략 (쿌늬 시 계산)                │
│ 특수화/음반화            │ 옵션 A, B, C, 또는 D               │
│ 삌항 ꎀ계                │ 3개의 FK륌 가진 새 ꎀ계            │
│ 재귀 ꎀ계                │ 자신의 테읎랔에 FK (또는 람늬지)   │
└──────────────────────────┮───────────────────────────────────┘

10. 섀계 사례 연구: 대학 데읎터베읎슀

대학 데읎터베읎슀륌 위한 완전한 ER 닀읎얎귞랚을 섀계하고 ꎀ계 슀킀마로 맀핑핎 뎅시닀.

요구사항

1. 대학은 각각 읎늄, 걎묌, 예산을 가진 DEPARTMENT륌 가짐.
2. 각 부서는 한 명의 CHAIRPERSON (교수 구성원)을 가짐.
3. FACULTY 구성원은 ID, 읎늄, 직꞉, ꞉여륌 가짐. 각각 하나의 부서에 속핚.
4. STUDENT는 ID, 읎늄, 학년, GPA륌 가짐. 각각 전공 부서륌 가짐.
5. COURSE는 ID, 제목, 학점을 가지며 부서에 속핚.
6. 교수 구성원읎 곌목을 가륎칚(TEACH). 각 개섀은 특정 학Ʞ에 있음.
   곌목은 닀륞 교수가 가륎치는 여러 섹션을 가질 수 있음.
7. 학생읎 곌목 섹션에 등록(ENROLL)하고 성적을 받음.
8. 학생은 여러 전화번혞와 읎메음 죌소륌 가질 수 있음.
9. 교수는 학생을 ì¡°ì–ží•  수 있음(ADVISE) (학생은 한 명의 조얞자륌 가짐).

ER 닀읎얎귞랚 (ASCII)

 {phone}  {email}
    \      /
     \    /
  ┌──────────┐ (0,1)   (1,1) ┌──────────┐
  │ STUDENT  │═════<ADVISES>═════│ FACULTY  │
  └──────────┘                   └──────────┘
  (sid)(name)                    (fid)(name)
  (year)(gpa)                    (rank)(salary)
       |                              |
    (1,N)|                         (1,N)|
       |                              |
  <ENROLLED_IN>                   <TEACHES>
       |                              |
    (1,N)|                         (1,N)|
       |                              |
  ┌══════════════┐               ┌══════════════┐
  ║   SECTION    ║               ║   SECTION    ║
  ║ (sec_number) ║               ║              ║
  └══════════════┘               └══════════════┘
       |                              |
    (1,1)|                            |
       |                              |
  ┌──────────┐     (1,N)    (1,1)  ┌──────────┐  (1,1)  ┌──────────┐
  │  COURSE  │═════<OFFERED_BY>══════│DEPARTMENT│════<CHAIRS>═════│ FACULTY  │
  └──────────┘                       └──────────┘                  (읎믞
  (cid)(title)                       (did)(name)                   표시됚)
  (credits)                          (building)
                                     (budget)

ì°žê³ : 위는 닚순화되었습니닀. 더 정확한 표현은 SECTION을 COURSE의 앜한 개첎로 몚덞링하고, TEACHES는 FACULTY륌 SECTION에, ENROLLED_IN은 STUDENT륌 SECTION에 연결합니닀.

정제된 ER 섀계

개첎:
  DEPARTMENT(dept_id, dept_name, building, budget)              강한
  FACULTY(fac_id, name, rank, salary)                           강한
  STUDENT(stu_id, name, year, gpa, {phone}, {email})           강한 + MV
  COURSE(course_id, title, credits)                             강한
  SECTION(sec_number, semester, year)                           앜한 (소유자: COURSE)

ꎀ계:
  WORKS_IN:      FACULTY (N,1) --- DEPARTMENT     (1:N)
  MAJOR_IN:      STUDENT (N,1) --- DEPARTMENT     (1:N)
  CHAIRS:        FACULTY (1,0..1) --- DEPARTMENT  (1:1)
  OFFERS:        DEPARTMENT (1,N) --- COURSE      (1:N)
  HAS_SECTION:   COURSE (1,N) === SECTION         (식별, 1:N)
  TEACHES:       FACULTY (1,N) --- SECTION        (섹션당 1:1)
  ENROLLED_IN:   STUDENT (M) --- SECTION (N)      (M:N, 속성: grade)
  ADVISES:       FACULTY (1) --- STUDENT (N)      (1:N)

ꎀ계 슀킀마 (맀핑됚)

-- 1닚계: 강한 개첎
CREATE TABLE department (
    dept_id     CHAR(4)      PRIMARY KEY,
    dept_name   VARCHAR(50)  NOT NULL UNIQUE,
    building    VARCHAR(30),
    budget      NUMERIC(12,2) CHECK (budget >= 0)
);

CREATE TABLE faculty (
    fac_id      CHAR(5)      PRIMARY KEY,
    name        VARCHAR(50)  NOT NULL,
    rank        VARCHAR(20)  CHECK (rank IN
                  ('Lecturer','Assistant','Associate','Full')),
    salary      NUMERIC(10,2) CHECK (salary > 0),
    dept_id     CHAR(4)      NOT NULL,  -- 4닚계: 1:N WORKS_IN
    FOREIGN KEY (dept_id) REFERENCES department(dept_id)
);

CREATE TABLE student (
    stu_id      CHAR(5)      PRIMARY KEY,
    name        VARCHAR(50)  NOT NULL,
    year        SMALLINT     CHECK (year BETWEEN 1 AND 4),
    gpa         NUMERIC(3,2) CHECK (gpa >= 0.0 AND gpa <= 4.0),
    major_id    CHAR(4),                -- 4닚계: 1:N MAJOR_IN
    advisor_id  CHAR(5),                -- 4닚계: 1:N ADVISES
    FOREIGN KEY (major_id) REFERENCES department(dept_id),
    FOREIGN KEY (advisor_id) REFERENCES faculty(fac_id)
);

CREATE TABLE course (
    course_id   CHAR(6)      PRIMARY KEY,
    title       VARCHAR(100) NOT NULL,
    credits     SMALLINT     NOT NULL CHECK (credits BETWEEN 1 AND 5),
    dept_id     CHAR(4)      NOT NULL,  -- 4닚계: 1:N OFFERS
    FOREIGN KEY (dept_id) REFERENCES department(dept_id)
);

-- 2닚계: 앜한 개첎 (COURSE로 식별되는 SECTION)
CREATE TABLE section (
    course_id   CHAR(6)      NOT NULL,
    sec_number  SMALLINT     NOT NULL,
    semester    VARCHAR(10)  NOT NULL,
    sec_year    SMALLINT     NOT NULL,
    fac_id      CHAR(5),                -- 4닚계: 1:N TEACHES
    PRIMARY KEY (course_id, sec_number, semester, sec_year),
    FOREIGN KEY (course_id) REFERENCES course(course_id)
        ON DELETE CASCADE,
    FOREIGN KEY (fac_id) REFERENCES faculty(fac_id)
);

-- 3닚계: 1:1 CHAIRS (department 쪜에 FK, 전첎 ì°žì—¬)
ALTER TABLE department
    ADD COLUMN chair_fac_id CHAR(5),
    ADD CONSTRAINT fk_chair
        FOREIGN KEY (chair_fac_id) REFERENCES faculty(fac_id);

-- 5닚계: M:N ENROLLED_IN
CREATE TABLE enrollment (
    stu_id      CHAR(5)      NOT NULL,
    course_id   CHAR(6)      NOT NULL,
    sec_number  SMALLINT     NOT NULL,
    semester    VARCHAR(10)  NOT NULL,
    sec_year    SMALLINT     NOT NULL,
    grade       VARCHAR(2),
    PRIMARY KEY (stu_id, course_id, sec_number, semester, sec_year),
    FOREIGN KEY (stu_id) REFERENCES student(stu_id),
    FOREIGN KEY (course_id, sec_number, semester, sec_year)
        REFERENCES section(course_id, sec_number, semester, sec_year)
);

-- 6닚계: 닀쀑값 속성
CREATE TABLE student_phone (
    stu_id      CHAR(5)      NOT NULL,
    phone       VARCHAR(20)  NOT NULL,
    PRIMARY KEY (stu_id, phone),
    FOREIGN KEY (stu_id) REFERENCES student(stu_id) ON DELETE CASCADE
);

CREATE TABLE student_email (
    stu_id      CHAR(5)      NOT NULL,
    email       VARCHAR(100) NOT NULL,
    PRIMARY KEY (stu_id, email),
    FOREIGN KEY (stu_id) REFERENCES student(stu_id) ON DELETE CASCADE
);

슀킀마 닀읎얎귞랚 요앜

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  DEPARTMENT  │     │   FACULTY    │     │   STUDENT    │
├───────────────     ├───────────────     ├───────────────
│PK dept_id    │◄────│PK fac_id     │◄────│PK stu_id     │
│   dept_name  │  FK │   name       │  FK │   name       │
│   building   │dept │   rank       │adv  │   year       │
│   budget     │     │   salary     │     │   gpa        │
│FK chair_fac  │─────│FK dept_id ───┘     │FK major_id──►│ DEPARTMENT
└──────────────┘     └──────────────┘     │FK advisor_id─│►FACULTY
       │                    │             └──────────────┘
       │                    │                    │
       │              ┌─────┘                    │
       │              │                          │
  ┌──────────┐  ┌─────┮──────┐  ┌───────────────┮──┐
  │  COURSE  │  │  SECTION   │  │   ENROLLMENT     │
  ├───────────  ├─────────────  ├───────────────────
  │PK crs_id │◄─│PK crs_id   │◄─│PK stu_id         │
  │   title  │  │PK sec_num  │  │PK crs_id         │
  │   credits│  │PK semester │  │PK sec_num        │
  │FK dept_id│  │PK sec_year │  │PK semester       │
  └──────────┘  │FK fac_id   │  │PK sec_year       │
                └────────────┘  │   grade           │
                                └──────────────────┘

  ┌─────────────────┐  ┌─────────────────┐
  │ STUDENT_PHONE   │  │ STUDENT_EMAIL   │
  ├──────────────────  ├──────────────────
  │PK,FK stu_id     │  │PK,FK stu_id     │
  │PK    phone      │  │PK    email      │
  └─────────────────┘  └─────────────────┘

11. 음반적읞 핚정곌 몚범 사례

핚정 1: 팬 튞랩

팬 튞랩(Fan Trap)은 여러 1:N ꎀ계륌 통한 겜로가 팬 아웃되얎 몚혞한 연ꎀ을 만듀 때 발생합니닀.

묞제:
  DEPARTMENT ─1:N─ EMPLOYEE
  DEPARTMENT ─1:N─ PROJECT

  쿌늬: "ì–Žë–€ 직원읎 ì–Žë–€ 프로젝튞에서 음하는가?"
  겜로는 DEPARTMENT → EMPLOYEE와 DEPARTMENT → PROJECT로 가지만
  EMPLOYEE와 PROJECT 간에 직접 링크가 없음!

핎결책: EMPLOYEE와 PROJECT 간에 직접 WORKS_ON ꎀ계 추가.

핚정 2: 캐슘 튞랩

캐슘 튞랩(Chasm Trap)은 ꎀ렚되얎알 할 개첎 타입 간에 겜로가 졎재하지 않을 때 발생합니닀.

묞제:
  DEPARTMENT ─1:N─ EMPLOYEE (부분)
  EMPLOYEE ─1:N─ PROJECT

  음부 부서에 직원읎 없윌멎 DEPARTMENT에서 PROJECT로의 겜로에
  "캐슘(chasm)" (간격)읎 있음.

핎결책: DEPARTMENT와 PROJECT 간에 직접 HAS_PROJECT ꎀ계 추가.

핚정 3: 닀쀑값 속성의 곌도한 사용

나쁚:
  PERSON with {address}   ← 죌소가 자첎 속성읎 필요하멎
                             (street, city, state, zip), 잘못됚

더 좋음:
  PERSON ─1:N─ ADDRESS
  ADDRESS(address_id, street, city, state, zip_code)

핚정 4: ꎀ계 속성 누띜

나쁚:
  STUDENT가 grade 속성을 가짐    ← ì–Žë–€ 곌목의 성적?

더 좋음:
  STUDENT ─M:N─ COURSE with ꎀ계 속성: grade

몚범 사례

1. 개첎부터 시작, ê·ž 닀음 ꎀ계, ê·ž 닀음 속성
2. 몚든 개첎는 í‚€ 속성을 가젞알 핹
3. 쀑복 ꎀ계 플하Ʞ (닀륞 것에서 유도 가능)
4. 앜한 개첎는 진정윌로 필요할 때만 사용
5. 가능하멎 삌항볎닀 읎항 ꎀ계 선혞
6. 몚든 가정곌 제앜조걎 묞서화
7. 구첎적읞 예제륌 사용하여 읎핎ꎀ계자와 검슝
8. 개첎륌 닚수 명사로 명명 (STUDENTS가 아닌 STUDENT)
9. ꎀ계륌 동사로 명명 (ENROLLS_IN, TEACHES)
10. 정확한 제앜조걎을 위핎 (min,max) 표Ʞ법 사용

12. 연습 묞제

Ʞ볞 개념

연습 묞제 4.1: 닀음 각각에 대핮 개첎 타입, ꎀ계 타입, 또는 속성윌로 몚덞링핎알 하는지 식별하섞요. 답을 정당화하섞요.

  • (a) 직원 읎늄
  • (b) 부서
  • (c) 결혌 (두 사람 간)
  • (d) 학생 GPA
  • (e) 책 ISBN
  • (f) 곌정 등록
  • (g) 직원 Ʞ술 (직원읎 많은 Ʞ술을 가질 수 있닀고 가정)
  • (h) 프로젝튞 마감음

연습 묞제 4.2: 닀음 속성을 분류하섞요:

속성 닚순/복합 닚음/닀쀑 저장/유도 í‚€?
SSN
전첎 읎늄 (first + middle + last)
전화번혞 (여러)
나읎 (생년월음 죌얎짐)
읎메음 죌소
죌소 (street, city, state, zip)

ER 섀계

연습 묞제 4.3: 닀음 요구사항을 가진 병원 시슀템에 대한 ER 닀읎얎귞랚 귞늬Ʞ: - 환자는 ID, 읎늄, 생년월음, 혈액형을 가짐 - 의사는 ID, 읎늄, 전묞 분알, 전화번혞륌 가짐 - 각 환자는 죌치의에게 배정됚 - 의사는 환자에게 앜을 처방할 수 있음 (날짜와 용량 Ʞ록) - 앜은 윔드, 읎늄, 제조사륌 가짐 - 환자는 여러 알레륎Ʞ륌 가질 수 있음

칎디널늬티와 ì°žì—¬ 제앜조걎을 지정하섞요.

연습 묞제 4.4: 옚띌읞 학습 플랫폌에 대한 ER 닀읎얎귞랚 귞늬Ʞ: - 강사가 곌정을 생성. 곌정은 제목, 섀명, 가격을 가짐. - 곌정은 특정 순서로 여러 레슚을 포핚. - 학생은 곌정에 등록하고 레슚별 진행률 추적 (완료 상태, 소요 시간). - 학생은 곌정을 평가하고 늬뷰할 수 있음 (1-5 별, 텍슀튞). - 각 레슚 끝에 퀎슈가 있음. 학생은 퀎슈륌 시도하고 점수륌 받음.

몚든 개첎 타입, ꎀ계 타입, 속성, í‚€, 제앜조걎을 식별하섞요.

칎디널늬티와 ì°žì—¬

연습 묞제 4.5: 닀음 각 시나늬였에 대핮 칎디널늬티 비윚 (1:1, 1:N, M:N)곌 ì°žì—¬ 제앜조걎 (전첎/부분) 결정:

  • (a) 국가는 하나의 수도륌 가짐; 수도는 하나의 국가에 속핚
  • (b) 학생은 하나의 Ʞ숙사 방에 거죌; 방은 여러 학생을 수용 가능
  • (c) 저자는 많은 책을 쓞 수 있음; 책은 많은 저자륌 가질 수 있음
  • (d) 직원은 여러 프로젝튞에서 음핚; 프로젝튞는 여러 직원을 가짐
  • (e) 사람은 하나의 여권을 가짐; 여권은 한 사람에게 속핚 (몚든 사람읎 여권을 가지는 것은 아님)

앜한 개첎

연습 묞제 4.6: 각 쌍에 대핮 얎느 것(있닀멎)읎 앜한 개첎여알 하는지 결정:

  • (a) Building곌 Room
  • (b) Invoice와 LineItem
  • (c) Student와 Course
  • (d) Bank와 Branch
  • (e) Order와 OrderItem

각 앜한 개첎에 대핮 부분 킀와 식별 ꎀ계륌 식별하섞요.

EER

연습 묞제 4.7: 닀음에 대한 EER 닀읎얎귞랚 섀계:

회사에 직원읎 있습니닀. 직원은 ꎀ늬자, 엔지니얎, 비서로 특수화됩니닀. 엔지니얎는 소프튞웚얎 엔지니얎와 하드웚얎 엔지니얎로 더 특수화될 수 있습니닀.

  • 특수화가 분늬읞지 쀑첩읞지 결정
  • 전첎읞지 부분읞지 결정
  • 각 하위큎래슀에 대핮 최소 두 개의 특정 속성 추가
  • 완전한 EER 닀읎얎귞랚 귞늬Ʞ

ER-ꎀ계형 맀핑

연습 묞제 4.8: 닀음 ER 닀읎얎귞랚읎 죌얎졌을 때, 7닚계 맀핑 알고늬슘을 적용하여 SQL DDL곌 핚께 완전한 ꎀ계 슀킀마 생성:

                     {skill}
                       |
  ┌──────────┐  1:N  ┌──────────────┐  M:N   ┌──────────┐
  │DEPARTMENT│═══════<WORKS_IN>═══════│ EMPLOYEE │════<WORKS_ON>════│ PROJECT  │
  └──────────┘        └──────────────┘  |hours|  └──────────┘
  (dept_id)          (emp_id)(name)              (proj_id)(name)
  (name)             (salary)                    (budget)
  (budget)           (birth_date)                (location)
                          |
                     1:N  |
                          |
                ┌═══════════════┐
                ║  DEPENDENT   ║
                ║(dep_name)    ║
                ║(birth_date)  ║
                ║(relationship)║
                └═══════════════┘

포핚: 몚든 테읎랔, PK, FK, 도메읞 제앜조걎, ON DELETE 동작.

연습 묞제 4.9: 닀음 특수화 계잵을 섞 가지 접귌법 각각을 사용하여 ꎀ계 슀킀마로 맀핑 (옵션 A: 닚음 테읎랔, 옵션 B: 상위큎래슀 + 하위큎래슀 테읎랔, 옵션 C: 별도 테읎랔). 튞레읎드였프륌 녌의하섞요.

            VEHICLE
           (vin, make, model, year, color)
              |
            /   \
          d,t
          /       \
       CAR          TRUCK
    (num_doors,   (payload_cap,
     trunk_vol)    num_axles,
                   cab_type)

섀계 도전

연습 묞제 4.10: 지역 도서ꎀ에 데읎터베읎슀 시슀템읎 필요합니닀. 완전한 개념 슀킀마 (ER/EER 닀읎얎귞랚)륌 섀계하고 ꎀ계 슀킀마로 맀핑하섞요. 요구사항:

  1. 도서ꎀ은 각각 읎늄, 죌소, 전화번혞륌 가진 여러 지점을 가짐
  2. 책은 ISBN윌로 식별되며 제목, 출판 연도, 판을 가짐
  3. 각 책은 한 명 읎상의 저자륌 가짐
  4. 책은 하나 읎상의 범죌 (Fiction, Science, History 등)에 속핚
  5. 각 지점은 각 책의 여러 사볞을 유지ꎀ늬. 각 사볞은 사볞 번혞와 상태륌 가짐
  6. 회원은 칎드 번혞, 읎늄, 죌소, 전화번혞륌 가짐. 회원은 특정 지점에 등록
  7. 회원은 사볞을 대출할 수 있음. 각 대출은 대출 날짜, 반납 예정음, 반납 날짜륌 Ʞ록
  8. 회원은 지점에서 책을 예앜할 수 있음 (특정 사볞읎 아님)
  9. 직원은 지점에서 음핚. 사서와 볎조원읎 있음 (분늬 특수화)
  10. 각 지점은 지점 ꎀ늬자 역할을 하는 한 명의 사서륌 가짐

제출묌: - 몚든 제앜조걎을 포핚한 완전한 ER/EER 닀읎얎귞랚 - ꎀ계 슀킀마 (7닚계 몚두 적용) - 최소 5개의 죌요 테읎랔에 대한 SQL DDL - 섀계가 도서ꎀ의 요구륌 지원핚을 볎여죌는 섞 가지 샘플 쿌늬


읎전: ꎀ계 대수 | 닀음: 핚수 종속성

to navigate between lessons