7. Relational Database Design (2)
Functional Dependency Theory
Functional-Dependency Theory Roadmap
- μ£Όμ΄μ§ ν¨μ μ’ μμ±(Functional dependency) μ§ν©μ μν΄ λ Όλ¦¬μ μΌλ‘ ν¨μΆλλ ν¨μ μ’ μμ±μ μλ €μ£Όλ νμ μ΄λ‘ (formal theory)μ κ³ λ €
- BCNFμ 3NFλ‘μ 무μμ€ λΆν΄(lossless decomposition)λ₯Ό μμ±νλ μκ³ λ¦¬μ¦ κ°λ°
- λΆν΄κ° μ’ μμ± λ³΄μ‘΄(dependency-preserving)μΈμ§ ν μ€νΈνλ μκ³ λ¦¬μ¦ κ°λ°
Closure of a Set of Functional Dependencies
- Armstrong's Axioms(μμ€νΈλ‘± 곡리)λ₯Ό λ°λ³΅μ μΌλ‘ μ μ©νμ¬ F+(νν¬) κ³μ° κ°λ₯:
- Reflexivity rule(λ°μ¬ κ·μΉ): μ΄λ©΄
- Augmentation rule(μ¦κ° κ·μΉ): μ΄λ©΄
- Transitivity rule(μ΄ν κ·μΉ): μ΄κ³ μ΄λ©΄
- μ΄λ¬ν κ·μΉλ€μ
- Sound(건μ ν¨): μ€μ λ‘ μ±λ¦½νλ ν¨μ μ’ μμ±λ§ μμ±
- Complete(μμ ν¨): μ±λ¦½νλ λͺ¨λ ν¨μ μ’ μμ±μ μμ±
- μΆκ° κ·μΉ:
- Union rule(ν©μ§ν© κ·μΉ): μ΄κ³ μ΄λ©΄
- Decomposition rule(λΆν΄ κ·μΉ): μ΄λ©΄ μ΄κ³
- Pseudotransitivity rule(μμ¬ μ΄ν κ·μΉ): μ΄κ³ μ΄λ©΄
- μμ κ·μΉλ€μ μμ€νΈλ‘± 곡리λ‘λΆν° μ μΆ κ°λ₯
Example of F+
- ,
- μ μΌλΆ λ©€λ²
- μ λ‘λΆν° μ΄ν κ·μΉμ μν΄
- λ₯Ό λ‘ μ¦κ°μμΌ λ₯Ό μ»μ
- κ·Έλ¦¬κ³ μμ μ΄ν κ·μΉμ μν΄ λ₯Ό μ»μ
- λ₯Ό λ‘ μ¦κ°μμΌ λ₯Ό μ»μ
- λ₯Ό λ‘ μ¦κ°μμΌ λ₯Ό μ»μ
- κ·Έλ¦¬κ³ μ΄ν κ·μΉμ μν΄ λ₯Ό μ»μ
(Optional) Procedure for Computing F+
- ν¨μ μ’
μμ± μ§ν© Fμ νν¬λ₯Ό κ³μ°νλ μ μ°¨:
F+ = F repeat for each functional dependency f in F+ apply reflexivity and augmentation rules on f add the resulting functional dependencies to F+ for each pair of functional dependencies f1 and f2 in F+ if f1 and f2 can be combined using transitivity then add the resulting functional dependency to F+ until F+ does not change any further - μ°Έκ³ : μ΄ μμ μ μν λμμ μ μ°¨λ λμ€μ μ΄ν΄λ³Ό κ²μ
Closure of Attribute Sets
- μμ± Bλ μΌ λ μ μν΄ ν¨μμ μΌλ‘ κ²°μ λλ€κ³ ν¨
- μμ± μ§ν© κ° μ£Όμ΄μ‘μ λ, νμμ μ Closure(νν¬)(λ‘ νκΈ°)λ νμμ μ μν΄ ν¨μμ μΌλ‘ κ²°μ λλ μμ±λ€μ μ§ν©μΌλ‘ μ μλ¨
- κ° μ μμ
- νμμ μ νν¬ λ₯Ό κ³μ°νλ μκ³ λ¦¬μ¦
result := Ξ±; while(changes to result) do for each Ξ²βΞ³ in F do begin if Ξ² β result then result := result βͺ Ξ³ end
Example of Attribute Set Closure
result = AGresult = ABCG( μ )result = ABCGH()result = ABCGHI()
- AGλ ν보 ν€(candidate key)μΈκ°?
- AGλ μνΌν€(superkey)μΈκ°?
- μΈκ°? μΈκ°?
- AGμ μμμ λΆλΆμ§ν©μ΄ μνΌν€μΈκ°?
- μΈκ°? μΈκ°?
- μΈκ°? μΈκ°?
- μΌλ°μ μΌλ‘: ν¬κΈ° n-1μ κ° λΆλΆμ§ν©μ λν΄ νμΈ
- AGλ μνΌν€(superkey)μΈκ°?
Uses of Attribute Closure
- μμ± νν¬ μκ³ λ¦¬μ¦μ μ¬λ¬ μ©λ:
- μνΌν€ ν
μ€νΈ:
- κ° μνΌν€μΈμ§ ν μ€νΈνκΈ° μν΄, λ₯Ό κ³μ°νκ³ κ° μ λͺ¨λ μμ±μ ν¬ν¨νλμ§ νμΈ
- ν¨μ μ’
μμ± ν
μ€νΈ:
- ν¨μ μ’ μμ± κ° μ±λ¦½νλμ§(μ¦, μ μλμ§) νμΈνλ €λ©΄, μΈμ§ νμΈνλ©΄ λ¨
- κ°λ¨νκ³ μ λ ΄ν ν μ€νΈμ΄λ©° λ§€μ° μ μ©ν¨
- Fμ νν¬ κ³μ°:
- κ° μ λν΄, νν¬ λ₯Ό μ°Ύκ³ , κ° μ λν΄ ν¨μ μ’ μμ± λ₯Ό μΆλ ₯
- μνΌν€ ν
μ€νΈ:
Canonical Cover
- ν¨μ μ’ μμ± μ§ν© Fλ₯Ό κ°λ κ΄κ³ μ€ν€λ§ κ°μ
- μ¬μ©μκ° κ΄κ³μ λν μ
λ°μ΄νΈλ₯Ό μνν λλ§λ€,
- λ°μ΄ν°λ² μ΄μ€ μμ€ν μ μ λ°μ΄νΈκ° μ΄λ€ FDλ μλ°νμ§ μμμ 보μ₯ν΄μΌ ν¨
- μ¦, μλ‘μ΄ λ°μ΄ν°λ² μ΄μ€ μνμμ Fμ μλ λͺ¨λ FDκ° λ§μ‘±λμ΄μΌ ν¨
- μ λ°μ΄νΈκ° μ§ν© Fμ μ΄λ€ FDλ₯Ό μλ°νλ©΄, μμ€ν μ μ λ°μ΄νΈλ₯Ό λ‘€λ°±(roll back)ν΄μΌ ν¨
- μλ° μ¬λΆλ₯Ό νμΈνλ λ° λλ λ
Έλ ₯μ μ€μΌ μ μμ
- μ£Όμ΄μ§ μ§ν©κ³Ό λμΌν νν¬λ₯Ό κ°λ λ¨μνλ FD μ§ν©μ ν μ€νΈν¨μΌλ‘μ¨
- μ΄ λ¨μνλ μ§ν©μ Canonical cover(μ κ· μ»€λ²)λΌκ³ ν¨
- μ κ· μ»€λ²λ₯Ό μ μνκΈ° μν΄ λ¨Όμ Extraneous attribute(λΆνμν μμ±)λ₯Ό μ μν΄μΌ ν¨
Extraneous Attributes
- FDμ μΌμͺ½μμ μμ±μ μ κ±°νλ©΄ μ μ½μ‘°κ±΄μ΄ λ κ°ν΄μ§
- κ° μκ³ λ₯Ό μ κ±°νλ©΄, μ μ¬μ μΌλ‘ λ κ°ν κ²°κ³ΌμΈ λ₯Ό μ»μ
- λ λ₯Ό λ Όλ¦¬μ μΌλ‘ ν¨μΆνμ§λ§, μ체λ§μΌλ‘λ λ₯Ό λ Όλ¦¬μ μΌλ‘ ν¨μΆνμ§ μκΈ° λλ¬Έμ λ κ°ν μ μμ
- μ§ν© Fμ λ°λΌ, μμ λ₯Ό μμ νκ² μ κ±°ν μ μμ
- μ:
- κ·Έλ¬λ©΄ Fλ λ Όλ¦¬μ μΌλ‘ λ₯Ό ν¨μΆνλ―λ‘(μ΄νμ±), μμ Bλ λΆνμν¨
- FDμ μ€λ₯Έμͺ½μμ μμ±μ μ κ±°νλ©΄ μ μ½μ‘°κ±΄μ΄ λ μ½ν΄μ§ μ μμ
- κ° μκ³ λ₯Ό μ κ±°νλ©΄, μ μ¬μ μΌλ‘ λ μ½ν κ²°κ³ΌμΈ λ₯Ό μ»μ
- λ§μΌλ‘λ λ₯Ό μΆλ‘ ν μ μμΌλ―λ‘ λ μ½ν μ μμ
- μ§ν© Fμ λ°λΌ, μμ λ₯Ό μμ νκ² μ κ±°ν μ μμ
- μ:
- λ₯Ό λ‘ λ체ν νμλ, μ¬μ ν λ₯Ό μΆλ‘ ν μ μμΌλ©°(λ‘λΆν°), λ°λΌμ λ₯Ό μΆλ‘ ν μ μμμ λ³΄μΌ μ μμ
Extraneous Attributes
- Fμ μλ FDμ μμ±μ F+λ₯Ό λ³κ²½νμ§ μκ³ μ κ±°ν μ μμ λ λΆνμν¨
- ν¨μ μ’
μμ± μ§ν© Fμ Fμ μλ FD λ₯Ό κ³ λ €
- μΌμͺ½μμ μ κ±°: μμ± λ μμ λΆνμν¨ if
- μ΄κ³
- Fλ λ₯Ό λ Όλ¦¬μ μΌλ‘ ν¨μΆ
- μ€λ₯Έμͺ½μμ μ κ±°: μμ± λ μμ λΆνμν¨ if
- μ΄κ³
- ν¨μ μ’ μμ± μ§ν© κ° Fλ₯Ό λ Όλ¦¬μ μΌλ‘ ν¨μΆ
- μΌμͺ½μμ μ κ±°: μμ± λ μμ λΆνμν¨ if
- μ¦, μ½ν Fλ‘λΆν° λ κ°ν Fλ₯Ό λ Όλ¦¬μ μΌλ‘ ν¨μΆν μ μμ λ μμ±μ λΆνμν¨
- μ°Έκ³ : "λ κ°ν" ν¨μ μ’ μμ±μ νμ "λ μ½ν" κ²μ ν¨μΆνλ―λ‘, μμ κ° κ²½μ°μμ λ°λ λ°©ν₯μ ν¨μΆμ μλͺ ν¨
Testing if an Attribute is Extraneous
- κ΄κ³ μ€ν€λ§ κ³Ό μμ μ±λ¦½νλ ν¨μ μ’ μμ± μ§ν© λ₯Ό κ°μ νκ³ , ν¨μ μ’ μμ± μ μμ±μ κ³ λ €
- μμ± κ° μμ λΆνμνμ§ ν
μ€νΈ
- λ μ½ν μ§ν© κ³ λ €:
- νμμ κ° λ₯Ό ν¬ν¨νλμ§ νμΈ; ν¬ν¨νλ©΄, λ μμ λΆνμν¨
- μμ± κ° μμ λΆνμνμ§ ν
μ€νΈ
- λΌ νμ. λ κ°ν FD κ° Fλ‘λΆν° μΆλ‘ λ μ μλμ§ νμΈ
- Fμ μ’ μμ±μ μ¬μ©νμ¬ λ₯Ό κ³μ°
- κ° μ λͺ¨λ μμ±μ ν¬ν¨νλ©΄, λ μμ λΆνμν¨
- λΆνμν μμ±μ μ
- μμ κ° λΆνμνμ§ νμΈνκΈ° μν΄,
- νμμ μ μμ± νν¬ κ³μ°
- νν¬λ μ΄λ©°, λ₯Ό ν¬ν¨ν¨
- μ΄λ κ° λΆνμν¨μ μλ―Έ
Canonical Cover
- Fμ λν μ κ· μ»€λ² λ λ€μκ³Ό κ°μ μ’
μμ± μ§ν©μ
- Fλ μ λͺ¨λ μ’ μμ±μ λ Όλ¦¬μ μΌλ‘ ν¨μΆ
- λ Fμ λͺ¨λ μ’ μμ±μ λ Όλ¦¬μ μΌλ‘ ν¨μΆ
- μ μ΄λ€ ν¨μ μ’ μμ±λ λΆνμν μμ±μ ν¬ν¨νμ§ μμ
- μ κ° ν¨μ μ’ μμ±μ μΌμͺ½μ κ³ μ ν¨. μ¦, μΈ λ μ’ μμ± κ³Ό κ° μ μ‘΄μ¬νμ§ μμ
- μ΄λ λ₯Ό μλ―Έ
- μ§κ΄μ μΌλ‘, Fμ μ κ· μ»€λ²λ μ€λ³΅ μ’ μμ±μ΄λ μ’ μμ±μ μ€λ³΅ λΆλΆμ΄ μλ, Fμ λλ±ν "μ΅μ" FD μ§ν©μ.
Canonical Cover
- Fμ λν μ κ· μ»€λ²λ₯Ό κ³μ°νλ λ°©λ²:
FC = F repeat Use the union rule to replace any dependencies in FC of the form Ξ±1βΞ²1 and Ξ±1βΞ²2 with Ξ±1βΞ²1Ξ²2 Find a functional dependency Ξ±βΞ² in FC with an extraneous attribute either in Ξ± or in Ξ² /- Note: test for extraneous attributes done using FC, not F -/ If an extraneous attribute is found, delete it from Ξ±βΞ² in FC until (FC does not change) - μ°Έκ³ : μΌλΆ λΆνμν μμ±μ΄ μμ λ ν ν©μ§ν© κ·μΉμ΄ μ μ© κ°λ₯ν΄μ§ μ μμΌλ―λ‘, λ€μ μ μ©ν΄μΌ ν¨.
Example: Computing a Canonical Cover
- ,
- μ λ₯Ό λ‘ κ²°ν©
- λ μ΄μ
- μμ κ° λΆνμν¨
- μμ λ₯Ό μμ ν κ²°κ³Ό(μ¦, )κ° λ€λ₯Έ μ’ μμ±λ€μ μν΄ ν¨μΆλλμ§ νμΈ
- μ: μ¬μ€ λ μ΄λ―Έ μ‘΄μ¬ν¨
- λ μ΄μ
- μμ κ° λΆνμν¨
- κ° μ λ€λ₯Έ μ’ μμ±λ€μ μν΄ λ Όλ¦¬μ μΌλ‘ ν¨μΆλλμ§ νμΈ
- μ: μ μ λν μ΄νμ±μ μ¬μ©νμ¬
- λ 볡μ‘ν κ²½μ°μλ Aμ μμ± νν¬λ₯Ό μ¬μ©ν μ μμ
- μ κ· μ»€λ²λ:
Dependency Preservation
- μ λν ν¨μ μ’ μμ± μ§ν© μ μ λΆν΄ μ κ°μ
- λ₯Ό μ μμ±λ§μ ν¬ν¨νλ μ λͺ¨λ FD μ§ν©(μ¦, Fμ μ λν μ ν)μ΄λΌ νκ³ , μ΄λΌ νμ
- λΆν΄κ° μ’
μμ±μ 보쑴νλ€λ©΄,
- μ¦, κ° μ FDλ₯Ό μ¬μ©νμ¬ μλ FDλ₯Ό ꡬμ±ν μ μμ
- λΆν΄κ° μ’ μμ±μ 보쑴νμ§ μμΌλ©΄ ν¨μ μ’ μμ± μλ°μ λν μ λ°μ΄νΈ νμΈ μ λΉμ©μ΄ λ§μ΄ λλ μ‘°μΈ(join)μ κ³μ°ν΄μΌ ν μ μμ
- κ·Έλ¬λ λΆν΄κ° μ’
μμ±μ 보쑴νλ©΄, μ΄λ¬ν νμΈμ΄ μ©μ΄ν΄μ§
- κ° μμ λ§ νμΈνλ©΄ μΆ©λΆν¨
- κ·Έλ¦¬κ³ μ λͺ¨λ FDλ μ μμ±λ§μ ν¬ν¨νλ―λ‘, μ‘°μΈμ νμ§ μκ³ νλμ κ΄κ³λ§ νμΈνμ¬ ν΄λΉ μ’ μμ±μ λ§μ‘± μ¬λΆλ₯Ό ν μ€νΈν μ μμ
(Optional) Testing for Dependency Preservation
- μ μΌλ‘ λΆν΄ν λ μ’
μμ± κ° λ³΄μ‘΄λλμ§ νμΈνκΈ° μν΄ λ€μ ν
μ€νΈλ₯Ό μ μ© (μμ± νν¬λ Fλ‘ κ³μ°)
result = Ξ± // resultλ Ξ±μ μ’ μλλ μμ±λ€μ μ§ν©, μ΄κΈ°μλ Ξ± μμ repeat for each Ri in the decomposition // Fi νμμ (result)+λ₯Ό μ°Ύμ t = (result β© Ri)+ β© Ri result = result βͺ t until (result does not change) // F' νμμ (result)+λ₯Ό μ°Ύμ resultκ° μ λͺ¨λ μμ±μ ν¬ν¨νλ©΄, ν¨μ μ’ μμ± λ 보쑴λ¨- λΆν΄κ° μ’ μμ±μ 보쑴νλμ§ νμΈνκΈ° μν΄ Fμ λͺ¨λ μ’ μμ±μ λν΄ ν μ€νΈλ₯Ό μ μ©
- μ΄ μ μ°¨λ μ λ₯Ό κ³μ°νλ λ° νμν μ§μ μκ°μ΄ μλ λ€ν μκ°μ΄ μμλ¨
Algorithms for Decomposition Using Functional Dependencies
Testing for BCNF
- μλͺ
νμ§ μμ(non-trivial) μ’
μμ± κ° BCNF μλ°μ μΌμΌν€λμ§ νμΈνκΈ° μν΄
- (μ μμ± νν¬)λ₯Ό κ³μ°νκ³ ,
- κ·Έκ²μ΄ μ λͺ¨λ μμ±μ ν¬ν¨νλμ§, μ¦ μ μνΌν€μΈμ§ νμΈ
- κ΄κ³ μ€ν€λ§ μ΄ BCNFμ μλμ§ νμΈνκΈ° μν΄
- λ¨μνλ ν μ€νΈ: κ° μλ μ FDμ λν΄μλ§ BCNF μλ° μ¬λΆ νμΈ
- μ μ’ μμ± μ€ μ΄λ κ²λ BCNF μλ°μ μΌμΌν€μ§ μμΌλ©΄, μ μ’ μμ± μ€ μ΄λ κ²λ BCNF μλ°μ μΌμΌν€μ§ μμ
- κ·Έλ¬λ, μ λΆν΄μμ κ΄κ³λ₯Ό ν μ€νΈν λ λ§ μ¬μ©νλ λ¨μνλ ν μ€νΈλ λΆμ νν¨
- , λ₯Ό κ³ λ €
- μ μ λ‘ λΆν΄
- μ μ’ μμ± μ€ μ΄λ κ²λ μ μμ±λ§μ ν¬ν¨νμ§ μμΌλ―λ‘, κ° BCNFλ₯Ό λ§μ‘±νλ€κ³ μ€ν΄ν μ μμ
- μ¬μ€, μ μ’ μμ± λ κ° BCNFμ μμ§ μμμ 보μ¬μ€
(Optional) Testing Decomposition for BCNF
- μ λΆν΄μ μλ κ΄κ³ κ° BCNFμ μλμ§ νμΈνκΈ° μν΄
- (μ¦, μ μμ±λ§μ ν¬ν¨νλ μ λͺ¨λ FD)μ λν΄ λ₯Ό BCNF ν μ€νΈ
- λλ μμ μ±λ¦½νλ μλμ μ’
μμ± μ§ν© Fλ₯Ό μ¬μ©νλ, λ€μ ν
μ€νΈλ₯Ό μ¬μ©:
- λͺ¨λ μμ± μ§ν© μ λν΄, κ° μ μμ±μ ν¬ν¨νμ§ μκ±°λ, μ λͺ¨λ μμ±μ ν¬ν¨νλμ§ νμΈ
- λ§μ½ μ μ΄λ€ μ μν΄ μ‘°κ±΄μ΄ μλ°λλ©΄, μ’ μμ± κ° μμ μ±λ¦½ν¨μ λ³΄μΌ μ μκ³ , λ BCNFλ₯Ό μλ°ν¨
- λ₯Ό λΆν΄νκΈ° μν΄ μμ μ’ μμ±μ μ¬μ©
- νμμ ν μ€νΈλ Fμ λͺ¨λ μμ λ₯Ό νμΈνλ λμ , μ 'λͺ¨λ μμ± λΆλΆμ§ν©'μ μμ± νν¬λ₯Ό νμΈ
BCNF Decomposition Algorithm
result := {R};
done := false;
compute F+;
while (not done) do
if (there is a schema Ri in result that is not in BCNF) then
begin
let Ξ±βΞ² be a nontrivial functional dependency that holds on Ri
such that Ξ±βRi is not in F+ , and Ξ±β©Ξ² = β
;
// μ΄λ Ξ±κ° Riμ μνΌν€κ° μλμ μλ―Έ
result := (result β Ri) βͺ (Ri β Ξ²) βͺ (Ξ±, Ξ²);
end
else
done := true;
- μ°Έκ³ : κ° λ BCNFμ μμΌλ©°, λΆν΄λ 무μμ€-μ‘°μΈ(lossless-join)μ.
Example of BCNF Decomposition
class(course_id, title, dept_name, credits, sec_id, semester, year, building, room_number, capacity, time_slot_id)- ν¨μ μ’
μμ±:
course_idβtitle, dept_name, creditsbuilding, room_numberβcapacitycourse_id, sec_id, semester, yearβbuilding, room_number, time_slot_id
- ν보 ν€:
{course_id, sec_id, semester, year} - BCNF λΆν΄:
course_idβtitle, dept_name, creditsκ° μ±λ¦½- κ·Έλ¬λ
course_idλ μνΌν€κ° μλ classλ₯Ό λ€μμΌλ‘ λ체:course(course_id, title, dept_name, credits)class-1(course_id, sec_id, semester, year, building, room_number, capacity, time_slot_id)
Example of BCNF Decomposition
courseλ BCNFμ μμbuilding, room_numberβcapacityκ°class-1μμ μ±λ¦½- κ·Έλ¬λ
{building, room_number}λclass-1μ μνΌν€κ° μλ class-1μ λ€μμΌλ‘ λ체:classroom(building, room_number, capacity)section(course_id, sec_id, semester, year, building, room_number, time_slot_id)
classroomκ³Όsectionμ BCNFμ μμ
Testing for 3NF
- BCNF ν μ€νΈμμμ²λΌ, μ FDλ§ νμΈνλ©΄ λ¨ (μ λͺ¨λ FDλ₯Ό νμΈν νμ μμ)
- κ° μ’ μμ± μ λν΄, κ° μνΌν€μΈμ§ μλμ§ νμΈνκΈ° μν΄ μμ± νν¬ μ¬μ©
- κ° μνΌν€κ° μλλ©΄, μ κ° μμ±μ΄ μ ν보 ν€μ ν¬ν¨λμ΄ μλμ§ νμΈν΄μΌ ν¨
- μ΄ ν μ€νΈλ ν보 ν€λ₯Ό μ°Ύλ κ²μ ν¬ν¨νλ―λ‘ μλΉν λ λΉμ©μ΄ λ§μ΄ λ¦
- 3NF ν μ€νΈλ NP-hard(NP-λν΄)μΈ κ²μΌλ‘ λνλ¨
- ν₯λ―Έλ‘κ²λ, 3NFλ‘μ λΆν΄λ λ€ν μκ°μ μνλ μ μμ
3NF Decomposition Algorithm
Let FC be a canonical cover for F;
i := 0;
for each FD Ξ±βΞ² in FC
i := i + 1;
Ri := Ξ±Ξ²;
if none of Rj(1 β€ j β€ i) contains a candidate key for R
then
i := i + 1;
Ri := any candidate key for R;
/- Optionally, remove redundant relations -/
repeat
if any schema Rj is contained in another schema Rk
then
/- delete Rj -/
Rj := Ri;
i := i - 1;
until no more Rjs can be deleted
return (R1, R2, ..., Ri)
- μ μκ³ λ¦¬μ¦μ λ€μμ 보μ₯
- κ° κ΄κ³ μ€ν€λ§ λ 3NFμ μμ
- λΆν΄λ μ’ μμ± λ³΄μ‘΄ λ° λ¬΄μμ€-μ‘°μΈμ
- μ νμ± μ¦λͺ μ κ΅μ¬(μΉμ 7.5.3) μ°Έμ‘°
3NF Decomposition: An Example
- κ΄κ³ μ€ν€λ§:
cust_banker_branch = (customer_id, employee_id, branch_name, type) - μ΄ κ΄κ³ μ€ν€λ§μ ν¨μ μ’
μμ±:
customer_id, employee_idβbranch_name, typeemployee_idβbranch_namecustomer_id, branch_nameβemployee_id
- λ¨Όμ μ κ· μ»€λ²λ₯Ό κ³μ°
- 첫 λ²μ§Έ μ’
μμ±μ μ€λ₯Έμͺ½μμ
branch_nameμ΄ λΆνμν¨ - λ€λ₯Έ λΆνμν μμ±μ μμΌλ―λ‘, λ₯Ό μ»μ
customer_id, employee_idβtypeemployee_idβbranch_namecustomer_id, branch_nameβemployee_id
- 첫 λ²μ§Έ μ’
μμ±μ μ€λ₯Έμͺ½μμ
3NF Decomposition: An Example
- for 루νλ λ€μμ 3NF μ€ν€λ§λ₯Ό μμ±:
(customer_id, employee_id, type)(employee_id, branch_name)(customer_id, branch_name, employee_id)
(customer_id, employee_id, type)μ΄ μλ μ€ν€λ§μ ν보 ν€λ₯Ό ν¬ν¨νλ―λ‘, λ μ΄μμ κ΄κ³ μ€ν€λ§λ₯Ό μΆκ°ν νμκ° μμ- for 루νμ λμμ,
(customer_id, branch_name, employee_id)μ€ν€λ§μ λΆλΆμ§ν©μΈ(employee_id, branch_name)μ€ν€λ§λ₯Ό κ°μ§νκ³ μμ - κ²°κ³Όμ μΈ λ¨μνλ 3NF μ€ν€λ§λ λ€μκ³Ό κ°μ:
(customer_id, employee_id, type)(customer_id, branch_name, employee_id)
Design Goals
- κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ μ€κ³μ λͺ©ν: μ€ν€λ§λ₯Ό λ€μκ³Ό κ°μ΄ λΆν΄
- BCNF
- Lossless(무μμ€)
- Dependency preservation(μ’ μμ± λ³΄μ‘΄)
- μ΄λ₯Ό λ¬μ±ν μ μλ€λ©΄, λ€μ μ€ νλλ₯Ό μμ©
- μ’ μμ± λ³΄μ‘΄μ λΆμ¬
- 3NF μ¬μ©μΌλ‘ μΈν μ€λ³΅μ±
- ν₯λ―Έλ‘κ²λ, SQLμ μνΌν€ μ΄μΈμ ν¨μ μ’
μμ±μ μ§μ νλ μ§μ μ μΈ λ°©λ²μ μ 곡νμ§ μμ
- Assertion(λ¨μΈ)μ μ¬μ©νμ¬ FDλ₯Ό μ§μ ν μ μμ§λ§, ν μ€νΈ λΉμ©μ΄ λΉμ (κ·Έλ¦¬κ³ νμ¬ λ리 μ¬μ©λλ λ°μ΄ν°λ² μ΄μ€μμ μ§μλμ§ μμ)
- μ’ μμ± λ³΄μ‘΄ λΆν΄κ° μλλΌλ, SQLμ μ¬μ©νλ©΄ μΌμͺ½μ΄ ν€κ° μλ ν¨μ μ’ μμ±μ ν¨μ¨μ μΌλ‘ ν μ€νΈν μ μμ
and Others
Initial Relation Schemas
- μ΄κΈ° κ΄κ³ μ€ν€λ§ Rμ΄ μ£Όμ΄μ‘μ λ:
- Rμ E-R λ€μ΄μ΄κ·Έλ¨μ ν μ΄λΈ μ§ν©μΌλ‘ λ³νν λ μμ±λμμ μ μμ
- Rμ κ΄μ¬ μλ λͺ¨λ μμ±μ ν¬ν¨νλ λ¨μΌ κ΄κ³(Universal relation, μ 체 κ΄κ³)μμ μ μμ
- μ κ·νλ Rμ λ μμ κ΄κ³λ‘ λΆν΄
- Rμ μμλ‘ μ€κ³λ κ΄κ³μ κ²°κ³ΌμΌ μ μμΌλ©°, μ΄λ₯Ό ν μ€νΈ/μ κ·νμΌλ‘ λ³ν
(Optional) E-R Model and Normalization
- E-R λ€μ΄μ΄κ·Έλ¨μ μ μ€νκ² μ€κ³νκ³ λͺ¨λ μν°ν°λ₯Ό μ¬λ°λ₯΄κ² μλ³νλ©΄, E-R λ€μ΄μ΄κ·Έλ¨μμ μμ±λ ν μ΄λΈμ μΆκ°μ μΈ μ κ·νκ° νμνμ§ μμμΌ ν¨
- κ·Έλ¬λ μ€μ (λΆμμ ν) μ€κ³μμλ μν°ν°μ ν€κ° μλ μμ±μμ μν°ν°μ λ€λ₯Έ μμ±μΌλ‘μ FDκ° μμ μ μμ (λ°λΌμ BCNFκ° μλ)
- μ:
employeeμν°ν°(ID, name, dept_name, building, salary) - ν¨μ μ’
μμ±
dept_nameβbuilding - μ’μ μ€κ³λ
departmentλ₯Ό μν°ν°λ‘ λ§λ€μμ κ²μ
- μ:
- κ΄κ³ μ§ν©μ ν€κ° μλ μμ±μμ λΉλ‘―λ ν¨μ μ’ μμ±μ κ°λ₯νμ§λ§, λλΆλΆμ κ΄κ³κ° μ΄ν(binary) κ΄κ³μ΄λ―λ‘ λλ¬Ύ
Denormalization for Performance
- μ±λ₯μ μν΄ λΉμ κ·νλ μ€ν€λ§λ₯Ό μ¬μ©νκ³ μΆμ μ μμ
- μ: κ³Όμ μ 보μ μ κ·Όν λλ§λ€ λͺ¨λ μ μκ³Όλͺ©μ΄ κ³Όμ μ 보μ ν¨κ» νμλμ΄μΌ νλ€κ³ κ°μ
- μ κ·νλ μ€ν€λ§μμλ
courseμprereqμ μ‘°μΈμ΄ νμ
- μ κ·νλ μ€ν€λ§μμλ
- λμ 1:
courseμprereqμ λͺ¨λ μμ±μ ν¬ν¨νλ λΉμ κ·νλ κ΄κ³ μ¬μ©- λ λΉ λ₯Έ μ‘°ν
- μ€λ³΅μ±μΌλ‘ μΈν μΆκ° κ³΅κ° λ° μ λ°μ΄νΈμ λν μΆκ° μ€ν μκ°
- μμ© νλ‘κ·Έλλ¨Έμ μΆκ° μ½λ© μμ λ° μΆκ° μ½λμ μ€λ₯ κ°λ₯μ±
- λμ 2:
courseβprereqλ‘ μ μλ Materialized view(ꡬ체νλ λ·°) μ¬μ©- νλ‘κ·Έλλ¨Έμ μΆκ° μ½λ© μμ μ΄ μκ³ κ°λ₯ν μ€λ₯λ₯Ό νΌνλ€λ μ μ μ μΈνλ©΄, μ₯λ¨μ μ μμ λμΌ
Limitation of the Normalization
- μ κ·νλ‘ ν¬μ°©λμ§ μλ λ°μ΄ν°λ² μ΄μ€ μ€κ³μ μΌλΆ μΈ‘λ©΄
- νΌν΄μΌ ν λμ λ°μ΄ν°λ² μ΄μ€ μ€κ³μ μ:
earnings(company_id, year, amount)λμ λ€μ μ¬μ©earnings_2004,earnings_2005,earnings_2006λ±, λͺ¨λ(company_id, earnings)μ€ν€λ§ μ¬μ©.- μλ BCNFμ μμ§λ§ λ§€λ μλ‘μ΄ ν μ΄λΈμ΄ νμνκ³ , κ° μλ‘μ΄ κ΄κ³λ₯Ό κ³ λ €νκΈ° μν΄ λ§€λ μλ‘μ΄ μΏΌλ¦¬λ₯Ό μμ±ν΄μΌ ν¨
- μ¬λ¬ ν΄μ κ±ΈμΉ μΏΌλ¦¬λ λ§μ κ΄κ³λ₯Ό μ°Έμ‘°ν΄μΌ νλ―λ‘ λ 볡μ‘ν΄μ§
company_year(company_id, earnings_2004, earnings_2005, earnings_2006)- BCNFμ μμ§λ§, μμ λμΌν λ¬Έμ κ° μμ
- ν μμ±μ κ°μ΄ μ΄ μ΄λ¦μ΄ λλ Crosstab(κ΅μ°¨ λΆμν)μ μλ‘, μ€νλ λμνΈμ λ°μ΄ν° λΆμ λꡬμμ μ¬μ©λ¨
