-
第一范式 1NF
关系模式R中的每一个属性对应的域值都是不可再分的
-
第二范式 2NF
(1) 候选键
有的关系中,能够标识元组的属性(组)不止一个。此时它们都称为候选键(所有候选键中属性的数量应该一致)
(2) 主属性和非主属性:如果某个属性包含在关系模式的某个候选键中,则为主属性;否则为非主属性
(3) 2NF定义
一个关系模式满足1NF,且非主属性完全依赖于R的每个候选键
-
第三范式 3NF
(1) 定义
一个关系模式满足1NF,且没有非主属性传递依赖于R的候选键
(2) 若一个关系模式满足 3NF,则它一定满足2NF
-
修正的第三范式(Boyce-Codd范式) BCNF
(1) 定义
一个关系模式满足1NF,且没有任何属性(包括主属性、非主属性)传递依赖于R的任意关键字
(2) BCNF不但排除了非主属性对主属性的传递依赖,也排除了主属性间的传递依赖
(3) 等价定义
一个关系模式满足1NF,且对于它的每个函数依赖X->Y,都有X是R的其中一个候选键
(4) 若一个关系模式满足BCNF,则它一定满足3NF
(5) 在函数依赖的范围内,BCNF已经达到了关系模式的最大分离,是函数依赖范围内能够达到的最高范式
-
模式分解算法
(1) 如果要求模式分解具有无损连接性+保持依赖性,则可以达到3NF,未必达到BCNF;如果要求模式分解仅具有无损连接性,则可以达到BCNF。即,若规范化到BCNF,不一定能够保持函数依赖
(2) 生成3NF的算法
F为关系R的函数依赖集,U为R的属性集合
1° 寻找没有出现在F中的R的属性,将这些属性单独组成一个关系模式,并将这些属性从R中去掉,即 U = U' + Z (其中U'为出现在F中的属性集合,Z为未出现在F中的附加属性集合)
2° 令 F = F ∪ {U'->Z}
3° 计算F的最小函数依赖集 F'
4° 对于F'中的所有函数依赖 Xi -> Yi,若 Xi = Xj 或 Xi ≠ Xj且Xi <-> Xj,则将这些函数依赖分为一组
5° 每组函数依赖组成一个关系模式,并将包含了附加属性Z去掉(因为这些属性已经在第一步组成关系模式了);如果有一个关系模式中所含属性与U'相同,则输出该模式;否则,输出这些模式
示例
U = {A, B, C, D, E}, F = {A->CD, B->E, AC->D} 1° U' = U, Z = ∅ 2° F = {A->CD, B->E, AC->D, ABCDE->Z} 3° F' = {A->C, A->D, B->E, AB->Z} 4° {A->C,A->D}, {B->E}, {AB->Z} 5° 分解为 R1 = {A,C,D}, R2 = {B, E}, R3 = {A, B}
(3) (2)中的算法生成的分解是3NF的,且具有无损连接性和保持函数依赖性
(4) 生成BCNF的算法
1° 检查各个关系模式是否满足BCNF,若满足则算法终止;
2° 若关系模式 Ri(Ui, Fi)不满足BCNF,即Fi中存在函数依赖 X->Y,而X不是Ri的候选键(BCNF的等价定义),则分解Ri为 Ri1 = XY, Ri2 = Ri - Y
3° 用Ri1, Ri2代替Ri,返回1°
示例
U = {A, B, C, D, E}, F = {A->C,C->D,B->C,DE->C,CE->A} Round 1 1° R(U,F)的候选键为BE(F中只有BE从未出现在右面,检查一下发现BE确实可以标识整个元组),依次检查函数依赖,发现A->C的X = A,不是候选键,不满足BCNF 2° 分解R为 U(R1) = U1 = {A,C}, U(R2) = U2 = {A, B, D, E}; 此时F(R1) = F1 = {A->C}, F(R2) = F2 = {B->D, BE->A} Round 2 1° R1(U1, F1)的候选键为A,满足BCNF;R2(U2,F2)的候选键为BE, F2中的B->D不满足BCNF 2° 分解R2为 U(R21) = U21 = {B,D}, U(R22) = U22 = {A,B,E}; 此时F(R21) = F21 = {B->D}, F(R22) = F22 = {BE->A} Round 3 1° R21(U21,F21)的候选键为B,满足BCNF;R22(U22,F22)的候选键为BE,满足BCNF,算法结束
(5) (4)的算法可以生成一个满足BCNF的无损分解,但是不保证函数依赖保持性
(6) (4)的算法产生的分解结果可能有多种,与函数依赖集的扫描顺序有关
-
多值依赖
(1) 定义
关系模式R,属性集U,X和Y是U的子集,且Z = R - (XY)。当且仅当,对于给定的一个x值,有__一组y值,且这组y值与r中的其他属性R-(XY)无关,则Y多值依赖于X,记为X->->Y。
示例
有很多门课,每门课有很多个老师上课且有很多本参考书,这是参考书就多值依赖于课程名称,因为一门课对应一组参考书,且参考书的取值和上课老师无关
(2) 如果定义中Z为空集,则X->->Y称为平凡的多值依赖
(3) 超键:可以唯一标识一个元组的一个或一组属性,和候选键的区别是候选键是没有多余属性的超键
-
第四范式 4NF
(1) 定义
对于关系模式R上的任何一个非平凡的多值依赖X->->Y,X是R的一个超键,则R满足4NF
(2) 4NF的定义说明,满足4NF的关系模式不存在非平凡的多值依赖。如果关系模式R上存在非平凡的多值依赖,那么该多值依赖只能是函数依赖,而且该函数依赖的决定因素是R的超键
投影-连接范式 PJNF
-
总结
(1) 规范化程度
1NF < 2NF < 3NF < BCNF < 4NF < PJNF
(2) 3NF可以保持无损连接和函数依赖,BCNF及其之后的范式只能保持无损连接
(3) 优点:关系模式分离程度越高,概念越清楚,结构越简单,存储异常消除得越彻底
(4) 缺点:分离程度越高,连接运算代价越大,效率降低
因此,不是规范化程度越高越好,一般常用的是3NF和BCNF