Lesson 06: μ •κ·œν™” (1NF ~ BCNF)

Lesson 06: μ •κ·œν™” (1NF ~ BCNF)

이전: 05_Functional_Dependencies.md | λ‹€μŒ: 07_Advanced_Normalization.md


주제: λ°μ΄ν„°λ² μ΄μŠ€ 이둠(Database Theory) 레슨: 16개 쀑 6번째 μ„ μˆ˜ 지식: ν•¨μˆ˜ 쒅속성, 속성 폐쇄, μ΅œμ†Œ 컀버 (Lesson 05) λͺ©ν‘œ: 1NFλΆ€ν„° BCNFκΉŒμ§€μ˜ μ •κ·œν™” 이해, λΆ„ν•΄ μ•Œκ³ λ¦¬μ¦˜ λ§ˆμŠ€ν„°, 무손싀 쑰인과 쒅속성 보쑴 속성 검증, μ‹€μ œ μŠ€ν‚€λ§ˆμ— μ •κ·œν™” 적용

1. μ†Œκ°œ(Introduction)

μ •κ·œν™”(Normalization)λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό 쀑볡을 쀄이고 νŠΉμ • μœ ν˜•μ˜ 데이터 이상 ν˜„μƒμ„ μ œκ±°ν•˜κΈ° μœ„ν•΄ μ‘°μ§ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. Edgar F. Coddκ°€ 1970년에 λ„μž…ν•œ 이 방법은 μŠ€ν‚€λ§ˆ 섀계에 λŒ€ν•œ 체계적이고 이둠 기반의 μ ‘κ·Ό 방식을 μ œκ³΅ν•©λ‹ˆλ‹€.

1.1 문제: 잘λͺ»λœ μŠ€ν‚€λ§ˆ 섀계

λŒ€ν•™μ„ μœ„ν•œ 단일 λ¦΄λ ˆμ΄μ…˜ 섀계λ₯Ό κ³ λ €ν•΄λ³΄μ„Έμš”:

UniversityCourse(
    student_id, student_name, student_addr,
    course_id, course_title, dept_name, dept_building,
    instructor_id, instructor_name,
    grade, semester
)

이 "λ²”μš© λ¦΄λ ˆμ΄μ…˜"은 λͺ¨λ“  것을 ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ— μ €μž₯ν•©λ‹ˆλ‹€. κ°„λ‹¨ν•œ μΏΌλ¦¬μ—λŠ” μž‘λ™ν•˜μ§€λ§Œ μ‹¬κ°ν•œ 문제λ₯Ό κ²ͺμŠ΅λ‹ˆλ‹€.

1.2 데이터 이상 ν˜„μƒ(Data Anomalies)

κ°±μ‹  이상(Update Anomaly)

컴퓨터 κ³Όν•™λΆ€κ°€ μƒˆ 건물둜 μ΄μ‚¬ν•˜λ©΄, dept_name = 'Computer Science'인 λͺ¨λ“  ν–‰μ—μ„œ dept_building을 μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€. 단 ν•˜λ‚˜μ˜ 행이라도 λ†“μΉ˜λ©΄ 데이터가 λΆˆμΌμΉ˜ν•΄μ§‘λ‹ˆλ‹€.

λ³€κ²½ μ „:
| course_id | dept_name | dept_building |
|-----------|-----------|---------------|
| CS101     | CS        | Watson Hall   |
| CS201     | CS        | Watson Hall   |    ← λͺ¨λ“  행을 μ—…λ°μ΄νŠΈν•΄μ•Ό 함
| CS301     | CS        | Watson Hall   |

첫 번째 ν–‰λ§Œ μ—…λ°μ΄νŠΈν•˜λ©΄:
| CS101     | CS        | Taylor Hall   |    ← μ—…λ°μ΄νŠΈλ¨
| CS201     | CS        | Watson Hall   |    ← 뢈일치!
| CS301     | CS        | Watson Hall   |    ← 뢈일치!

μ‚½μž… 이상(Insertion Anomaly)

학생이 κ·Έ λΆ€μ„œμ˜ κ³Όλͺ© 쀑 ν•˜λ‚˜μ— λ“±λ‘ν•˜μ§€ μ•ŠλŠ” ν•œ, μƒˆ λΆ€μ„œ(예: 이름과 건물)λ₯Ό 기둝할 수 μ—†μŠ΅λ‹ˆλ‹€. student_idκ°€ κΈ°λ³Έ ν‚€μ˜ 일뢀이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ‚­μ œ 이상(Deletion Anomaly)

κ³Όλͺ©μ— λ“±λ‘ν•œ λ§ˆμ§€λ§‰ 학생이 νƒˆν‡΄ν•˜λ©΄, 등둝 λ°μ΄ν„°λΏλ§Œ μ•„λ‹ˆλΌ κ³Όλͺ© 제λͺ©, 강사 λ°°μ •, λΆ€μ„œ 정보도 μžƒκ²Œ λ©λ‹ˆλ‹€.

1.3 κ·Όλ³Έ 원인: FD μœ„λ°˜μœΌλ‘œ μΈν•œ 쀑볡

μ„Έ κ°€μ§€ 이상 ν˜„μƒμ€ λͺ¨λ‘ λ™μΌν•œ κ·Όλ³Έ μ›μΈμ—μ„œ λΉ„λ‘―λ©λ‹ˆλ‹€: ν‚€μ˜ μΌλΆ€μ—λ§Œ μ˜μ‘΄ν•˜κ±°λ‚˜ λΉ„ν‚€ 속성에 μ˜μ‘΄ν•˜λŠ” 속성이 μ€‘λ³΅λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€. μ •κ·œν™”λŠ” ν•¨μˆ˜ 쒅속성에 μ˜ν•΄ μ•ˆλ‚΄λ˜λŠ” 체계적인 λΆ„ν•΄λ₯Ό 톡해 μ΄λŸ¬ν•œ 쀑볡을 μ œκ±°ν•©λ‹ˆλ‹€.

1.4 μ •κ·œν™”μ˜ λͺ©ν‘œ

  1. 쀑볡 제거: 각 사싀은 μ •ν™•νžˆ ν•œ 번만 μ €μž₯λ©λ‹ˆλ‹€
  2. 이상 λ°©μ§€: μ—…λ°μ΄νŠΈ, μ‚½μž…, μ‚­μ œκ°€ κΉ”λ”ν•©λ‹ˆλ‹€
  3. 정보 보쑴: λΆ„ν•΄ 쀑에 데이터가 μ†μ‹€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(무손싀 쑰인)
  4. μ œμ•½ 쑰건 보쑴: FDκ°€ μ—¬μ „νžˆ κ°•μ œ κ°€λŠ₯ν•©λ‹ˆλ‹€(쒅속성 보쑴)

2. 제1μ •κ·œν˜•(First Normal Form, 1NF)

2.1 μ •μ˜

μ •μ˜: λ¦΄λ ˆμ΄μ…˜μ΄ λ‹€μŒμ„ λ§Œμ‘±ν•˜λ©΄ 제1μ •κ·œν˜•(1NF)에 μžˆμŠ΅λ‹ˆλ‹€: 1. λͺ¨λ“  속성이 μ›μžμ (atomic) (λΆ„ν•  λΆˆκ°€λŠ₯ν•œ) κ°’λ§Œ 포함 2. 반볡 κ·Έλ£Ήμ΄λ‚˜ 배열이 μ—†μŒ 3. 각 행이 κ³ μœ ν•˜κ²Œ 식별 κ°€λŠ₯ (κΈ°λ³Έ ν‚€ 있음)

1NFλŠ” κ΄€κ³„ν˜• λͺ¨λΈμ—μ„œ μœ νš¨ν•œ λ¦΄λ ˆμ΄μ…˜μ΄ 되기 μœ„ν•œ κΈ°λ³Έ μš”κ΅¬μ‚¬ν•­μž…λ‹ˆλ‹€.

2.2 μœ„λ°˜κ³Ό μˆ˜μ •

μœ„λ°˜ 1: λΉ„μ›μžμ  κ°’

| student_id | name       | phone_numbers          |
|------------|------------|------------------------|
| 101        | Alice      | 555-1234, 555-5678     |    ← 닀쀑값!
| 102        | Bob        | 555-9999               |

μˆ˜μ •: 각 μ „ν™”λ²ˆν˜Έμ— λŒ€ν•΄ λ³„λ„μ˜ 행을 λ§Œλ“€κ±°λ‚˜ λ³„λ„μ˜ ν…Œμ΄λΈ” 생성:

Student(student_id, name)
StudentPhone(student_id, phone_number)

| student_id | phone_number |
|------------|--------------|
| 101        | 555-1234     |
| 101        | 555-5678     |
| 102        | 555-9999     |

μœ„λ°˜ 2: 반볡 κ·Έλ£Ή

| order_id | item1  | qty1 | item2  | qty2 | item3  | qty3 |
|----------|--------|------|--------|------|--------|------|
| 1001     | Pen    | 5    | Paper  | 10   | NULL   | NULL |

μˆ˜μ •: 두 ν…Œμ΄λΈ”λ‘œ μ •κ·œν™”:

Order(order_id, order_date, customer_id)
OrderItem(order_id, item_name, quantity)

2.3 1NF와 κ΄€κ³„ν˜• λͺ¨λΈ

μ—„κ²©ν•œ κ΄€κ³„ν˜• μ΄λ‘ μ—μ„œ λ¦΄λ ˆμ΄μ…˜μ€ μ •μ˜μƒ 1NF에 μžˆμŠ΅λ‹ˆλ‹€ β€” κ΄€κ³„ν˜• λͺ¨λΈμ€ λΉ„μ›μžμ  도메인을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ‹€μ œλ‘œ λ§Žμ€ μ‹œμŠ€ν…œμ΄ λ°°μ—΄(PostgreSQL int[]), JSON 컬럼, μ‰Όν‘œλ‘œ κ΅¬λΆ„λœ 값을 ν—ˆμš©ν•©λ‹ˆλ‹€. μ„±λŠ₯μ—λŠ” μœ μš©ν•  수 μžˆμ§€λ§Œ 이듀은 1NF의 정신을 μœ„λ°˜ν•˜κ³  FD 기반 좔둠을 μ–΄λ ΅κ²Œ λ§Œλ“­λ‹ˆλ‹€.


3. 제2μ •κ·œν˜•(Second Normal Form, 2NF)

3.1 λΆ€λΆ„ 쒅속성(Partial Dependency)

μ •μ˜: λΆ€λΆ„ 쒅속성은 λΉ„μ£Όμš” 속성(μ–΄λ–€ 후보 ν‚€μ˜ 일뢀가 μ•„λ‹Œ 속성)이 후보 ν‚€μ˜ 진뢀뢄집합에 ν•¨μˆ˜μ μœΌλ‘œ 쒅속될 λ•Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

