chapter10_关系数据库设计理论_4_关系模式的规范化

  • 第一范式 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,则将这些函数依赖分为一组

    每组函数依赖组成一个关系模式,并将包含了附加属性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

猜你喜欢

转载自blog.csdn.net/captxb/article/details/88084886