zoukankan      html  css  js  c++  java
  • 3NF的无损连接和保持函数依赖的分解、BCNF的无损连接的分解

    首先,需要了解3NF、BCNF范式的要求。

    3NF:不存在非主属性对码的传递函数依赖或部分函数依赖。

            如AB->C,A->C  码为(A,B),A,B是主属性,C是非主属性,C部分函数依赖于码,即不满足3NF

    BCNF:每个决定因素都包含码(相比于3NF,优点是加上了对主属性的限制)

                 另一种说法:①主属性完全函数依赖于不含它的码

                                       ②没有任何属性完全函数依赖于非码的任何一组属性

                                       ③所有非主属性对每一个码都是完全函数依赖

    在分解前应掌握求函数依赖集最小覆盖的方法。(见例一)

    下面看例子

    例一:设关系模式R(A,B,C,D,E)上的函数依赖集F是{A->BC,ABD->CE,E->D}

    1:计算F的最小覆盖。

    首先将右部不唯一的依赖分解。得到{A->B,A->C,ABD->C,ABD->E,E->D}

    然后对每一个依赖判断 :对A->B,令G=F-{A->B},查看B是否属于A关于G的闭包。即A是否能从G推导出B。经推,不能。所以,保留A->B。

    同理 A->C 保留;ABD->C 删除(因为A->C);ABD->E 保留;E->D 保留

    第二步,对左部不唯一的依赖进行判断:对ABD->E,依次去掉A/B/D,查看(ABD-A/B/D)关于F的闭包是否包含E,是则用其取代原依赖。经推,发现AD->E满足条件。

    所以,综上所述。F的最小覆盖为{A->B,A->C,AD->E,E->D}

    2:直接写出R的所有关键字。

    易知,码为(A,D) (A,E)

    3:直接将R分解到3NF,且满足无损连接性和依赖保持性。

    对F的最小覆盖进行处理:首先,按左部相同原则分组    A->B,A->C为R1({ABC},{A->B,A->C})

                                    AD->E为R2({A,D},{AD->E})

                            E->D为R3({E,D},{E->D})

    然后,将具有包含关系的元组进行合并 R2包含R3,所以将R2,R3合并为新的R2({A,D,E},{AD->E,E->D})

    最后,判断分解后的关系模式中是否含有码,若含有则为无损连接且保持依赖的3NF

    否则,则是保持依赖但不是无损连接的3NF,此时需要新建一个关系模式,将码放入其中(若此题不含,则加R3({A,D},{∅}))。

    该例中,R2含有码,所以满足题意。

    4:上述分解是否满足BCNF?若不满足,将其分解到满足BCNF。

    对于上述分解,R2中E->D,E为决定因素,不含码,所以不为BCNF(另一种理解方式,码为AD,AE,主属性D部分函数依赖于不含它的码(A,E))

    所以对R2分解,使ADE分为 1:ED,   2:ADE-D 即 AE

    所以有R2({A,E},{A->E}) ,R3({E,D},{E->D})

    最终分解为R1({ABC},{A->B,A->C}),R2({A,E},{A->E}) ,R3({E,D},{E->D})

    如有错误,欢迎指正。

  • 相关阅读:
    default关键字用法
    【转载】SpringMvc和servlet简单对比介绍
    build模式入门,build模式理解(转载)
    tomcat logs 目录下各日志文件的含义
    @Component, @Repository, @Service,@Controller的区别
    在项目开发时为什么要先写接口,再写实现类?
    java 中static关键字注意事项
    this关键字使用注意事项
    两个对象之前如何建立联系
    html页面监听事件
  • 原文地址:https://www.cnblogs.com/lfz1211/p/10475353.html
Copyright © 2011-2022 走看看