즉, μ–΄λ–€ 속성이 ν‚€ 전체가 μ•„λ‹Œ ν‚€μ˜ μΌλΆ€μ—λ§Œ μ˜μ‘΄ν•©λ‹ˆλ‹€.

3.2 μ •μ˜

μ •μ˜: λ¦΄λ ˆμ΄μ…˜μ΄ λ‹€μŒμ„ λ§Œμ‘±ν•˜λ©΄ 제2μ •κ·œν˜•(2NF)에 μžˆμŠ΅λ‹ˆλ‹€: 1. 1NF에 있고, 2. λͺ¨λ“  λΉ„μ£Όμš” 속성이 λͺ¨λ“  후보 킀에 μ™„μ „ ν•¨μˆ˜μ μœΌλ‘œ 쒅속 (λΆ€λΆ„ 쒅속성 μ—†μŒ)

μ°Έκ³ : 2NFλŠ” 후보 ν‚€κ°€ 볡합(ν•˜λ‚˜ μ΄μƒμ˜ 속성을 가짐)일 λ•Œλ§Œ 관련이 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  후보 ν‚€κ°€ 단일 속성이면 λ¦΄λ ˆμ΄μ…˜μ€ μžλ™μœΌλ‘œ 2NF에 μžˆμŠ΅λ‹ˆλ‹€.

3.3 μ˜ˆμ‹œ

λ‹€μŒμ„ κ³ λ €ν•˜μ„Έμš”:

StudentCourse(student_id, course_id, student_name, grade)

후보 ν‚€: {student_id, course_id}

FD: - {student_id, course_id} β†’ grade (μ™„μ „ 쒅속성) - student_id β†’ student_name (λΆ€λΆ„ 쒅속성! student_name은 ν‚€μ˜ μΌλΆ€μ—λ§Œ 의쑴)

이것은 2NFλ₯Ό μœ„λ°˜ν•©λ‹ˆλ‹€.

2NFλ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•œ λΆ„ν•΄:

Student(student_id, student_name)
    ν‚€: {student_id}
    FD: student_id β†’ student_name

Enrollment(student_id, course_id, grade)
    ν‚€: {student_id, course_id}
    FD: {student_id, course_id} β†’ grade

3.4 2NF에 λŒ€ν•œ ν˜•μ‹μ  ν…ŒμŠ€νŠΈ

각 후보 ν‚€ K와 각 λΉ„μ£Όμš” 속성 A에 λŒ€ν•΄: 1. X βŠ‚ K인 μ§„λΆ€λΆ„μ§‘ν•© Xκ°€ μ‘΄μž¬ν•˜μ—¬ X β†’ A인지 확인 2. κ·ΈλŸ¬ν•œ λΆ€λΆ„ 쒅속성이 μ‘΄μž¬ν•˜λ©΄ λ¦΄λ ˆμ΄μ…˜μ€ 2NF에 μ—†μŒ


4. 제3μ •κ·œν˜•(Third Normal Form, 3NF)

4.1 전이 쒅속성(Transitive Dependency)

μ •μ˜: 전이 쒅속성은 λΉ„μ£Όμš” 속성 Aκ°€ λ‹€λ₯Έ λΉ„μ£Όμš” 속성 B에 μ˜μ‘΄ν•˜κ³ , BλŠ” 후보 ν‚€ K에 μ˜μ‘΄ν•  λ•Œ μ‘΄μž¬ν•©λ‹ˆλ‹€:

K β†’ B β†’ A, μ—¬κΈ°μ„œ BλŠ” μŠˆνΌν‚€κ°€ μ•„λ‹ˆκ³  AλŠ” μ–΄λ–€ 후보 ν‚€μ˜ 일뢀가 μ•„λ‹™λ‹ˆλ‹€.

4.2 μ •μ˜

μ •μ˜: λ¦΄λ ˆμ΄μ…˜ μŠ€ν‚€λ§ˆ R이 Aκ°€ 단일 속성인 λͺ¨λ“  λΉ„μžλͺ…ν•œ ν•¨μˆ˜ 쒅속성 X β†’ A에 λŒ€ν•΄ λ‹€μŒμ„ λ§Œμ‘±ν•˜λ©΄ 제3μ •κ·œν˜•(3NF)에 μžˆμŠ΅λ‹ˆλ‹€: 1. Xκ°€ R의 μŠˆνΌν‚€, λ˜λŠ” 2. Aκ°€ μ£Όμš” 속성(μ–΄λ–€ 후보 ν‚€μ˜ 멀버)

λ™λ“±ν•˜κ²Œ: μ–΄λ–€ λΉ„μ£Όμš” 속성도 μ–΄λ–€ 후보 킀에 μ „μ΄μ μœΌλ‘œ μ’…μ†λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

4.3 μ˜ˆμ‹œ

λ‹€μŒμ„ κ³ λ €ν•˜μ„Έμš”:

Employee(emp_id, dept_id, dept_name, dept_location)

후보 ν‚€: {emp_id}

FD: - emp_id β†’ dept_id, dept_name, dept_location - dept_id β†’ dept_name, dept_location

쒅속성 emp_id β†’ dept_name은 dept_idλ₯Ό 톡해 μ „μ΄μ μž…λ‹ˆλ‹€: - emp_id β†’ dept_id β†’ dept_name

이것은 3NFλ₯Ό μœ„λ°˜ν•©λ‹ˆλ‹€. dept_name이 dept_id(λΉ„μŠˆνΌν‚€)에 μ˜μ‘΄ν•˜κ³  dept_name이 μ£Όμš” 속성이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

3NFλ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•œ λΆ„ν•΄:

Employee(emp_id, dept_id)
    ν‚€: {emp_id}
    FD: emp_id β†’ dept_id

Department(dept_id, dept_name, dept_location)
    ν‚€: {dept_id}
    FD: dept_id β†’ dept_name, dept_location

4.4 "μ£Όμš” 속성" μ˜ˆμ™Έμ˜ μ€‘μš”μ„±

3NF의 "Aκ°€ μ£Όμš” 속성"μ΄λΌλŠ” 쑰건은 BCNF와 κ΅¬λ³„λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μ˜ˆμ™ΈλŠ” κ²°μ •μžκ°€ μŠˆνΌν‚€κ°€ μ•„λ‹ˆλ”λΌλ„ μ’…μ†μžκ°€ 후보 ν‚€μ˜ 일뢀인 νŠΉμ • FDλ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€. 이 μ˜ˆμ™Έκ°€ 3NF λΆ„ν•΄λ₯Ό 항상 쒅속성 보쑴으둜 λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€(BCNFμ™€λŠ” 달리).


5. Boyce-Codd μ •κ·œν˜•(Boyce-Codd Normal Form, BCNF)

5.1 μ •μ˜

μ •μ˜: λ¦΄λ ˆμ΄μ…˜ μŠ€ν‚€λ§ˆ R이 λͺ¨λ“  λΉ„μžλͺ…ν•œ ν•¨μˆ˜ 쒅속성 X β†’ Y에 λŒ€ν•΄ λ‹€μŒμ„ λ§Œμ‘±ν•˜λ©΄ Boyce-Codd μ •κ·œν˜•(BCNF)에 μžˆμŠ΅λ‹ˆλ‹€:

Xκ°€ R의 μŠˆνΌν‚€μž…λ‹ˆλ‹€.

BCNFλŠ” 3NF보닀 μ—„κ²©ν•˜κ²Œ κ°•ν•©λ‹ˆλ‹€. "μ£Όμš” 속성" μ˜ˆμ™Έλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€: λͺ¨λ“  κ²°μ •μžκ°€ μŠˆνΌν‚€μ—¬μ•Ό ν•©λ‹ˆλ‹€. λ§ˆμΉ¨ν‘œ.

5.2 관계: 3NF vs BCNF

BCNF βŠ‚ 3NF βŠ‚ 2NF βŠ‚ 1NF

λͺ¨λ“  BCNF λ¦΄λ ˆμ΄μ…˜μ€ 3NF에 μžˆμŠ΅λ‹ˆλ‹€.
λͺ¨λ“  3NF λ¦΄λ ˆμ΄μ…˜μ€ 2NF에 μžˆμŠ΅λ‹ˆλ‹€.
λͺ¨λ“  2NF λ¦΄λ ˆμ΄μ…˜μ€ 1NF에 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ κ·Έ 역은 μ•„λ‹™λ‹ˆλ‹€.

5.3 μ˜ˆμ‹œ: 3NFμ΄μ§€λ§Œ BCNFκ°€ μ•„λ‹˜

λ‹€μŒμ„ κ³ λ €ν•˜μ„Έμš”:

TeachingAssignment(student_id, course, instructor)

λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™: - 각 κ°•μ‚¬λŠ” μ •ν™•νžˆ ν•˜λ‚˜μ˜ κ³Όλͺ©μ„ κ°€λ₯΄μΉ¨: instructor β†’ course - 각 학생은 κ³Όλͺ©λ‹Ή μ •ν™•νžˆ ν•œ λͺ…μ˜ 강사λ₯Ό 가짐: {student_id, course} β†’ instructor - 학생은 μ£Όμ–΄μ§„ κ³Όλͺ©μ— λŒ€ν•΄ ν•œ λͺ…μ˜ κ°•μ‚¬λ§Œ κ°€μ§ˆ 수 있음

후보 ν‚€: {student_id, course}와 {student_id, instructor}

FD: - {student_id, course} β†’ instructor - {student_id, instructor} β†’ course - instructor β†’ course

instructor β†’ course에 λŒ€ν•œ 3NF 확인: - instructorλŠ” μŠˆνΌν‚€κ°€ μ•„λ‹˜ βœ— - courseλŠ” μ£Όμš” 속성(후보 ν‚€ {student_id, course}의 일뢀) βœ“

λ”°λΌμ„œ λ¦΄λ ˆμ΄μ…˜μ€ 3NF에 μžˆμŠ΅λ‹ˆλ‹€(3NF μ •μ˜μ˜ 쑰건 2κ°€ 만쑱됨).

instructor β†’ course에 λŒ€ν•œ BCNF 확인: - instructorλŠ” μŠˆνΌν‚€κ°€ μ•„λ‹˜ βœ—

λ”°λΌμ„œ λ¦΄λ ˆμ΄μ…˜μ€ BCNF에 μ—†μŠ΅λ‹ˆλ‹€.

5.4 3NF와 BCNFκ°€ λ‹€λ₯Ό λ•Œ

3NF와 BCNFλŠ” λ‹€μŒμ˜ κ²½μš°μ—λ§Œ λ‹€λ¦…λ‹ˆλ‹€: 1. μ—¬λŸ¬ 개의 μ€‘μ²©λœ 후보 ν‚€κ°€ 있고, 2. λΉ„μŠˆνΌν‚€ 속성이 후보 ν‚€μ˜ 일뢀λ₯Ό 결정함

