• 3NF、BCNF和4NF基本概念和分解


    https://blog.csdn.net/yuyang_z/article/details/79115991

    一、第三范式(3NF)——相对于BCNF,允许存在主属性对候选码的传递依赖和部分依赖

    定义:如果关系模式R∈2NF,且每个非主属性都不传递函数依赖于R的主关系键,则称R属于第三范式,简称3NF。

    1、把一个关系模式分解成3NF,使它具有保持函数依赖性

    算法如下:

    其中提到了最小函数依赖集,那么最小函数依赖集怎么求呢?方法如下:

    举个例子:在R(U,F)中,U=ABCDEG,F={B→D,DG→C,BD→E,AG→B,ADG→BC}

    1.1首先求最小依赖集

    (1)右部属性单一化,F={B→D,DG→C,BD→E,AG→B,ADG→B,ADG→C}

    (2)去掉左边多余属性,只针对非单属性

    DG→C,若去掉D,则(G)+=G不包含C,D保留(不冗余),若去掉G,(D)+=D不包含C,G保留

    BD→E,(D)+=D,(B)+=BDE包含E,则可以B→E代替此函数依赖

    AG→B,(G)+=G,(A)+=A

    ADG→B,(DG)+=DGC,(AG)+=AGB包含B,则可以由AG→B代替

    ADG→C,(DG)+=DGC包含C,则可以由DG→C代替

    所以最小依赖集F={B→D,DG→C,B→E,AG→B}

    (3)去掉多余的依赖

    去掉B→D,(B)+=BE,不包含D,则不冗余,不去掉

    去掉DG→C,(DG)+=DG,不包含C

    去掉B→E,(B)+=BD,不包含E

    去掉AG→B,(AG)+=AG,不包含B

    所以最小依赖集F={B→D,DG→C,B→E,AG→B}

    1.2R中所有属性都在最小依赖集中出现,转下一步

    1.3按照具有相同左部的原则分为:

    R1=BDE,R2=DGC,R3=AGB

    所以最终分解为ρ={R1(BDE),R2(DGC),R3(AGB)}

    2、把一个关系模式分解成为3NF,使它具有保持函数依赖且无损

    算法:step1,求F的规范覆盖Fc

     step2,初始化,置ρ={ }

     step3,逐个考察Fc中的每一个FD:X→Y,如果ρ中的每一个关系模式都不包含XY,则将XY加入ρ中

       step4,考察R的候选码,如果ρ中所有关系模式都不包含R的候选码,则将R的某个候选码加入ρ中

    2.1其中用到了规范覆盖,那么规范覆盖怎么求呢?如下:

    步骤1,合并函数依赖,将Fc中如α1→β1和α1→β2转换成α1→β1β2,得到新函数依赖集F1

    步骤2,去除无关属性,找出F1中α或β中含有无关属性的函数依赖α→β,去除无关属性后,代替原依赖集

    其中步骤2中的无关属性定义:

    有了无关属性的定义后,步骤2比较好解决了。

    举个例子:r(R)=r(A,B,C)和F={A→BC,B→C,A→B,AB→C}计算Fc

    合并:A→BC与A→B合并为A→BC,F1={A→BC,B→C,AB→C}

    去除无关属性(单属性不存在无关属性):

    对于AB→C,多属性在左边,去除AB中的A,r={AB}-{A}=B,(B)+=BC包含C,所以A无关,变为B→C,已存在,F1={B→C,A→BC}

    对于A→BC,多属性在右边,去除BC中的B,F2={B→C,A→C},计算(A)+=AC,不包含B,不无关

                                                 去除BC中的C,F2={B→C,A→B},计算(A)+=AC,包含C,则BC中的C是无关属性

    变为F={B→C,A→B}

    最终规范覆盖Fc={B→C,A→B}

    继续以此题为例,求出候选码,为A,所以依次考察Fc中的BC,初始ρ={},将BC加入ρ中,ρ={R1(BC)}。再考虑AB,ρ中的关系模式不包含AB,则将AB加入ρ中,ρ={R1(BC),R2(AB)}因为候选码A已经在R2中,所以分解结束,最终分解为ρ={R1(BC),R2(AB)}。如果这里最终只有ρ={BC},那么要把候选码A加入进去,则ρ={R1(BC),R2(A)}。这里附上候选码的计算方法:

    二、BC范式——排除了任何属性(主、非主属性)对候选码的部分依赖和传递依赖,主属性之间的传递依赖

    定义:如果关系模式R∈1NF,且所有的函数依赖XY,决定因素X都包含了R的一个候选键,则称R属于BC范式。

    算法:将一个关系模式分解成BCNF

    (1)令ρ={R}

    (2)如果ρ中所有模式都是BCNF,则转(4)

    (3)如果ρ中有一个关系模式S不是BCNF,则S中必能找到一个函数依赖X→A且X不是S的候选键,且A不属于X,设S1=XA,S2=S-A,用分解{S1,S2}代替S,转(2)

    (4)分解结束,输出ρ

    举个例子:将R(A,B,C,D)规范到BCNF,候选键为AC和BC,F={A→B,B→A,AC→D,BC→D}

    令ρ={R(A,B,C,D)},分解为S1(AB),S2(ACD)

    三、第4范式(4NF)

    定义:

    其中涉及到多值依赖的定义,

    最终4NF的分解算法如下:


    ————————————————
    版权声明:本文为CSDN博主「星星,就酱」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yuyang_z/article/details/79115991

  • 相关阅读:
    mysql主从只同步部分库或表
    springboot~aspect通过@annotation进行拦截
    ELK~fluentd将日志文件增量读到es里
    怎么自学 Java ?和盘托出
    一个后端开发的 Vue 笔记【入门级】
    企业级数据大屏设计如何实现
    Vue.js官方中文教程
    vue学习笔记 ---- 系列文章
    基于Asp.net core Kestrel的超迷你http服务器 ---- AServer
    Docker学习—概念及基本应用
  • 原文地址:https://www.cnblogs.com/kungfupanda/p/12362066.html
Copyright © 2020-2023  润新知