十、关系数据库设计理论(二)
5. 关系模式的规范化
- 设计不好的模式会出现存储异常,影响数据库的性能。
- 为了设计好的模式,人们研究了规范化理论:
- 1971年,E.F. Codd 首先提出了规范化的问题,给出了规范式 (Normal Form, NF) 的概念,根据关系模式所达到的不同行列,提出了 1NF、2NF、3NF;
- 1974年,Codd 和 Boyce 提出了 BCNF (Boyce-Codd Normal Form);
- 之后又研究了 4NF、5NF。
规范化理论可以用来改造关系模式
- 通过分解关系模式,消除不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余等问题。
规范化理论的基本概念——范式
- 范式就是规范化的关系模式,也就是满足一定要求的关系模式。
- 满足不同程度要求的关系模式为不同的范式。
- 数据库的范式从低到高有:
- 1NF、2NF、3NF、BC范式(BCNF)、4NF。
- 不同的范式其规范化程度是不同的。
一个数据库模式可以通过模式分解,从低一级的范式转化为若干个高一级的范式。
- 从低一级的范式通过分解达到高一级范式的过程称为关系模式的规范化。
规范化理论的核心
- 关系模式的规范化
第一范式 (1NF)
如果关系模式 R R R 的每一个属性对应的域值都是不可再分的,称关系模式属于第一范式,简记为 R ∈ 1 N F R \in 1NF R∈1NF。
第一范式是最低级别的关系模式。
如果数据库模式 R R R 中的每个关系模式都属于 1 N F 1NF 1NF,则数据库模式 R R R 也属于 1 N F 1NF 1NF。
一个数据库系统中的关系至少应该是 1 N F 1NF 1NF 的,这也是关系作为一维表的基本要求。
不满足 1 N F 1NF 1NF 的数据库模式不能称为关系数据库。
满足 1 N F 1NF 1NF 的关系模式不一定是好的关系模式。
第二范式 (2NF)
设关系模式 R R R, A A A 是 R R R 中的属性, F F F 是 R R R 上的函数依赖集。如果 A A A 包含在 R R R 的某个候选键中,称 A A A 为主属性,否则称 A A A 为非主属性。
如果一个关系模式 R ∈ 1 N F R \in 1NF R∈1NF,且所有非主属性都完全依赖于 R R R 的每一个候选键,则 R ∈ 2 N F R \in 2NF R∈2NF。
如果数据库模式 R R R 中的每个关系模式都属于 2 N F 2NF 2NF,则数据库模式 R ∈ 2 N F R \in 2NF R∈2NF。
判定一个关系模式是否属于 2NF
需要:
- 了解关系模式的属性间存在哪些函数依赖;
- 根据函数依赖关系,找出关系模式的候选键;
- 确定哪些属性是主属性,哪些属性是非主属性;
- 确定非主属性与候选键之间是否存在完全函数依赖关系,以判定该模式是否属于 2NF。
借书关系
- BORROW(CARDNO, NAME, DEPT, MN, BNO, DATE)
- 是 1NF,但不是 2NF
- BORROW 的候选键: ( C A R D N O , B N O ) (CARDNO, BNO) (CARDNO,BNO),注意这是个属性集和
- 函数依赖:
- C A R D N O → N A M E CARDNO \rightarrow NAME CARDNO→NAME
- C A R D N O → D E P T CARDNO \rightarrow DEPT CARDNO→DEPT
- C A R D N O → M N CARDNO \rightarrow MN CARDNO→MN
- D E P T → M N DEPT \rightarrow MN DEPT→MN
- ( C A R D N O , B N O ) → D A T E (CARDNO, BNO) \rightarrow DATE (CARDNO,BNO)→DATE
- 属性 N A M E NAME NAME, D E P T DEPT DEPT 和 M N MN MN 部分依赖于 BORROW 的候选键 ( C A R D N O , B N O ) (CARDNO, BNO) (CARDNO,BNO)。因此,BORROW ∉ 2 N F \notin 2NF ∈/2NF,存在插入异常、删除异常、数据冗余、修改复杂等问题。(问题的原因在于部分依赖)
- BORROW(CARDNO, NAME, DEPT, MN, BNO, DATE)
解决方法
BORROW 分解为两个关系模式,以消除这些部分函数依赖:
- LOANS(CARDNO, NAME, DEPT, MN) ∈ \in ∈ 2NF
- BORROW’(CARDNO, BNO, DATE) ∈ \in ∈ 2NF
将一个 1NF 的关系分解为多个 2NF 的关系,可以在一定程度上减少原 1NF 关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
2NF 不能完全消除关系模式中的各类存储异常。
- 例如:
第三范式 (3NF)
LOANS 存在存储异常的原因
LOANS(CARDNO, NAME, DEPT, MN) ∈ 2NF
存在传递函数依赖:- C A R D N O → D E P T , D E P T → M N CARDNO \rightarrow DEPT, DEPT \rightarrow MN CARDNO→DEPT,DEPT→MN,且 D E P T ↛ C A R D N O DEPT \not\rightarrow CARDNO DEPT→CARDNO,因此,存在传递函数依赖 C A R D N O → M N CARDNO \rightarrow MN CARDNO→MN。
如果将 LOANS 进一步分解,消除传递函数依赖,即可消除存储异常:
定义10.18
定义 10.18
设 R ∈ 1 N F R \in 1NF R∈1NF,若在 R R R 中没有非主属性传递依赖于 R R R 的候选键,则关系模式 R ∈ 3 N F R \in 3NF R∈3NF。如果数据库模式 R R R 中每个关系模式都是 3NF,则数据库模式 R ∈ 3 N F R \in 3NF R∈3NF。
一个 2NF 的关系模式不一定属于 3NF。2NF 仅消除了非主属性和主属性之间的部分依赖,如果存在传递依赖还需要进一步规范化。
一个关系模式若是 3NF 的,则一定属于 2NF。
一个关系模式若不是 2NF 的,则一定也不属于 3NF。
定理10.6
定理 10.6
若任一关系模式 R ∈ 3 N F R \in 3NF R∈3NF,则 R ∈ 2 N F R \in 2NF R∈2NF。
证明:用反证法。令 R R R 上的键为 K K K。假设 R ∈ 3 N F R \in 3NF R∈3NF 但 R ∉ 2 N F R \notin 2NF R∈/2NF,则有 R R R 中非主属性部分依赖于键值 K K K。那么,存在于 K K K 的真子集 K ′ K' K′, 使得 K ′ → A K' \rightarrow A K′→A。由于 K ′ ⊂ K K' \subset K K′⊂K,有 K → K ′ K \rightarrow K' K→K′, K ′ → A K' \rightarrow A K′→A,并且 A ∉ K ′ A \notin K' A∈/K′,因此 A A A 传递依赖于 K ′ K' K′,即 R ∉ 3 N F R \notin 3NF R∈/3NF,与假设矛盾。
若 R ∈ 3 N F R \in 3NF R∈3NF,则 R R R 中每一个非主属性既不部分依赖于候选键也不传递函数依赖于候选键。
Boyce-Codd范式(BCNF)
第三范式
- 消除了非主属性和主属性间的部分函数依赖和传递函数依赖;
- 在一定程度上解决了存储异常问题;
- 但是没有考虑主属性间的函数依赖问题;
- 在主属性间存在部分函数依赖和传递函数依赖,也会导致存储异常问题。
【例】关系模式 R ( C i t y , S t r e e t , Z i p ) R(City, Street, Zip) R(City,Street,Zip)
R上的函数依赖为: { ( C i t y , S t r e e t ) → Z i p , Z i p → C i t y } \{ (City, Street) \rightarrow Zip, Zip \rightarrow City \} {(City,Street)→Zip,Zip→City}
候选键为 ( C i t y , S t r e e t ) (City, Street) (City,Street) 或 ( S t r e e t , Z i p ) (Street, Zip) (Street,Zip)(候选键根据属性闭包能不能包含全属性判断)
R中没有非主属性,不存在非主属性与主属性间的部分函数依赖和传递函数依赖,因此 R ∈ 3 N F R \in 3NF R∈3NF
由于 Z i p → C i t y Zip \rightarrow City Zip→City,因此 ( S t r e e t , Z i p ) → C i t y (Street, Zip) \rightarrow City (Street,Zip)→City 为部分函数依赖
- 造成 City 值多次重复,会引起更新异常,如若要修改北京对应的邮政编码为 110000,必须修改北京地区的所有邮政编码
针对3NF的问题,Boyce和Codd提出了修正的第三范式——BCNF。
定义10.19
定义10.19 若 R ∈ 1 N F R \in 1NF R∈1NF,而且 R R R中没有任何属性传递依赖于 R R R中的任一关键字,则关系模式 R R R属于Boyce-Codd范式(BCNF)。
如果数据库模式 R R R中的每个关系模式 R R R都属于BCNF,则数据库模式 R R R属于BCNF。
BCNF不仅排除了非主属性对主属性的传递依赖,也排除了主属性间的传递依赖。
对于非BCNF的关系模式可以通过模式分解达到BCNF。
例如:3NF关系模式 R ( C i t y , S t r e e t , Z i p ) R(City, Street, Zip) R(City,Street,Zip),可以分解为:
- R 1 ( Z i p , C i t y ) R1(Zip, City) R1(Zip,City),
- R 2 ( S t r e e t , Z i p ) R2(Street, Zip) R2(Street,Zip)。
R 1 R1 R1和 R 2 R2 R2都属于BCNF。
定义10.20
定义10.20 设关系模式 R ∈ 1 N F R \in 1NF R∈1NF, F F F是 R R R上的函数依赖集,对于 F F F中的每一个函数依赖 X → Y X \rightarrow Y X→Y,必有 X X X是 R R R的一个超键(候选键),则 R ∈ B C N F R \in BCNF R∈BCNF。
如果 R ∈ B C N F R \in BCNF R∈BCNF,则 R R R中的每一个函数依赖中的确定因素都包含(或者是)候选键。
所有函数依赖都是关于超键(候选键)的依赖。
3NF和BCNF的关系
若 R ∈ B C N F R \in BCNF R∈BCNF,则一定有 R ∈ 3 N F R \in 3NF R∈3NF。
每一个确定属性集(元素)都包含(候选)键。
R R R中的所有属性(主属性、非主属性)都完全函数依赖于键。
若 R ∈ 3 N F R \in 3NF R∈3NF,则不一定有 R ∈ B C N F R \in BCNF R∈BCNF。
- 如果 R ∈ 3 N F R \in 3NF R∈3NF,且 R R R只有一个候选键,则 R R R必属于BCNF。
3NF仅消除了非主属性的存储冗余。
- 3NF可能存在在主属性对键的部分依赖和传递依赖。
BCNF消除了整个关系模式的存储冗余。
3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
在函数依赖的范围内,BCNF 已达到关系模式的最大分离,已经消除了插入、删除异常,是函数依赖范围内能够达到的最高范式。
在实际应用中,3NF 和 BCNF 的关系模式一般都能满足用户对数据的处理要求。
问题:如何使非3NF和非BCNF的关系模式达到3NF和BCNF?
模式分析算法
算法10.4 生成 3NF 的算法(合成算法)
算法10.4 生成3NF的算法(合成算法)
给定关系模式 R ( U , F ) R(U,F) R(U,F)
- 寻找没有出现在 F F F 中的R的属性,将这些属性单独组成一个关系模式,并从 R R R 中去掉;
- 令 F : = F ∪ { U → Z } F := F \cup \{U \rightarrow Z\} F:=F∪{U→Z}, 其中 Z Z Z 是没有出现在 U U U 中的附加属性;
- 计算 F F F 的最小函数依赖集,结果仍记为 F F F;
- 若有 X , Y X, Y X,Y 为函数依赖的左部且 X ↔ Y X \leftrightarrow Y X↔Y,则将这些函数依赖分为一组,其中 X X X 和 Y Y Y 可以相同;
- 将每组函数依赖组成一个关系模式,并将附加属性 Z Z Z 去掉;
- 若有一个关系模式所含属性与 R R R 的属性相同,输出该模式,否则输出这些模式。算法结束。
【例】已知 R ( U , F ) , U = A B C D E , F = { A → C D , B → E , A C → D } R(U, F), U=ABCDE, F=\{A \rightarrow CD, B \rightarrow E, AC \rightarrow D \} R(U,F),U=ABCDE,F={A→CD,B→E,AC→D}
- 关系模式 R R R 的所有属性都在 F F F 中。
令 F : = F ∪ { A B C D E → Z } F := F \cup \{ABCDE \rightarrow Z\} F:=F∪{ABCDE→Z}; - 计算 F F F 的最小依赖集。结果为
G = { A → C , B → E , A → D , A B → Z } G=\{A \rightarrow C, B \rightarrow E, A \rightarrow D, AB \rightarrow Z\} G={A→C,B→E,A→D,AB→Z}; - G G G 中依赖按左部等价分组为:
{ A → C , A → D } ; { B → E } ; { A B → Z } \{A \rightarrow C, A \rightarrow D\}; \{B \rightarrow E\}; \{AB \rightarrow Z\} {A→C,A→D};{B→E};{AB→Z}; - 去掉外属性 Z Z Z 后, R R R 的3NF的分解为:
R 1 = A C D , R 2 = B E , R 3 = A B R_1 = ACD, R_2 = BE, R_3 = AB R1=ACD,R2=BE,R3=AB
- 关系模式 R R R 的所有属性都在 F F F 中。
算法10.4生成的分解是3NF的,且具有无损连接性和保持依赖性。
对于BCNF则没有类似的算法。
如果要求模式分解具有无损连接性和保持依赖性,可以达到3NF,但不一定能达到BCNF。
如果要求模式分解仅具有无损连接性,则可以达到BCNF,即:规范化到BCNF,不一定能保持函数依赖。
算法10.5 生成BCNF的算法
算法10.5生成BCNF的算法
输入: 关系模式 R ( U , F ) R(U, F) R(U,F)。
输出: 达到BCNF的 R R R的一个无损分解。- 设 ρ : = { R ( U , F ) } \rho := \{ R(U, F) \} ρ:={R(U,F)};
- 检查中各关系模式是否为BCNF,若是,则算法结束;
- 若其中有 R i ( U i , F i ) R_i(U_i, F_i) Ri(Ui,Fi) 不属于BCNF,即有 F D FD FD 中有 X → Y X \rightarrow Y X→Y,而 X X X 不是 R i R_i Ri 的键,分解 R i R_i Ri 为 R i 1 = X Y , R i 2 = R i − Y R_{i1} = XY, R_{i2} = R_i - Y Ri1=XY,Ri2=Ri−Y;
- 用 { R i 1 , R i 2 } \{ R_{i1}, R_{i2} \} {Ri1,Ri2} 代替 ρ \rho ρ 中的 R i R_i Ri,返回 (2)。
【例】关系模式 R ( U , F ) R(U, F) R(U,F), U = A B C U=ABC U=ABC, F = { A → C , B → C } F=\{A \rightarrow C, B \rightarrow C\} F={A→C,B→C}。
- R ∉ R \notin R∈/ BCNF, 因为 F D : A → C FD: A \rightarrow C FD:A→C, A A A 不是 R R R 的键(因为A的属性闭包不能推出全属性)。
- 根据 F D : A → C FD: A \rightarrow C FD:A→C,将 R R R 分解为 { A C , A B } \{AC, AB\} {AC,AB},分解后的两个模式都属于 BCNF,损失函数依赖。
- 若先检查 F D : B → C FD: B \rightarrow C FD:B→C,则分解结果为 { B C , A B } \{BC, AB\} {BC,AB}。
6. 多值依赖和4NF
属于BCNF的关系模式是否完美?
例: 学校中某一门课程由多个教师讲授,他们使用同一套参考书。关系模式为
Teaching(C, T, B)
。用二维表表示Teaching
Teaching具有唯一候选键(C, T, B),即全键Teaching ∈ BCNF
Teaching模式中存在的问题:
- 数据冗余度大: 有多个名字任课教师,参考书就要存储多次;
- 插入操作重复: 当某课程增加一名任课教师时,该课程有多个本参照书,就必须插入多个元组;
- 删除操作重复: 某门课程要去掉一本参考书,该课程有多少教师,就必须删除多少个元组;
- 修改操作重复: 某一课程修改一本参考书,该课程有多少教师,就必须修改多少个元组。
Teaching存在问题的原因——存在多值依赖
定义10.21
定义10.21 设 R ( U ) R(U) R(U) 是一个关系模式, X X X 和 Y Y Y 是 U U U 的子集, Z = U − X − Y Z = U - X - Y Z=U−X−Y。对于关系 r ( R ) r(R) r(R) 中任意两个元组 s s s 和 t t t,若 s [ X ] = t [ X ] s[X] = t[X] s[X]=t[X],在 r r r中存在元组 w w w 和 v v v( w , v w, v w,v 可以与 s , t s, t s,t 相同) ,使得:
- w [ X ] = s [ X ] w[X] = s[X] w[X]=s[X]
- w [ Y ] = t [ Y ] w[Y] = t[Y] w[Y]=t[Y]
- w [ Z ] = s [ Z ] w[Z] = s[Z] w[Z]=s[Z]
- v [ X ] = t [ X ] v[X] = t[X] v[X]=t[X]
- v [ Y ] = s [ Y ] v[Y] = s[Y] v[Y]=s[Y]
- v [ Z ] = t [ Z ] v[Z] = t[Z] v[Z]=t[Z]
即 交换 s s s 和 t t t 元组的 Y Y Y 值所得的两个新元组必在中,则关系 r ( R ) r(R) r(R) 满足 多值依赖 (MVD) X → → Y X \rightarrow \rightarrow Y X→→Y,称 X X X 多值决定 Y Y Y 或 Y Y Y 多值决定 X X X。
下面的图是一个示例
等价的多值依赖的另一个定义
定义10.22 设 R ( U ) R(U) R(U) 是一个关系模式, X X X 和 Y Y Y 是 U U U 的子集, Z = U − X − Y Z = U - X - Y Z=U−X−Y, r r r 是 R R R 上的一个关系。多值依赖 X → → Y X \rightarrow \rightarrow Y X→→Y 成立,当且仅当对于给定的一个 x x x 值,有一组 Y Y Y 的值,并且这组 Y Y Y 值与 r r r 中的其他属性 Z Z Z 无关。此时,称 X X X 多值决定 Y Y Y 或 Y Y Y 多值决定 X X X。
Teaching ( C , T , B C, T, B C,T,B) 存在多值依赖
C → → T C \rightarrow \rightarrow T C→→T
每一个 C C C 值, T T T 有一组值与之对应,而不论 B B B 取何值。C → → B C \rightarrow \rightarrow B C→→B
每一个 C C C 值, B B B 有一组值与之对应,而不论 T T T 取何值。
平凡多值依赖和非平凡的多值依赖
平凡的多值依赖是指当 X → → Y X \rightarrow \rightarrow Y X→→Y 且 Y ⊆ X Y \subseteq X Y⊆X 或 Y = U − X Y = U - X Y=U−X(其中 U U U 是属性集)时,我们称这个多值依赖是平凡的。
例如,假设关系模式 R ( A , B , C ) R(A, B, C) R(A,B,C),如果我们有多值依赖 A → → A A \rightarrow \rightarrow A A→→A,这个依赖是平凡的,因为 Y = A Y = A Y=A 是 X = A X = A X=A 的子集。平凡的多值依赖本质上并没有引入任何新的信息。
非平凡的多值依赖是指当 X → → Y X \rightarrow \rightarrow Y X→→Y 且 Y ⊈ X Y \not\subseteq X Y⊆X 或 Y ≠ U − X Y \neq U - X Y=U−X 时,我们称这个多值依赖是非平凡的。
例如,在关系模式 R ( A , B , C ) R(A, B, C) R(A,B,C) 中,如果我们有多值依赖 A → → B A \rightarrow \rightarrow B A→→B,并且 B ≠ A B \neq A B=A,这个多值依赖就是非平凡的。
同函数依赖类似,多值依赖也有递转性。
- 从一组已知的多值依赖可以推导出它所蕴涵的多值依赖。
多值依赖的推理公理
r r r 是模式 R R R 上的关系,且 W , X , Y , Z W, X, Y, Z W,X,Y,Z 是 R R R 的子集。
M1:自反律
若 Y ⊆ X Y \subseteq X Y⊆X 则 X → → Y X \rightarrow \rightarrow Y X→→Y。M2:增加律
若 X → → Y , W ⊆ Z X \rightarrow \rightarrow Y, W \subseteq Z X→→Y,W⊆Z,则 X Z → → Y W XZ \rightarrow \rightarrow YW XZ→→YW。M3:相加律
若 X → → Y , X → → Z X \rightarrow \rightarrow Y, X \rightarrow \rightarrow Z X→→Y,X→→Z,则 X → → Y Z X \rightarrow \rightarrow YZ X→→YZ。M4:影响律
若 X → → Y , X → → Z X \rightarrow \rightarrow Y, X \rightarrow \rightarrow Z X→→Y,X→→Z,则 X → → Y ∩ Z , X → → Y Z X \rightarrow \rightarrow Y \cap Z, X \rightarrow \rightarrow YZ X→→Y∩Z,X→→YZ。M5:传递律
若 X → → Y , Y → → Z X \rightarrow \rightarrow Y, Y \rightarrow \rightarrow Z X→→Y,Y→→Z,则 X → → Z X \rightarrow \rightarrow Z X→→Z。M6:伪传递律
若 X → Y , Y W → Z X \rightarrow Y, YW \rightarrow Z X→Y,YW→Z,则 $XW \rightarrow \rightarrow Z $。M7:互补律
若 X → → Y , Z = R − ( X Y ) X \rightarrow \rightarrow Y, Z = R - (XY) X→→Y,Z=R−(XY),则 X → → Z X \rightarrow \rightarrow Z X→→Z。M8:重复律
若 X → Y X \rightarrow Y X→Y,则 X → → Y X \rightarrow \rightarrow Y X→→Y。M9:结合律
若 X → → Y , Z → W X \rightarrow \rightarrow Y, Z \rightarrow W X→→Y,Z→W,其中 W ⊆ Y W \subseteq Y W⊆Y 和 Z ∩ W = ∅ Z \cap W = \emptyset Z∩W=∅,则 X → W X \rightarrow W X→W。
多值依赖具有对称性
若 X → → Y X \rightarrow \rightarrow Y X→→Y,则 X → → Z X \rightarrow \rightarrow Z X→→Z,其中 Z = U − X − Y Z = U - X - Y Z=U−X−Y
多值依赖的定义中不仅涉及属性组 X X X 和 Y Y Y,而且涉及 U U U 中其他属性 Z Z Z。
4NF
若关系模式存在多值依赖,还需要进一步规范化。
定义10.23 设关系模式 R ∈ 1 N F R \in 1NF R∈1NF, F F F 是 R R R 上的 F D FD FD 和 MVD 集合(MVD指多值依赖)。如果对于 R R R 上的任何一个非平凡的多值依赖 X → Y X \rightarrow Y X→Y, X X X 是 R R R 的一个超键,则 R R R 为 4NF。如果数据库模式 R R R 中的每一个关系模式 R R R 都属于 4NF,那么,数据库模式 R R R 为 4NF。
- X X X 是 R R R 的一个超键, X X X 包含 R R R 的候选键, X → Y X \rightarrow Y X→Y。
- 4NF 的属性之间不存在非平凡的多值依赖(除了非平凡的多值依赖 X → Y X \rightarrow Y X→Y, X X X 是 R R R 的一个超键)。
- 若关系模式 R R R 存在非平凡的多值依赖,该多值依赖只能是函数依赖,且该函数依赖的决定因素应是 R R R 的超键。
如果 R ∈ 4 N F R \in 4NF R∈4NF,则 R ∈ B C N F R \in BCNF R∈BCNF
- 不允许有非平凡且非函数依赖的 多值依赖
- 允许平凡的多值依赖
- 允许决定因素包含超键的函数依赖
可采用分解的方法消去非平凡且决定因素不包含超键的多值依赖
例: T e a c h i n g ( C , T , B ) ∉ 4 N F Teaching(C, T, B) ∉ 4NF Teaching(C,T,B)∈/4NF,因为存在非平凡的多值依赖 C → T C \rightarrow T C→T,且 C C C 不是候选键。
可把
Teaching
分解为如下两个关系模式:关系模式 属性 C T ( C , T ) CT(C, T) CT(C,T) $ ∈ 4NF, (C \rightarrow T$ 为平凡多值依赖) C B ( C , B ) CB(C, B) CB(C,B) $ ∈ 4NF, (C \rightarrow B$ 为平凡多值依赖)
算法10.6
算法 10.6 通过分解生成 4NF 的算法
输入: 关系模式 R R R,函数依赖和多值依赖集 F F F。
输出: 达到 4NF 的 R R R 的一个无损分解。 ρ = { R 1 , R 2 , … , R k } \rho = \{ R_1, R_2, \dots, R_k \} ρ={R1,R2,…,Rk}, R i ∈ 4 N F ( 1 ≤ i ≤ k ) R_i \in 4NF (1 \leq i \leq k) Ri∈4NF(1≤i≤k)。- 若 R i ∈ 4 N F R_i \in 4NF Ri∈4NF,算法结束, ρ = { R } \rho = \{R\} ρ={R}。
- 若其中有 R i ∉ 4 N F R_i \notin 4NF Ri∈/4NF,即有 MVD X → → Y X \rightarrow \rightarrow Y X→→Y, X ≠ Y X \neq Y X=Y,则分解 R i R_i Ri 为:
R i 1 = R i − Y R_{i1} = R_i - Y Ri1=Ri−Y 和 R i 2 = X Y R_{i2} = XY Ri2=XY,用 R i 1 R_{i1} Ri1 和 R i 2 R_{i2} Ri2 代替 ρ \rho ρ 中的 R i R_i Ri。 - 若中所有 R i ∈ 4 N F R_i \in 4NF Ri∈4NF,输出 ρ \rho ρ,否则转(2),继续进行分解,直至使所有的关系模式都成为 4NF。
【例】 关系模式 R ( A , B , C , D , E , I ) R(A, B, C, D, E, I) R(A,B,C,D,E,I), R R R 的依赖集 F = { A → → B C D , B → A C , C → D } F=\{ A \rightarrow \rightarrow BCD, B \rightarrow AC, C \rightarrow D \} F={A→→BCD,B→AC,C→D},将 R R R 规范到 4NF。
A → → B C D A \rightarrow \rightarrow BCD A→→BCD 是非平凡的, A A A 不是 R R R 的超键( A F + A_F+ AF+不能包含全属性),分解为:
R 1 = A B C D , ρ 1 ( F ) = { B → A C , C → D , A → B C D } R_1 = ABCD, \rho_1(F) = \{ B \rightarrow AC, C \rightarrow D, A \rightarrow BCD \} R1=ABCD,ρ1(F)={B→AC,C→D,A→BCD};
R 2 = A E I , ρ 2 ( F ) = { A → E I } R_2 = AEI, \rho_2(F) = \{ A \rightarrow EI \} R2=AEI,ρ2(F)={A→EI}。R 2 R_2 R2 属于 4NF,因为 A → E I A \rightarrow EI A→EI 是平凡的。
R 1 R_1 R1 不属于 4NF,在 R 1 R_1 R1 中, A → B C D A \rightarrow BCD A→BCD 是平凡的,但函数依赖 C → D C \rightarrow D C→D 中的 C 不是 R R R 的超键。 R 1 R_1 R1 还需要继续分解。
分解为: R 11 = A B C R_{11} = ABC R11=ABC, R 12 = C D R_{12} = CD R12=CD。
R 11 R_{11} R11, R 12 R_{12} R12 都是 4NF,因为 B 和 C 分别是 R 11 R_{11} R11 和 R 12 R_{12} R12 的键。分解结果: ρ = { R 11 , R 12 , R 2 } \rho = \{ R_{11}, R_{12}, R_2 \} ρ={R11,R12,R2}.
7. 连接依赖和投影-连接依赖
- PJNF
- 略
规范化小结
关系数据库的规范化理论是关系数据库逻辑设计的工具。
- 一个关系只要其分量是不可分的数据项,它就是规范化的关系,但还是基本的规范化。
- 规范化过程可以有多个不同的级别,从低到高依次为:
1NF → 2NF → 3NF → BCNF → 4NF → PJNF - 规范化程度过低的关系不一定能很好地描述现实世界,可能存在插入异常、删除异常、修改冗余、数据冗余等问题。
- 一个低级规范的关系模式,通过规范化分解可以转换为若干高级规范的关系模式集合(关系模式的规范化)。
关系模式规范化的基本步骤
- 1NF
消除非主属性对候选键的部分函数依赖。 - 2NF
消除非主属性对候选键的传递函数依赖。 - 3NF
消除主属性对候选键的部分依赖和传递函数依赖。 - BCNF
消除非平凡且决定因素不包含候选键的多值依赖。 - 4NF
- 1NF
规范化的基本思想
- 通过模式分解,消除不合适的数据依赖,使各关系模式达到某种程度的“分离”。
- 采用“一事一地”的模式设计原则,让一个关系描述一个概念,一个实体或者实体间的一个联系,若多个概念就把它“分离”出去。
- 一个关系模式分离程度越高,它所表示的概念就越清晰,结构就越简单,所有的存储异常就消除得越多。
- 因此,规范化实际上是概念的单一化。
不能说规范化程度越高的关系模式就越好
- 分离程度越高,连接计算所花费的代价就越大,从而使效率降低;
- 从 3NF 之后,规范化所得到的模式可能不保持某些数据依赖,因为与原模式不完全等价;
不能说规范化程度越高的关系模式就越好
- 分离程度越高,连接计算所花费的代价就越大,从而使效率降低;
- 从 3NF 之后,规范化所得到的模式可能不保持某些数据依赖,因为与原模式不完全等价;
在设计中,模式究竟分解到哪个一级模式取决于实际应用:
- 规范化是范式的升高,连接是范式的降低;
- 关系模式的规范化处理可以终止于任意一级别;
- 只考虑函数依赖,BCNF 是关系模式规范化的最高程度;
- 如果考虑多值依赖,4NF 是关系模式规范化的最高程度。
一般常用的是 3NF 和 BCNF。
本章小结
关系模型的存储异常
函数依赖
函数依赖公理
模式分解
关系模式的规范化
多值依赖和4NF
连接依赖和投影-连接范式(Project-Join NF)
关系数据库的规范化理论为数据库设计提供了理论上的指南和工具
- 也仅仅是指南和工具
在模式设计中,不是规范化程度越高,所设计出的模式就越好
- 必须结合应用环境和现实世界的具体情况,合理地选择数据库模式;
花费的代价就越大,从而使效率降低;
- 从 3NF 之后,规范化所得到的模式可能不保持某些数据依赖,因为与原模式不完全等价;
- 必须结合应用环境和现实世界的具体情况,合理地选择数据库模式;
在设计中,模式究竟分解到哪个一级模式取决于实际应用:
- 规范化是范式的升高,连接是范式的降低;
- 关系模式的规范化处理可以终止于任意一级别;
- 只考虑函数依赖,BCNF 是关系模式规范化的最高程度;
- 如果考虑多值依赖,4NF 是关系模式规范化的最高程度。
一般常用的是 3NF 和 BCNF。
本章小结
- 关系模型的存储异常
- 函数依赖
- 函数依赖公理
- 模式分解
- 关系模式的规范化
- 多值依赖和4NF
- 连接依赖和投影-连接范式(Project-Join NF)
- 关系数据库的规范化理论为数据库设计提供了理论上的指南和工具
- 也仅仅是指南和工具
- 在模式设计中,不是规范化程度越高,所设计出的模式就越好
- 必须结合应用环境和现实世界的具体情况,合理地选择数据库模式;
- 一般,数据库模式规范化到3NF或BCNF就可以了。