μ‹€μ œλ‘œ 이 상황은 μƒλŒ€μ μœΌλ‘œ λ“œλ­…λ‹ˆλ‹€. 3NF에 μžˆλŠ” λŒ€λΆ€λΆ„μ˜ λ¦΄λ ˆμ΄μ…˜μ€ BCNF에도 μžˆμŠ΅λ‹ˆλ‹€.


6. λΆ„ν•΄ 속성(Decomposition Properties)

λ¦΄λ ˆμ΄μ…˜μ„ 더 높은 μ •κ·œν˜•μ„ λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ λΆ„ν•΄ν•  λ•Œ, λΆ„ν•΄κ°€ "쒋은"μ§€ 확인해야 ν•©λ‹ˆλ‹€. 두 κ°€μ§€ μ€‘μš”ν•œ 속성이 "μ’‹μŒ"의 의미λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

6.1 무손싀 쑰인 속성(Lossless-Join Property)

μ •μ˜: R을 R₁, Rβ‚‚, ..., Rβ‚™μœΌλ‘œ λΆ„ν•΄ν•  λ•Œ R의 λͺ¨λ“  합법적 μΈμŠ€ν„΄μŠ€ r에 λŒ€ν•΄ λ‹€μŒμ„ λ§Œμ‘±ν•˜λ©΄ 무손싀 쑰인 속성을 κ°€μ§‘λ‹ˆλ‹€:

r = Ο€_{R₁}(r) β‹ˆ Ο€_{Rβ‚‚}(r) β‹ˆ ... β‹ˆ Ο€_{Rβ‚™}(r)

즉, λΆ„ν•΄λœ λ¦΄λ ˆμ΄μ…˜μ„ μžμ—° μ‘°μΈν•˜μ—¬ μ›λž˜ λ¦΄λ ˆμ΄μ…˜μ„ μž¬κ΅¬μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 정보가 μ†μ‹€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이진 λΆ„ν•΄ ν…ŒμŠ€νŠΈ

R을 R₁과 Rβ‚‚λ‘œ λΆ„ν•΄ν•˜λŠ” 경우:

정리: λΆ„ν•΄κ°€ 무손싀 쑰인이 되렀면 λ‹€μŒ 쀑 ν•˜λ‚˜κ°€ λ§Œμ‘±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€:

(R₁ ∩ Rβ‚‚) β†’ (R₁ - Rβ‚‚) ∈ F⁺, λ˜λŠ” (R₁ ∩ Rβ‚‚) β†’ (Rβ‚‚ - R₁) ∈ F⁺

곡톡 속성이 ν•œ μͺ½μ˜ λͺ¨λ“  속성을 ν•¨μˆ˜μ μœΌλ‘œ κ²°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ™λ“±ν•˜κ²Œ, 곡톡 속성이 λΆ„ν•΄λœ λ¦΄λ ˆμ΄μ…˜ 쀑 적어도 ν•˜λ‚˜μ˜ μŠˆνΌν‚€μ—¬μ•Ό ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

Employee(emp_id, dept_id, dept_name)을 λ‹€μŒκ³Ό 같이 λΆ„ν•΄: - R₁(emp_id, dept_id)와 Rβ‚‚(dept_id, dept_name)

곡톡 속성: {dept_id} Rβ‚‚ - R₁ = {dept_name}

dept_id β†’ dept_name이 F⁺에 μžˆλŠ”κ°€? 예!

λ”°λΌμ„œ 이 λΆ„ν•΄λŠ” 무손싀 μ‘°μΈμž…λ‹ˆλ‹€. βœ“

무손싀 쑰인이 μ€‘μš”ν•œ 이유

무손싀 쑰인 속성이 μ—†μœΌλ©΄ λΆ„ν•΄λœ ν…Œμ΄λΈ”μ„ 쑰인할 λ•Œ ν—ˆμœ„ νŠœν”Œ(spurious tuples) β€” μ›λž˜ λ¦΄λ ˆμ΄μ…˜μ— μ‘΄μž¬ν•˜μ§€ μ•Šμ•˜λ˜ ν–‰ β€” 이 μƒμ„±λ©λ‹ˆλ‹€:

원본:
| A | B | C |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 2 | 5 |

R1(A,B)와 R2(B,C)둜 λΆ„ν•΄:
R1:          R2:
| A | B |    | B | C |
|---|---|    |---|---|
| 1 | 2 |    | 2 | 3 |
| 4 | 2 |    | 2 | 5 |

R1 β‹ˆ R2:
| A | B | C |
|---|---|---|
| 1 | 2 | 3 |    ← 원본 βœ“
| 1 | 2 | 5 |    ← ν—ˆμœ„! βœ—
| 4 | 2 | 3 |    ← ν—ˆμœ„! βœ—
| 4 | 2 | 5 |    ← 원본 βœ“

μ—¬κΈ°μ„œ BλŠ” Aλ‚˜ Cλ₯Ό κ²°μ •ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λΆ„ν•΄λŠ” 손싀(무손싀이 μ•„λ‹˜)μž…λ‹ˆλ‹€.

6.2 쒅속성 보쑴(Dependency Preservation)

μ •μ˜: R을 R₁, Rβ‚‚, ..., Rβ‚™μœΌλ‘œ λΆ„ν•΄ν•  λ•Œ λ‹€μŒμ„ λ§Œμ‘±ν•˜λ©΄ 쒅속성 λ³΄μ‘΄μž…λ‹ˆλ‹€:

(F₁ βˆͺ Fβ‚‚ βˆͺ ... βˆͺ Fβ‚™)⁺ = F⁺

μ—¬κΈ°μ„œ Fα΅’λŠ” Rᡒ의 μ†μ„±λ§Œ ν¬ν•¨ν•˜λŠ” F⁺의 FD μ§‘ν•©μž…λ‹ˆλ‹€.

더 κ°„λ‹¨ν•˜κ²Œ: μ›λž˜ F의 λͺ¨λ“  FDλ₯Ό ν…Œμ΄λΈ” 쑰인 없이 κ°œλ³„ λΆ„ν•΄λœ λ¦΄λ ˆμ΄μ…˜ λ‚΄μ˜ μ œμ•½ 쑰건을 ν™•μΈν•˜μ—¬ 검증할 수 μžˆμŠ΅λ‹ˆλ‹€.

쒅속성 보쑴이 μ€‘μš”ν•œ 이유

λΆ„ν•΄κ°€ 쒅속성 보쑴이 μ•„λ‹ˆλ©΄ 일뢀 FDλŠ” μ—¬λŸ¬ ν…Œμ΄λΈ”μ„ μ‘°μΈν•΄μ•Όλ§Œ κ°•μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€ β€” 이것은 λΉ„μš©μ΄ 많이 λ“€κ³  μ’…μ’… λΉ„μ‹€μš©μ μž…λ‹ˆλ‹€. 쒅속성 보쑴이 μ—†μœΌλ©΄ DBMSλŠ” 데이터 무결성을 효율적으둜 μœ μ§€ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ

R(A, B, C)에 F = { A β†’ B, B β†’ C }κ°€ 있음

R₁(A, C)와 Rβ‚‚(B, C)둜 λΆ„ν•΄.

Rβ‚μ˜ FD: A β†’ Bλ₯Ό κ°•μ œν•  수 μžˆλŠ”κ°€? μ•„λ‹ˆμ˜€ β€” Bκ°€ R₁에 μ—†μŒ. Rβ‚‚μ˜ FD: A β†’ Bλ₯Ό κ°•μ œν•  수 μžˆλŠ”κ°€? μ•„λ‹ˆμ˜€ β€” Aκ°€ R₂에 μ—†μŒ.

FD A β†’ Bκ°€ λ³΄μ‘΄λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν™•μΈν•˜λ €λ©΄ R₁과 Rβ‚‚λ₯Ό 쑰인해야 ν•©λ‹ˆλ‹€.

더 λ‚˜μ€ λΆ„ν•΄: R₁(A, B)와 Rβ‚‚(B, C) β€” 이것은 A β†’ B와 B β†’ C λͺ¨λ‘ λ³΄μ‘΄ν•©λ‹ˆλ‹€.

6.3 λ‘˜ λ‹€ κ°€μ§ˆ 수 μžˆλŠ”κ°€?

μ •κ·œν˜• 무손싀 쑰인 쒅속성 보쑴
3NF 항상 달성 κ°€λŠ₯ βœ“ 항상 달성 κ°€λŠ₯ βœ“
BCNF 항상 달성 κ°€λŠ₯ βœ“ 항상은 μ•„λ‹˜ βœ—

이것이 핡심 νŠΈλ ˆμ΄λ“œμ˜€ν”„μž…λ‹ˆλ‹€: BCNFλŠ” 더 μ—„κ²©ν•œ μ •κ·œν˜•μ΄μ§€λ§Œ λ‹¬μ„±ν•˜λ©΄ 쒅속성 보쑴을 희생할 수 μžˆμŠ΅λ‹ˆλ‹€. 3NFλŠ” 두 속성을 λͺ¨λ‘ 보μž₯ν•©λ‹ˆλ‹€.


7. 무손싀 쑰인 ν…ŒμŠ€νŠΈ μ•Œκ³ λ¦¬μ¦˜ (n-원 λΆ„ν•΄μš©)

두 개 μ΄μƒμ˜ λ¦΄λ ˆμ΄μ…˜μœΌλ‘œ λΆ„ν•΄ν•˜λŠ” 경우 ν…Œμ΄λΈ” μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

7.1 μ•Œκ³ λ¦¬μ¦˜ (체이슀 ν…ŒμŠ€νŠΈ, Chase Test)

ALGORITHM: LosslessJoinTest(R, F, {R₁, Rβ‚‚, ..., Rβ‚™})
INPUT:  R = {A₁, Aβ‚‚, ..., Aβ‚˜} (m개 속성)
        F = FD μ§‘ν•©
        {R₁, Rβ‚‚, ..., Rβ‚™} = λΆ„ν•΄
OUTPUT: 무손싀 쑰인이면 TRUE, μ•„λ‹ˆλ©΄ FALSE

단계 1: n Γ— m ν–‰λ ¬ 생성.
        ν–‰ iλŠ” Rᡒ에 λŒ€μ‘, μ—΄ jλŠ” 속성 Aⱼ에 λŒ€μ‘.

단계 2: ν–‰λ ¬ μ΄ˆκΈ°ν™”:
        Aβ±Ό ∈ Rᡒ이면 entry[i][j] = aβ±Ό (ꡬ별 기호)
        μ•„λ‹ˆλ©΄ entry[i][j] = bα΅’β±Ό (첨자 기호)

