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 μ κ·νμ λͺ©ν¶
- μ€λ³΅ μ κ±°: κ° μ¬μ€μ μ νν ν λ²λ§ μ μ₯λ©λλ€
- μ΄μ λ°©μ§: μ λ°μ΄νΈ, μ½μ , μμ κ° κΉλν©λλ€
- μ 보 보쑴: λΆν΄ μ€μ λ°μ΄ν°κ° μμ€λμ§ μμ΅λλ€(무μμ€ μ‘°μΈ)
- μ μ½ μ‘°κ±΄ 보쑴: 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μ ν보 ν€)
μ°μ΅ λ¬Έμ 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
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}
μ°μ΅ λ¬Έμ 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