단계 3: REPEAT
            FOR EACH FD (X β†’ Y) IN F DO
                X의 λͺ¨λ“  μ—΄μ—μ„œ μΌμΉ˜ν•˜λŠ” λͺ¨λ“  ν–‰ μ°ΎκΈ°
                κ·ΈλŸ¬ν•œ 행듀에 λŒ€ν•΄ Y-열을 λ™μΌν•˜κ²Œ λ§Œλ“€κΈ°:
                    Y의 μ–΄λ–€ 열에 λŒ€ν•΄ μ–΄λ–€ 행이 aβ±Όλ₯Ό κ°€μ§€λ©΄ λͺ¨λ“  μΌμΉ˜ν•˜λŠ” 행을 aⱼ둜 μ„€μ •
                    μ•„λ‹ˆλ©΄ ν•˜λ‚˜μ˜ bα΅’β±Όλ₯Ό μ„ νƒν•˜κ³  λͺ¨λ“  μΌμΉ˜ν•˜λŠ” 행을 κ·Έ κ°’μœΌλ‘œ μ„€μ •
            END FOR
        UNTIL λ³€κ²½ λ°œμƒν•˜μ§€ μ•ŠμŒ

단계 4: μ–΄λ–€ 행이 λͺ¨λ“  ꡬ별 기호λ₯Ό κ°€μ§€λ©΄ (a₁, aβ‚‚, ..., aβ‚˜), TRUE λ°˜ν™˜.
        μ•„λ‹ˆλ©΄ FALSE λ°˜ν™˜.

7.2 μž‘μ—… 예제

R(A, B, C, D, E), F = { A β†’ C, B β†’ C, C β†’ D, DE β†’ C, CE β†’ A }

λΆ„ν•΄: R₁(A, D), Rβ‚‚(A, B), R₃(B, E), Rβ‚„(C, D, E), Rβ‚…(A, E)

단계 1-2: 초기 ν–‰λ ¬

A B C D E
R₁ a₁ b₁₂ b₁₃ aβ‚„ b₁₅
Rβ‚‚ a₁ aβ‚‚ b₂₃ bβ‚‚β‚„ bβ‚‚β‚…
R₃ b₃₁ aβ‚‚ b₃₃ b₃₄ aβ‚…
Rβ‚„ b₄₁ bβ‚„β‚‚ a₃ aβ‚„ aβ‚…
Rβ‚… a₁ bβ‚…β‚‚ b₅₃ bβ‚…β‚„ aβ‚…

단계 3: FDλ₯Ό 반볡적으둜 적용

A β†’ C 적용: λ™μΌν•œ A 값을 κ°€μ§„ ν–‰. - R₁, Rβ‚‚, Rβ‚… 행이 A = a₁을 가짐. C 열을 λ™μΌν•˜κ²Œ λ§Œλ“€κΈ°. - R₁: b₁₃, Rβ‚‚: b₂₃, Rβ‚…: b₅₃. ꡬ별 기호 μ—†μŒ. λͺ¨λ‘μ— λŒ€ν•΄ b₁₃ 선택. - R₁: b₁₃, Rβ‚‚: b₁₃, Rβ‚…: b₁₃

B β†’ C 적용: Rβ‚‚, R₃ 행이 B = aβ‚‚λ₯Ό 가짐. - Rβ‚‚: b₁₃, R₃: b₃₃. b₁₃ 선택. - R₃: b₁₃

C β†’ D 적용: λ™μΌν•œ C 값을 κ°€μ§„ ν–‰. - R₁, Rβ‚‚, R₃, Rβ‚… 행이 λͺ¨λ‘ C = b₁₃을 가짐. Rβ‚„λŠ” C = a₃ (닀름). - R₁: aβ‚„, Rβ‚‚: bβ‚‚β‚„, R₃: b₃₄, Rβ‚…: bβ‚…β‚„. R₁이 κ΅¬λ³„λœ aβ‚„λ₯Ό 가짐. λͺ¨λ‘ aβ‚„λ‘œ μ„€μ •. - Rβ‚‚: aβ‚„, R₃: aβ‚„, Rβ‚…: aβ‚„

DE β†’ C 적용: λ™μΌν•œ D와 E 값을 κ°€μ§„ ν–‰. - R₃: D=aβ‚„, E=aβ‚…; Rβ‚„: D=aβ‚„, E=aβ‚…; Rβ‚…: D=aβ‚„, E=aβ‚…. - 이 행듀이 DEμ—μ„œ 일치. Cλ₯Ό λ™μΌν•˜κ²Œ: R₃: b₁₃, Rβ‚„: a₃, Rβ‚…: b₁₃. Rβ‚„κ°€ a₃λ₯Ό 가짐. λͺ¨λ‘ aβ‚ƒλ‘œ μ„€μ •. - R₃: a₃, Rβ‚…: a₃.

CE β†’ A 적용: λ™μΌν•œ C와 Eλ₯Ό κ°€μ§„ ν–‰. - R₃: C=a₃, E=aβ‚…; Rβ‚„: C=a₃, E=aβ‚…; Rβ‚…: C=a₃, E=aβ‚…. - Rβ‚…κ°€ A=a₁ (ꡬ별됨). R₃: a₁, Rβ‚„: aβ‚λ‘œ μ„€μ •.

이제 A β†’ C 재적용: R₁,Rβ‚‚,R₃,Rβ‚„,Rβ‚… 행이 A=a₁을 가짐. - C κ°’: R₁=b₁₃, Rβ‚‚=b₁₃, R₃=a₃, Rβ‚„=a₃, Rβ‚…=a₃. a₃가 있음. λͺ¨λ‘ aβ‚ƒλ‘œ μ„€μ •. - R₁=a₃, Rβ‚‚=a₃.

C β†’ Dλ₯Ό λͺ¨λ“  행에 재적용 (이제 λͺ¨λ‘ C=a₃): 이미 λͺ¨λ‘ D=aβ‚„. λ³€κ²½ μ—†μŒ.

Rβ‚… ν–‰ 확인: A=a₁, B=bβ‚…β‚‚, C=a₃, D=aβ‚„, E=aβ‚…. μ—¬μ „νžˆ B에 λŒ€ν•΄ bβ‚…β‚‚ 있음.

B β†’ C 적용: Rβ‚‚κ°€ B=aβ‚‚, R₃이 B=aβ‚‚λ₯Ό 가짐. λ‘˜ λ‹€ 이미 C=a₃. λ³€κ²½ μ—†μŒ.

확인: R₃ ν–‰ = (a₁, aβ‚‚, a₃, aβ‚„, aβ‚…) β€” λͺ¨λ“  ꡬ별 기호!

κ²°κ³Ό: λΆ„ν•΄λŠ” 무손싀 μ‘°μΈμž…λ‹ˆλ‹€. βœ“


8. 3NF ν•©μ„± μ•Œκ³ λ¦¬μ¦˜

3NF ν•©μ„± μ•Œκ³ λ¦¬μ¦˜μ€ 무손싀 쑰인과 쒅속성 보쑴 λͺ¨λ‘λ₯Ό κ°€μ§„ λΆ„ν•΄λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

8.1 μ•Œκ³ λ¦¬μ¦˜

ALGORITHM: 3NF_Synthesis(R, F)
INPUT:  R = λ¦΄λ ˆμ΄μ…˜ μŠ€ν‚€λ§ˆ, F = FD μ§‘ν•©
OUTPUT: 무손싀 쑰인과 쒅속성 보쑴을 κ°€μ§„ 3NF λΆ„ν•΄ {R₁, Rβ‚‚, ..., Rβ‚™}

단계 1: F의 μ΅œμ†Œ 컀버 F_min 계산.

단계 2: F_min의 각 FD X β†’ A에 λŒ€ν•΄:
            λ¦΄λ ˆμ΄μ…˜ μŠ€ν‚€λ§ˆ Rα΅’ = X βˆͺ {A} 생성
        λ™μΌν•œ LHSλ₯Ό κ°€μ§„ FD κ·Έλ£Ήν™”:
            X β†’ A₁, X β†’ Aβ‚‚, ..., X β†’ Aβ‚–κ°€ λͺ¨λ‘ λ™μΌν•œ Xλ₯Ό κ°€μ§€λ©΄,
            ν•˜λ‚˜μ˜ μŠ€ν‚€λ§ˆ Rα΅’ = X βˆͺ {A₁, Aβ‚‚, ..., Aβ‚–} 생성

단계 3: μŠ€ν‚€λ§ˆ 쀑 μ–΄λŠ 것도 R의 후보 ν‚€λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠμœΌλ©΄,
        μŠ€ν‚€λ§ˆ Rβ‚– = R의 μž„μ˜μ˜ 후보 ν‚€ μΆ”κ°€.

단계 4: λ‹€λ₯Έ μŠ€ν‚€λ§ˆ Rⱼ의 뢀뢄집합인 μŠ€ν‚€λ§ˆ Rα΅’ 제거.

RETURN {R₁, Rβ‚‚, ..., Rβ‚™}

8.2 각 단계가 μ€‘μš”ν•œ 이유

  • 단계 1 (μ΅œμ†Œ 컀버): 쀑볡 FDκ°€ μΆ”κ°€ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜μ§€ μ•Šλ„λ‘ 보μž₯
  • 단계 2 (LHS κ·Έλ£Ήλ‹Ή ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”): 각 FDλ₯Ό 직접 보쑴
  • 단계 3 (ν•„μš”ν•œ 경우 ν‚€ μΆ”κ°€): 무손싀 쑰인 속성 보μž₯
  • 단계 4 (λΆ€λΆ„μ§‘ν•© 제거): 쀑볡 ν…Œμ΄λΈ” 제거

8.3 μž‘μ—… 예제

R(A, B, C, D, E, H)에 λ‹€μŒμ΄ 있음:

F = { A β†’ BC,  E β†’ HA,  B β†’ D }

단계 1: μ΅œμ†Œ 컀버 계산

RHS λΆ„ν•΄:

F = { A β†’ B, A β†’ C, E β†’ H, E β†’ A, B β†’ D }

λΆˆν•„μš”ν•œ LHS 확인: λͺ¨λ“  LHSκ°€ 단일 속성. λ‹¨μˆœν™”ν•  것 μ—†μŒ.

쀑볡 FD 확인: - A β†’ B: 제거. λ‚˜λ¨Έμ§€ ν•˜μ—μ„œ {A}⁺ = {A, C} βˆͺ ... = {A, C}. B βˆ‰ {A}⁺. μœ μ§€. - A β†’ C: 제거. λ‚˜λ¨Έμ§€ ν•˜μ—μ„œ {A}⁺ = {A, B, D} (Aβ†’B, Bβ†’Dλ₯Ό 톡해). C βˆ‰ {A}⁺. μœ μ§€. - E β†’ H: 제거. λ‚˜λ¨Έμ§€ ν•˜μ—μ„œ {E}⁺ = {E, A, B, C, D} (Eβ†’A, Aβ†’B, Aβ†’C, Bβ†’Dλ₯Ό 톡해). H βˆ‰ {E}⁺. μœ μ§€. - E β†’ A: 제거. λ‚˜λ¨Έμ§€ ν•˜μ—μ„œ {E}⁺ = {E, H}. A βˆ‰ {E}⁺. μœ μ§€. - B β†’ D: 제거. λ‚˜λ¨Έμ§€ ν•˜μ—μ„œ {B}⁺ = {B}. D βˆ‰ {B}⁺. μœ μ§€.

μ΅œμ†Œ 컀버:

F_min = { A β†’ B, A β†’ C, E β†’ H, E β†’ A, B β†’ D }

단계 2: LHS둜 κ·Έλ£Ήν™”ν•˜κ³  μŠ€ν‚€λ§ˆ 생성

LHS FD μŠ€ν‚€λ§ˆ
A A β†’ B, A β†’ C R₁(A, B, C)
E E β†’ H, E β†’ A Rβ‚‚(E, H, A)
B B β†’ D R₃(B, D)

단계 3: 후보 ν‚€ 확인

{E}⁺ = {E, H, A, B, C, D} = λͺ¨λ“  속성 계산. λ”°λΌμ„œ {E}κ°€ 후보 ν‚€.

Eκ°€ μ–΄λ–€ μŠ€ν‚€λ§ˆμ— μžˆλŠ”κ°€? Rβ‚‚κ°€ Eλ₯Ό 포함. Rβ‚‚μ˜ ν‚€λŠ” E. βœ“ (후보 ν‚€ 쑴재.)

단계 4: λΆ€λΆ„μ§‘ν•© μŠ€ν‚€λ§ˆ 제거

μ–΄λŠ 것도 λ‹€λ₯Έ κ²ƒμ˜ 뢀뢄집합이 μ•„λ‹˜.

μ΅œμ’… λΆ„ν•΄:

R₁(A, B, C)    β€” ν‚€: {A}
Rβ‚‚(E, H, A)    β€” ν‚€: {E}
R₃(B, D)       β€” ν‚€: {B}

λͺ¨λ‘ 3NF βœ“, 무손싀 쑰인 βœ“, 쒅속성 보쑴 βœ“.


9. BCNF λΆ„ν•΄ μ•Œκ³ λ¦¬μ¦˜

9.1 μ•Œκ³ λ¦¬μ¦˜

ALGORITHM: BCNF_Decomposition(R, F)
INPUT:  R = λ¦΄λ ˆμ΄μ…˜ μŠ€ν‚€λ§ˆ, F = FD μ§‘ν•©
OUTPUT: 무손싀 쑰인을 κ°€μ§„ BCNF λ¦΄λ ˆμ΄μ…˜μœΌλ‘œ λΆ„ν•΄

result ← {R}

WHILE result에 BCNF에 μ—†λŠ” Rα΅’κ°€ 쑴재 DO
    Rα΅’μ—μ„œ BCNFλ₯Ό μœ„λ°˜ν•˜λŠ” FD X β†’ Y μ°ΎκΈ°
    (즉, Xκ°€ Rᡒ의 μŠˆνΌν‚€κ°€ μ•„λ‹ˆκ³ , Y βŠ„ X)

    F에 λŒ€ν•΄ X⁺ 계산

    Rα΅’λ₯Ό λ‹€μŒμœΌλ‘œ λŒ€μ²΄:
        R₁ = X⁺ ∩ attributes(Rα΅’)    (Rα΅’ λ‚΄μ—μ„œ Xκ°€ κ²°μ •ν•˜λŠ” λͺ¨λ“  것)
        Rβ‚‚ = X βˆͺ (attributes(Rα΅’) - X⁺)   (X + κ²°μ •ν•˜μ§€ μ•ŠλŠ” 것)
END WHILE

RETURN result

핡심 λΆ„ν•΄ λ‹¨κ³„λŠ” Rα΅’λ₯Ό λ‹€μŒμœΌλ‘œ λΆ„ν• ν•©λ‹ˆλ‹€: - R₁: (Rα΅’ λ‚΄μ—μ„œ) Xκ°€ κ²°μ •ν•˜λŠ” λͺ¨λ“  속성 β€” XλŠ” Rβ‚μ˜ ν‚€ - Rβ‚‚: X + λ‚˜λ¨Έμ§€ 속성 β€” XλŠ” Rβ‚λ‘œ λŒμ•„κ°€λŠ” μ™Έλž˜ ν‚€

이것은 무손싀 쑰인을 보μž₯ν•©λ‹ˆλ‹€ (R₁ ∩ Rβ‚‚ = X, 그리고 X β†’ R₁).

9.2 μž‘μ—… 예제

R(A, B, C, D)에 F = { AB β†’ C, C β†’ B, AB β†’ D }κ°€ 있음

단계 1: R이 BCNF에 μžˆλŠ”κ°€?

후보 ν‚€: {A, B} ({A,B}⁺ = {A,B,C,D}). λ˜ν•œ {A, C}κ°€ 후보 ν‚€ ({A,C}⁺: Cβ†’BλŠ” {A,B,C}λ₯Ό 제곡, ABβ†’DλŠ” {A,B,C,D}λ₯Ό 제곡).

FD 확인: - AB β†’ C: {A,B}λŠ” μŠˆνΌν‚€. βœ“ - C β†’ B: {C}⁺ = {C, B}. CλŠ” μŠˆνΌν‚€κ°€ μ•„λ‹˜. BCNF μœ„λ°˜! - AB β†’ D: {A,B}λŠ” μŠˆνΌν‚€. βœ“

단계 2: C β†’ Bμ—μ„œ λΆ„ν•΄

{C}⁺ ∩ {A,B,C,D} = {B, C} ∩ {A,B,C,D} = {B, C} 계산

  • R₁ = {B, C}에 FD: C β†’ B (ν‚€: C)
  • Rβ‚‚ = {C} βˆͺ ({A,B,C,D} - {B,C}) = {A, C, D}

Rβ‚‚(A, C, D)에 FD 투영: - AB β†’ CλŠ” κ΄€λ ¨ μ—†μŒ (B βˆ‰ Rβ‚‚) - C β†’ BλŠ” κ΄€λ ¨ μ—†μŒ (B βˆ‰ Rβ‚‚) - AB β†’ DλŠ”... 확인 ν•„μš”: 투영된 FD ν•˜μ—μ„œ R₂에 λŒ€ν•œ {A,C}⁺. Cβ†’BλŠ” R₂에 μ—†μŒ. ν•˜μ§€λ§Œ μ›λ³Έμ—μ„œ: AC β†’ D? {A,C}⁺ = {A,C,B,D} (Cβ†’B, ABβ†’D). λ”°λΌμ„œ AC β†’ Dκ°€ 성립. Rβ‚‚μ˜ ν‚€λŠ” {A, C}. - 확인: ACκ°€ Rβ‚‚μ˜ μŠˆνΌν‚€μΈκ°€? Rβ‚‚λ‘œ μ œν•œλœ {A,C}⁺ = {A,C,D}. 예. βœ“

단계 3: R₁과 Rβ‚‚ 확인

  • R₁(B, C), FD: C β†’ B. ν‚€: {C}. CλŠ” μŠˆνΌν‚€. BCNF βœ“
  • Rβ‚‚(A, C, D), FD: AC β†’ D. ν‚€: {A, C}. ACλŠ” μŠˆνΌν‚€. BCNF βœ“

μ΅œμ’… BCNF λΆ„ν•΄:

R₁(B, C)      β€” ν‚€: {C}
Rβ‚‚(A, C, D)   β€” ν‚€: {A, C}

쒅속성 보쑴 확인: - AB β†’ C: Rβ‚μ΄λ‚˜ Rβ‚‚ λ‹¨λ…μœΌλ‘œ 확인 λΆˆκ°€ (A와 Bκ°€ 같은 ν…Œμ΄λΈ”μ— μ—†μŒ). λ³΄μ‘΄λ˜μ§€ μ•ŠμŒ! - C β†’ B: R₁에 있음. βœ“ - AB β†’ D: 직접 λ³΄μ‘΄λ˜μ§€ μ•Šμ§€λ§Œ, AC β†’ DλŠ” R₂에 있음.

이것은 BCNF νŠΈλ ˆμ΄λ“œμ˜€ν”„λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€: BCNFλ₯Ό λ‹¬μ„±ν–ˆμ§€λ§Œ FD AB β†’ Cλ₯Ό μžƒμ—ˆμŠ΅λ‹ˆλ‹€.

9.3 BCNF vs 3NF: νŠΈλ ˆμ΄λ“œμ˜€ν”„

속성 3NF ν•©μ„± BCNF λΆ„ν•΄
무손싀 쑰인 βœ“ 항상 βœ“ 항상
쒅속성 보쑴 βœ“ 항상 βœ— 항상은 μ•„λ‹˜
쀑볡 제거 μ’‹μŒ (μ΅œμ†Œ) μ΅œμƒ (FDλ‘œλΆ€ν„° μ—†μŒ)
μ„ ν˜Έν•˜λŠ” 경우 쒅속성 보쑴이 μ€‘μš”ν•  λ•Œ μ΅œμ†Œ 쀑볡이 μ€‘μš”ν•  λ•Œ

μ‹€μš©μ  μ§€μΉ¨: - BCNF λΆ„ν•΄λΆ€ν„° μ‹œμž‘ - 쒅속성 보쑴이 μ‹€νŒ¨ν•˜λ©΄ 3NF둜 후퇴 - μ‹€μ œλ‘œ λŒ€λΆ€λΆ„μ˜ μŠ€ν‚€λ§ˆλŠ” 쒅속성을 μžƒμ§€ μ•Šκ³  BCNFλ₯Ό 달성


10. μ™„μ „ν•œ μž‘μ—… 예제: λΉ„μ •κ·œν™”μ—μ„œ BCNFκΉŒμ§€

10.1 μ‹œλ‚˜λ¦¬μ˜€

νšŒμ‚¬κ°€ ν”„λ‘œμ νŠΈ 배정을 좔적:

ProjectAssignment(
    emp_id, emp_name, emp_phone,
    dept_id, dept_name, dept_budget,
    proj_id, proj_name, proj_budget,
    hours_worked, role
)

λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™ (FD):

F = {
    emp_id β†’ emp_name, emp_phone, dept_id,
    dept_id β†’ dept_name, dept_budget,
    proj_id β†’ proj_name, proj_budget,
    {emp_id, proj_id} β†’ hours_worked, role
}

후보 ν‚€: {emp_id, proj_id}

10.2 1NF 확인

λͺ¨λ“  값이 μ›μžμ  (단일 κ°’, λ°°μ—΄ μ—†μŒ). βœ“ 1NF에 있음.

10.3 2NF 확인

λΉ„μ£Όμš” 속성: emp_name, emp_phone, dept_id, dept_name, dept_budget, proj_name, proj_budget, hours_worked, role.

λΆ€λΆ„ 쒅속성 (속성이 ν‚€ {emp_id, proj_id}의 진뢀뢄집합에 의쑴): - emp_id β†’ emp_name, emp_phone, dept_id (λΆ€λΆ„: emp_id 단독에 의쑴) - proj_id β†’ proj_name, proj_budget (λΆ€λΆ„: proj_id 단독에 의쑴)

2NF에 μ—†μŒ. λΆ„ν•΄:

Employee(emp_id, emp_name, emp_phone, dept_id)
    FD: emp_id β†’ emp_name, emp_phone, dept_id

Project(proj_id, proj_name, proj_budget)
    FD: proj_id β†’ proj_name, proj_budget

Assignment(emp_id, proj_id, hours_worked, role)
    FD: {emp_id, proj_id} β†’ hours_worked, role

이제 2NF에 있음. βœ“

10.4 3NF 확인

Employee(emp_id, emp_name, emp_phone, dept_id)

ν‚€: {emp_id}

전이 쒅속성이 μžˆλŠ”κ°€? - emp_id β†’ dept_id (직접) βœ“ - ν•˜μ§€λ§Œ dept_name, dept_budget은 어디에? μ œκ±°λ˜μ—ˆμŒ β€” ν•˜μ§€λ§Œ μ›λž˜ FD dept_id β†’ dept_name, dept_budget이 있음. dept_nameκ³Ό dept_budget이 더 이상 이 λ¦΄λ ˆμ΄μ…˜μ— μ—†μœΌλ―€λ‘œ 이 λ¦΄λ ˆμ΄μ…˜ 내에 전이 쒅속성이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ.

μ‹€μ œλ‘œ μž¬κ³ ν•΄λ΄…μ‹œλ‹€. μ›λž˜ FD dept_id β†’ dept_name, dept_budget은 Employeeκ°€ dept_nameμ΄λ‚˜ dept_budget을 ν¬ν•¨ν•΄μ„œλŠ” μ•ˆ λœλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 그리고 ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ β€” 단계 2의 뢄해와 ν•¨κ»˜ κ°”μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ Department ν…Œμ΄λΈ”μ΄ ν•„μš”ν•©λ‹ˆλ‹€:

Employee(emp_id, emp_name, emp_phone, dept_id)

남은 속성듀 사이에 전이 쒅속성이 μžˆλŠ”κ°€? emp_id β†’ emp_name, emp_phone, dept_id. λͺ¨λ‘ ν‚€λ‘œλΆ€ν„°μ˜ 직접 쒅속성. 이 ν…Œμ΄λΈ” λ‚΄μ—μ„œ λΉ„μ£Όμš” 속성이 λ‹€λ₯Έ λΉ„μ£Όμš” 속성을 κ²°μ •ν•˜μ§€ μ•ŠμŒ (emp_phone이 dept_idλ₯Ό κ²°μ •ν•˜μ§€ μ•ŠμŒ λ“±).

3NF에 있음 βœ“.

ν•˜μ§€λ§Œ μ›λž˜ μŠ€ν‚€λ§ˆμ˜ FD dept_id β†’ dept_name, dept_budget은 "κ³ μ•„"μž…λ‹ˆλ‹€. Department ν…Œμ΄λΈ”μ΄ ν•„μš”ν•©λ‹ˆλ‹€:

Department(dept_id, dept_name, dept_budget)
    ν‚€: {dept_id}

이제 λͺ¨λ“  λ¦΄λ ˆμ΄μ…˜μ΄ 3NF에 있음:

Employee(emp_id, emp_name, emp_phone, dept_id)    β€” ν‚€: {emp_id}
Department(dept_id, dept_name, dept_budget)         β€” ν‚€: {dept_id}
Project(proj_id, proj_name, proj_budget)           β€” ν‚€: {proj_id}
Assignment(emp_id, proj_id, hours_worked, role)     β€” ν‚€: {emp_id, proj_id}

10.5 BCNF 확인

각 λ¦΄λ ˆμ΄μ…˜μ— λŒ€ν•΄ 확인: λͺ¨λ“  κ²°μ •μžκ°€ μŠˆνΌν‚€μΈκ°€?

  • Employee: emp_id β†’ (emp_name, emp_phone, dept_id). emp_idκ°€ ν‚€. βœ“
  • Department: dept_id β†’ (dept_name, dept_budget). dept_idκ°€ ν‚€. βœ“
  • Project: proj_id β†’ (proj_name, proj_budget). proj_idκ°€ ν‚€. βœ“
  • Assignment: {emp_id, proj_id} β†’ (hours_worked, role). {emp_id, proj_id}κ°€ ν‚€. βœ“

λͺ¨λ‘ BCNF에 있음! βœ“

10.6 λΆ„ν•΄ μš”μ•½

원본 (λΉ„μ •κ·œν™”):
    ProjectAssignment(emp_id, emp_name, emp_phone, dept_id, dept_name,
                      dept_budget, proj_id, proj_name, proj_budget,
                      hours_worked, role)

μ΅œμ’… (BCNF):
    Employee(emp_id, emp_name, emp_phone, dept_id)
    Department(dept_id, dept_name, dept_budget)
    Project(proj_id, proj_name, proj_budget)
    Assignment(emp_id, proj_id, hours_worked, role)

이상 ν˜„μƒ 제거: - κ°±μ‹ : λΆ€μ„œ 이름 λ³€κ²½μ‹œ Department의 ν•œ ν–‰λ§Œ μ—…λ°μ΄νŠΈ - μ‚½μž…: 직원 없이 λΆ€μ„œ μΆ”κ°€ κ°€λŠ₯ - μ‚­μ œ: ν”„λ‘œμ νŠΈμ˜ λͺ¨λ“  λ°°μ • μ œκ±°ν•΄λ„ ν”„λ‘œμ νŠΈ 정보 손싀 μ•ˆλ¨


11. SQLμ—μ„œμ˜ μ •κ·œν™”

11.1 μ •κ·œν™”λœ μŠ€ν‚€λ§ˆ κ΅¬ν˜„

CREATE TABLE Department (
    dept_id     INT PRIMARY KEY,
    dept_name   VARCHAR(100) NOT NULL,
    dept_budget DECIMAL(12, 2) NOT NULL
);

CREATE TABLE Employee (
    emp_id    INT PRIMARY KEY,
    emp_name  VARCHAR(100) NOT NULL,
    emp_phone VARCHAR(20),
    dept_id   INT NOT NULL,
    FOREIGN KEY (dept_id) REFERENCES Department(dept_id)
);

CREATE TABLE Project (
    proj_id     INT PRIMARY KEY,
    proj_name   VARCHAR(100) NOT NULL,
    proj_budget DECIMAL(12, 2) NOT NULL
);

CREATE TABLE Assignment (
    emp_id       INT NOT NULL,
    proj_id      INT NOT NULL,
    hours_worked DECIMAL(6, 2) NOT NULL DEFAULT 0,
    role         VARCHAR(50) NOT NULL,
    PRIMARY KEY (emp_id, proj_id),
    FOREIGN KEY (emp_id) REFERENCES Employee(emp_id),
    FOREIGN KEY (proj_id) REFERENCES Project(proj_id)
);

11.2 쿼리λ₯Ό ν†΅ν•œ μ •κ·œν™” 검증

κΈ°μ‘΄ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 잠재적 μ •κ·œν™” 문제 확인:

-- 잠재적 2NF μœ„λ°˜ 확인: λΆ€λΆ„ 쒅속성
-- 볡합 ν‚€μ˜ 일뢀와 상관관계가 μžˆλŠ” λΉ„ν‚€ μ»¬λŸΌμ— 쀑볡 값이 μžˆλŠ” 경우
SELECT emp_id, COUNT(DISTINCT emp_name) AS name_count
FROM project_assignment_denormalized
GROUP BY emp_id
HAVING COUNT(DISTINCT emp_name) > 1;
-- 이것이 행을 λ°˜ν™˜ν•˜λ©΄ emp_name이 μΌκ΄€λ˜μ§€ μ•Šκ²Œ μ €μž₯됨 (κ°±μ‹  이상)

-- 잠재적 3NF μœ„λ°˜ 확인: 전이 쒅속성
-- ν•¨κ»˜ μ΄λ™ν•˜λŠ” μ»¬λŸΌλ“€μ€ λˆ„λ½λœ μ—”ν‹°ν‹°λ₯Ό λ‚˜νƒ€λ‚Ό 수 있음
SELECT dept_id, COUNT(DISTINCT dept_name) AS names
FROM employee_denormalized
GROUP BY dept_id
HAVING COUNT(DISTINCT dept_name) > 1;
-- 이것이 행을 λ°˜ν™˜ν•˜λ©΄ μ£Όμ–΄μ§„ dept_id에 λŒ€ν•΄ dept_name이 μΌκ΄€λ˜μ§€ μ•ŠμŒ

12. μ •κ·œν˜• μš”μ•½

μ •κ·œν˜• 쑰건 μ œκ±°ν•˜λŠ” 것
1NF μ›μžμ  κ°’, 반볡 κ·Έλ£Ή μ—†μŒ λΉ„κ΄€κ³„ν˜• ꡬ쑰
2NF 1NF + λΆ€λΆ„ 쒅속성 μ—†μŒ λΆ€λΆ„ ν‚€ μ’…μ†μ„±μœΌλ‘œ μΈν•œ 쀑볡
3NF 2NF + 전이 쒅속성 μ—†μŒ 전이 μ’…μ†μ„±μœΌλ‘œ μΈν•œ 쀑볡
BCNF λͺ¨λ“  κ²°μ •μžκ°€ μŠˆνΌν‚€ λͺ¨λ“  FD 기반 쀑볡

μ˜μ‚¬κ²°μ • 흐름도

μ‹œμž‘: FD Fλ₯Ό κ°€μ§„ λ¦΄λ ˆμ΄μ…˜ R

R이 1NF에 μžˆλŠ”κ°€?
β”œβ”€β”€ μ•„λ‹ˆμ˜€ β†’ λΉ„μ›μžμ  κ°’κ³Ό 반볡 κ·Έλ£Ή 제거
└── 예 ↓

R이 2NF에 μžˆλŠ”κ°€?
β”œβ”€β”€ μ•„λ‹ˆμ˜€ β†’ λΆ€λΆ„ 쒅속성 제거 (ν‚€μ˜ 일뢀에 μ˜μ‘΄ν•˜λŠ”
β”‚         속성 뢄리)
└── 예 ↓

R이 3NF에 μžˆλŠ”κ°€?
β”œβ”€β”€ μ•„λ‹ˆμ˜€ β†’ 전이 쒅속성 제거 (λΉ„ν‚€ 속성에 μ˜μ‘΄ν•˜λŠ”
β”‚         속성 뢄리)
└── 예 ↓

R이 BCNF에 μžˆλŠ”κ°€?
β”œβ”€β”€ μ•„λ‹ˆμ˜€ β†’ 확인: 쒅속성 보쑴을 μžƒμ–΄λ„ λ˜λŠ”κ°€?
β”‚   β”œβ”€β”€ 예 β†’ BCNF μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ λΆ„ν•΄
β”‚   └── μ•„λ‹ˆμ˜€ β†’ 3NF에 λ¨Έλ¬ΌκΈ°
└── 예 β†’ μ™„λ£Œ!

13. μ—°μŠ΅ 문제(Exercises)

μ—°μŠ΅ 문제 1: μ •κ·œν˜• 식별

각 λ¦΄λ ˆμ΄μ…˜μ— λŒ€ν•΄ κ°€μž₯ 높은 μ •κ·œν˜• (1NF, 2NF, 3NF, λ˜λŠ” BCNF) 식별:

a) R(A, B, C, D), ν‚€: {A, B}, FD: A β†’ C, AB β†’ D

b) R(A, B, C), ν‚€: {A}, FD: A β†’ B, B β†’ C

c) R(A, B, C, D), ν‚€: {A}, FD: A β†’ BCD

d) R(A, B, C), ν‚€: {A, B}와 {A, C}, FD: AB β†’ C, AC β†’ B, B β†’ C, C β†’ B

ν•΄λ‹΅ **a)** A β†’ CλŠ” λΆ€λΆ„ 쒅속성 (Cκ°€ ν‚€ {A,B}의 일뢀에 의쑴). **1NF** (2NF μ•„λ‹˜). **b)** A β†’ B (ν‚€λ‘œλΆ€ν„° 직접, OK), B β†’ C (전이: A β†’ B β†’ C). 3NF μ•„λ‹˜. ν•˜μ§€λ§Œ λΆ€λΆ„ 쒅속성 μ—†μŒ (단일 속성 ν‚€), λ”°λΌμ„œ 2NF. **2NF** (3NF μ•„λ‹˜). **c)** ν‚€λ‘œλΆ€ν„°λ§Œ FD. λͺ¨λ“  κ²°μ •μž (A)κ°€ μŠˆνΌν‚€. **BCNF**. **d)** B β†’ C: BλŠ” μŠˆνΌν‚€κ°€ μ•„λ‹ˆμ§€λ§Œ CλŠ” μ£Όμš” 속성 (ν‚€ {A,C}의 일뢀). λ”°λΌμ„œ 3NF 성립. BλŠ” μŠˆνΌν‚€κ°€ μ•„λ‹ˆλ―€λ‘œ BCNF μ‹€νŒ¨. **3NF** (BCNF μ•„λ‹˜).

μ—°μŠ΅ 문제 2: 3NF ν•©μ„±

λ‹€μŒμ— 3NF ν•©μ„± μ•Œκ³ λ¦¬μ¦˜ 적용:

R(A, B, C, D, E)에 F = { A β†’ B, BC β†’ D, D β†’ E, E β†’ C }

ν•΄λ‹΅ **단계 1: μ΅œμ†Œ 컀버** RHS λΆ„ν•΄: 이미 단일 속성. BC β†’ Dμ—μ„œ λΆˆν•„μš”ν•œ LHS 확인: - B 제거: {C}⁺ = {C}. D βˆ‰ {C}⁺. B μœ μ§€. - C 제거: {B}⁺ = {B}. D βˆ‰ {B}⁺. C μœ μ§€. 쀑볡 FD 확인: - A β†’ B: Aβ†’B 없이 {A}⁺ = {A}. B βˆ‰ {A}⁺. μœ μ§€. - BC β†’ D: BCβ†’D 없이 {B,C}⁺ = {B,C}. D βˆ‰ {B,C}⁺. μœ μ§€. - D β†’ E: Dβ†’E 없이 {D}⁺ = {D}. E βˆ‰ {D}⁺. μœ μ§€. - E β†’ C: Eβ†’C 없이 {E}⁺ = {E}. C βˆ‰ {E}⁺. μœ μ§€. F_min = { A β†’ B, BC β†’ D, D β†’ E, E β†’ C } **단계 2: μŠ€ν‚€λ§ˆ 생성 (LHS둜 κ·Έλ£Ήν™”)** - R₁(A, B) from A β†’ B - Rβ‚‚(B, C, D) from BC β†’ D - R₃(D, E) from D β†’ E - Rβ‚„(E, C) from E β†’ C **단계 3: 후보 ν‚€ 확인** {A}⁺ = {A, B}. 전체 μ•„λ‹˜. {A, C}⁺ = {A, B, C, D, E}. 전체! 후보 ν‚€: {A, C}. {A, E}⁺ = {A, B, C, D, E} (Eβ†’C, Aβ†’B, BCβ†’D, Dβ†’E). 전체! 후보 ν‚€: {A, E}. {A, D}⁺ = {A, B, D, E, C}. 전체! 후보 ν‚€: {A, D}. R₁-Rβ‚„ 쀑 μ–΄λŠ 것도 {A,C}, {A,E}, λ˜λŠ” {A,D}λ₯Ό 전체 ν¬ν•¨ν•˜μ§€ μ•ŠμŒ. - R₁ = {A,B}: μ•„λ‹ˆμ˜€ - Rβ‚‚ = {B,C,D}: A μ—†μŒ - R₃ = {D,E}: A μ—†μŒ - Rβ‚„ = {E,C}: A μ—†μŒ Rβ‚… = {A, C} (λ˜λŠ” {A, D} λ˜λŠ” {A, E}) μΆ”κ°€. **단계 4: λΆ€λΆ„μ§‘ν•© 제거** Rβ‚„(E, C) βŠ† Rβ‚‚(B, C, D)? μ•„λ‹ˆμ˜€ (Eκ°€ R₂에 μ—†μŒ). μ œκ±°ν•  λΆ€λΆ„μ§‘ν•© μ—†μŒ. **μ΅œμ’… λΆ„ν•΄:**
R₁(A, B)       β€” ν‚€: {A}
Rβ‚‚(B, C, D)    β€” ν‚€: {B, C}
R₃(D, E)       β€” ν‚€: {D}
Rβ‚„(E, C)       β€” ν‚€: {E}
Rβ‚…(A, C)       β€” ν‚€: {A, C} (R의 후보 ν‚€)
λͺ¨λ‘ 3NF βœ“, 무손싀 쑰인 βœ“, 쒅속성 보쑴 βœ“.

μ—°μŠ΅ 문제 3: BCNF λΆ„ν•΄

BCNF둜 λΆ„ν•΄:

R(A, B, C, D)에 F = { AB β†’ C, C β†’ A, C β†’ D }

ν•΄λ‹΅ 후보 ν‚€: {A,B}와 {B,C} (검증: {A,B}⁺ = {A,B,C,D}, {B,C}⁺ = {A,B,C,D}). BCNF 확인: - AB β†’ C: {A,B}λŠ” μŠˆνΌν‚€. βœ“ - C β†’ A: {C}⁺ = {A,C,D}. CλŠ” μŠˆνΌν‚€κ°€ μ•„λ‹˜. **BCNF μœ„λ°˜!** - C β†’ D: 같은 문제. **BCNF μœ„λ°˜!** C β†’ Aμ—μ„œ λΆ„ν•΄ (λ˜λŠ” C β†’ AD): - {C}⁺ ∩ {A,B,C,D} = {A,C,D} - R₁ = (A, C, D) with key {C} - Rβ‚‚ = {C} βˆͺ ({A,B,C,D} - {A,C,D}) = (B, C) with key {B,C} R₁(A, C, D) 확인: - C β†’ A: CλŠ” Rβ‚μ˜ ν‚€. βœ“ - C β†’ D: CλŠ” Rβ‚μ˜ ν‚€. βœ“ - BCNF βœ“ Rβ‚‚(B, C) 확인: - μŠˆνΌν‚€κ°€ μ•„λ‹Œ κ²°μ •μžλ₯Ό κ°€μ§„ λΉ„μžλͺ…ν•œ FD μ—†μŒ. - BCNF βœ“ **BCNF λΆ„ν•΄: R₁(A, C, D), Rβ‚‚(B, C)** 쒅속성 보쑴: AB β†’ CλŠ” R₁과 Rβ‚‚ 쑰인 ν•„μš”. **보쑴 μ•ˆλ¨.**

μ—°μŠ΅ 문제 4: 무손싀 쑰인(Lossless-Join) 검증

λ‹€μŒ λΆ„ν•΄κ°€ 무손싀 쑰인(Lossless-Join) 속성을 κ°–λŠ”μ§€ κ²€μ¦ν•˜μ‹œμ˜€:

R(A, B, C, D)에 F = { A β†’ B, B β†’ C }

λΆ„ν•΄: R₁(A, B), Rβ‚‚(A, C), R₃(B, D)

ν•΄λ‹΅ 좔적(chase) ν…ŒμŠ€νŠΈ μ‚¬μš©: 초기 ν–‰λ ¬: | | A | B | C | D | |----|----|-----|-----|-----| | R₁ | a₁ | aβ‚‚ | b₁₃ | b₁₄ | | Rβ‚‚ | a₁ | bβ‚‚β‚‚ | a₃ | bβ‚‚β‚„ | | R₃ | b₃₁| aβ‚‚ | b₃₃ | aβ‚„ | A β†’ B 적용: R₁과 Rβ‚‚κ°€ Aμ—μ„œ 일치(= a₁). - R₁.B = aβ‚‚, Rβ‚‚.B = bβ‚‚β‚‚. R₁이 ꡬ별 기호λ₯Ό 가짐. Rβ‚‚.B = aβ‚‚λ‘œ μ„€μ •. | | A | B | C | D | |----|----|----|-----|-----| | R₁ | a₁ | aβ‚‚ | b₁₃ | b₁₄ | | Rβ‚‚ | a₁ | aβ‚‚ | a₃ | bβ‚‚β‚„ | | R₃ | b₃₁| aβ‚‚ | b₃₃ | aβ‚„ | B β†’ C 적용: R₁, Rβ‚‚, R₃가 Bμ—μ„œ 일치(= aβ‚‚). - C κ°’: b₁₃, a₃, b₃₃. a₃ 쑴재. λͺ¨λ‘ aβ‚ƒλ‘œ μ„€μ •. | | A | B | C | D | |----|----|----|----| ----| | R₁ | a₁ | aβ‚‚ | a₃ | b₁₄ | | Rβ‚‚ | a₁ | aβ‚‚ | a₃ | bβ‚‚β‚„ | | R₃ | b₃₁| aβ‚‚ | a₃ | aβ‚„ | 더 μ΄μƒμ˜ λ°˜λ³΅μ—μ„œ λ³€κ²½ μ—†μŒ. ν–‰ 확인: λͺ¨λ“  ꡬ별 기호λ₯Ό κ°€μ§„ ν–‰ μ—†μŒ. R₁은 b₁₄, Rβ‚‚λŠ” bβ‚‚β‚„, Rβ‚ƒλŠ” b₃₁을 가짐. **이 λΆ„ν•΄λŠ” 무손싀 쑰인(Lossless-Join)이 μ•„λ‹˜.** βœ— 문제점: R₃(B, D)λŠ” λ‹€λ₯Έ λ¦΄λ ˆμ΄μ…˜κ³Ό B만 κ³΅μœ ν•˜λ©°, BλŠ” D의 κ²°μ • 속성을 ν¬ν•¨ν•˜λŠ” μ–΄λ–€ λ¦΄λ ˆμ΄μ…˜μ˜ 킀도 μ•„λ‹˜. μ˜¬λ°”λ₯Έ λΆ„ν•΄: R₁(A, B), Rβ‚‚(B, C, D) β€” B β†’ Cκ°€ μ„±λ¦½ν•˜κ³  {B}κ°€ {B,C}에 μ œν•œλœ Rβ‚‚μ˜ ν‚€μ΄λ―€λ‘œ 무손싀. μ‹€μ œλ‘œ B β†’ DλŠ” μ£Όμ–΄μ§€μ§€ μ•ŠμŒ. FDλŠ” A β†’ B와 B β†’ C뿐. λ”°λΌμ„œ Dμ—λŠ” κ²°μ •ν•˜λŠ” FDκ°€ μ—†μŒ. μž¬κ³ ν•΄λ³΄λ©΄: {A}⁺ = {A,B,C}. ν‚€λŠ” Dλ₯Ό 포함해야 함: ν‚€ = {A, D}. 더 λ‚˜μ€ λΆ„ν•΄: R₁(A, B, C)와 Rβ‚‚(A, D). 곡톡 = {A}. A β†’ {B,C}. {A}λŠ” Rβ‚μ˜ ν‚€. 무손싀 βœ“.

μ—°μŠ΅ 문제 5: μ™„μ „ μ •κ·œν™”(Full Normalization)

ν•©μ„± μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ λ‹€μŒμ„ 3NF둜 μ •κ·œν™”ν•˜μ‹œμ˜€:

Library(isbn, title, author_id, author_name, publisher_id,
        publisher_name, publisher_city, branch_id, branch_name, copies)

FD:

isbn β†’ title, author_id, publisher_id
author_id β†’ author_name
publisher_id β†’ publisher_name, publisher_city
{isbn, branch_id} β†’ copies
branch_id β†’ branch_name
ν•΄λ‹΅ **단계 1: μ΅œμ†Œ 컀버(Minimal Cover)** μš°λ³€ λΆ„ν•΄:
isbn β†’ title, isbn β†’ author_id, isbn β†’ publisher_id,
author_id β†’ author_name,
publisher_id β†’ publisher_name, publisher_id β†’ publisher_city,
{isbn, branch_id} β†’ copies,
branch_id β†’ branch_name
이미 μ΅œμ†Œ (μš°λ³€μ— 단일 속성, λΆˆν•„μš”ν•œ μ’Œλ³€ μ—†μŒ, 쀑볡 FD μ—†μŒ). **단계 2: μ’Œλ³€μœΌλ‘œ κ·Έλ£Ήν™”** - R₁(isbn, title, author_id, publisher_id) β€” isbn β†’ title, author_id, publisher_idμ—μ„œ - Rβ‚‚(author_id, author_name) β€” author_id β†’ author_nameμ—μ„œ - R₃(publisher_id, publisher_name, publisher_city) β€” publisher_id β†’ publisher_name, publisher_cityμ—μ„œ - Rβ‚„(isbn, branch_id, copies) β€” {isbn, branch_id} β†’ copiesμ—μ„œ - Rβ‚…(branch_id, branch_name) β€” branch_id β†’ branch_nameμ—μ„œ **단계 3: 후보 ν‚€ = {isbn, branch_id}** Rβ‚„κ°€ {isbn, branch_id}λ₯Ό 포함함. βœ“ **단계 4: μ œκ±°ν•  λΆ€λΆ„μ§‘ν•© μ—†μŒ.** **μ΅œμ’… 3NF λΆ„ν•΄:**
Book(isbn, title, author_id, publisher_id)         β€” ν‚€: {isbn}
Author(author_id, author_name)                      β€” ν‚€: {author_id}
Publisher(publisher_id, publisher_name, publisher_city) β€” ν‚€: {publisher_id}
BranchStock(isbn, branch_id, copies)                β€” ν‚€: {isbn, branch_id}
Branch(branch_id, branch_name)                      β€” ν‚€: {branch_id}
λͺ¨λ“  κ²°μ •μžκ°€ 단일 속성 ν‚€(λ˜λŠ” BranchStock의 볡합 ν‚€)μ΄λ―€λ‘œ BCNF이기도 함.

μ—°μŠ΅ 문제 6: 이상(Anomaly) 식별

λ‹€μŒ λ¦΄λ ˆμ΄μ…˜κ³Ό μƒ˜ν”Œ 데이터λ₯Ό 보고, ꡬ체적인 κ°±μ‹ , μ‚½μž…, μ‚­μ œ 이상을 μ‹λ³„ν•˜μ‹œμ˜€:

CourseSection(course_id, section, semester, instructor, building, room)

FDs: {course_id, section, semester} β†’ instructor, building, room
     building, room β†’ capacity   (capacity도 μ†μ„±μœΌλ‘œ κ°€μ •)
| course_id | section | semester | instructor | building | room | capacity |
|-----------|---------|----------|------------|----------|------|----------|
| CS101     | 1       | Fall24   | Dr. Smith  | Watson   | 101  | 50       |
| CS101     | 2       | Fall24   | Dr. Jones  | Watson   | 101  | 50       |
| CS201     | 1       | Fall24   | Dr. Smith  | Watson   | 201  | 30       |
| CS201     | 1       | Spr25    | Dr. Smith  | Taylor   | 105  | 40       |
ν•΄λ‹΅ **κ°±μ‹  이상(Update Anomaly)**: Watson 101의 수용 인원이 λ³€κ²½λ˜λ©΄(예: 리λͺ¨λΈλ§μœΌλ‘œ μ’Œμ„ μΆ”κ°€), μ—¬λŸ¬ ν–‰(ν–‰ 1κ³Ό 2)을 κ°±μ‹ ν•΄μ•Ό 함. ν–‰ 1만 κ°±μ‹ ν•˜λ©΄ ν–‰ 1κ³Ό 2κ°€ λΆˆμΌμΉ˜ν•˜κ²Œ 됨. **μ‚½μž… 이상(Insertion Anomaly)**: ν•΄λ‹Ή κ°•μ˜μ‹€μ— μ˜ˆμ •λœ μˆ˜μ—…μ΄ μ—†μœΌλ©΄ Taylor 302의 수용 인원이 60μž„μ„ 기둝할 수 μ—†μŒ. κ°•μ˜μ‹€ 정보λ₯Ό λ…λ¦½μ μœΌλ‘œ μ €μž₯ν•  방법이 μ—†μŒ. **μ‚­μ œ 이상(Deletion Anomaly)**: CS201 Section 1 Spring 2025κ°€ μ·¨μ†Œλ˜λ©΄(ν–‰ 4 μ‚­μ œ), Taylor 105의 수용 인원이 40μž„μ„ μ•Œ 수 μ—†κ²Œ 됨(ν•΄λ‹Ή κ°•μ˜μ‹€μ„ μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ μˆ˜μ—…μ΄ μ—†λ‹€κ³  κ°€μ •). **κ·Όλ³Έ 원인**: 전이 쒅속성(Transitive Dependency) {course_id, section, semester} β†’ {building, room} β†’ capacityκ°€ 쀑볡을 λ§Œλ“¦. **ν•΄κ²°**: λ‹€μŒκ³Ό 같이 λΆ„ν•΄:
CourseSection(course_id, section, semester, instructor, building, room)
Room(building, room, capacity)

14. μš”μ•½(Summary)

κ°œλ… 핡심 아이디어
1NF μ›μžμ  κ°’λ§Œ β€” κ΄€κ³„ν˜• λͺ¨λΈμ˜ 기초
2NF λΆ€λΆ„ 쒅속성 μ—†μŒ β€” λͺ¨λ“  λΉ„μ£Όμš” 속성이 전체 킀에 의쑴
3NF 전이 쒅속성 μ—†μŒ β€” λΉ„μ£Όμš” 속성이 ν‚€μ—λ§Œ 의쑴
BCNF λͺ¨λ“  κ²°μ •μžκ°€ μŠˆνΌν‚€ β€” κ°€μž₯ μ—„κ²©ν•œ FD 기반 ν˜•νƒœ
무손싀 쑰인 μžμ—° 쑰인이 μ›λž˜ 데이터 볡ꡬ β€” ν•„μˆ˜
쒅속성 보쑴 λͺ¨λ“  FDλ₯Ό 쑰인 없이 확인 κ°€λŠ₯ β€” λ°”λžŒμ§ν•˜μ§€λ§Œ λ•Œλ•Œλ‘œ BCNFλ₯Ό μœ„ν•΄ 희생
3NF ν•©μ„± 무손싀 쑰인과 쒅속성 보쑴 λͺ¨λ‘ 보μž₯
BCNF λΆ„ν•΄ 무손싀 쑰인 보μž₯; 쒅속성 보쑴 μžƒμ„ 수 있음

BCNFκΉŒμ§€μ˜ μ •κ·œν™”λŠ” ν•¨μˆ˜ μ’…μ†μ„±μœΌλ‘œ μΈν•œ λͺ¨λ“  쀑볡을 μ²˜λ¦¬ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ μœ ν˜•μ˜ 쒅속성 β€” λ‹€μΉ˜ 쒅속성과 쑰인 쒅속성 β€” 이 μžˆμ–΄ 더 높은 μ •κ·œν˜•μ΄ ν•„μš”ν•©λ‹ˆλ‹€. μ΄λŠ” λ‹€μŒ λ ˆμŠ¨μ—μ„œ νƒκ΅¬ν•©λ‹ˆλ‹€.


이전: 05_Functional_Dependencies.md | λ‹€μŒ: 07_Advanced_Normalization.md

to navigate between lessons