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

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

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

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

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

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

任何属性都完全依赖于码,不完全函数依赖于非码的任何一组属性

将关系模式R<U,F>分解为一个3NF的基本步骤是

1).首先将关系模式R的函数最小依赖集求出来。

2).若求得的函数最小依赖集左部都是单属性,则完成对于关系模式R的3NF分解,结束。

3).去掉多余的函数传递依赖

3).找出不在F中的属性,将其构成一个关系模式并去掉,剩余的记为U。

4).将左部相同的属性分为一组。对于每一组的并集若组合成为U,则完成3NF的分解。

将关系模式R<U,F>分解为一个BCNF的基本步骤是

1).求出候选关键字,检查R中关系模式是否符合BCNF,若都符合输出即可

2).查看每个关系模式左部是否含有候选关键字,若R中有关系模式S不符合BCNF,则必有X->A属于F+,且X不是S的候选关键字。因为XA不包含S的全部属性,把S分为{S1,S2},其中S1=XA,S2=(S-A)X,分别计算其最小函数依赖集,并将{S1,S2}代替S代入第一步中。

设关系模式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 保留,

得F={A->B,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,E},{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:E->D,   2:ADE->D

所以有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})

例2.关系模式R<U,F>,有U={A,B,C,D,E,F,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},

(1)将关系模式分解为3NF且保持函数依赖

(2)将关系模式分解为BCNF

将关系模式分解为3NF且保持函数依赖:

假设B->G冗余,则(B)+=BD,没有G故不冗余。

假设CE->B冗余,则(CE)+=CEGDA,没有B故不冗余。

假设C->A冗余,则(C)+=CD,故不冗余。

一次可以得到最小函数依赖集Fm={B->G,CE->B,C->A,B->D,C->D}。

之后将左部相同的组合并成一个组有:(BDG),(CEB),(CAD).

所以将关系模式分解为3NF且保持函数依赖的结果为:(BDG),(CEB),(CAD).

将关系模式分解为BCNF:

首先求出关系模式的候选关键字

L型: CE

LR型:B

R型: ADG

因为CE是L型,所以必定是码中的一部分。(CE)+=ABCDEG

所以CE是码。

因为Fm={B->G,CE->B,C->A,B->D,C->D}。

开始找左部不包含CE的关系模式,第一个为B->G,

将其分为R1={(BG),{B->G}}与R2={(ABCDE),{CE->B,C->A,B->D,C->D}}。注意G不能出现在R2中,要根据与G相关的关系模式进行替代。

求R1与R2的最小函数依赖集,步骤均是按照上述算法严格进行的。

R1,R2最小函数依赖集是其本身。

然后再进行分解,R1符合BCNF,继续分解R2:

B->D,左部不含码,于是分解为R2={(BD),{B->D}},R3={(ABCE),{CE->B,C->A}}。

R2,R3的最小函数依赖集均是其本身。

于是BCNF分解的最后结果为{(BG),(BD),(ABCE)}。

 例1:关系模式R<U,F>,其中U={C,T,H,R,S,G},

F={CS→G,C→T,TH→R,HR→C,HS→R},将其分解成3NF并保持函数依赖。

解:根据算法进行求解

(一)计算F的最小函数依赖集

① 利用分解规则,将所有的函数依赖变成右边都是单个属性的函数依赖。由于F的所有函数依赖的右边都是单个属性,故不用分解。

② 去掉F中多余的函数依赖

A.设CS→G为冗余的函数依赖,则去掉CS→G,得:

F1={C→T,TH→R,HR→C,HS→R}

计算(CS)F1+:

设X(0)=CS

计算X(1):扫描F1中各个函数依赖,找到左部为CS或CS子集的函数依赖,找到一个C→T函数依赖。故有X(1)=X(0)∪T=CST。

计算X(2):扫描F1中的各个函数依赖,找到左部为CST或CST子集的函数依赖,没有找到任何函数依赖。故有X(2)=X(1)。算法终止。

CS)F1+= CST不包含G,故CS→G不是冗余的函数依赖,不能从F1中去掉。

B.设C→T为冗余的函数依赖,则去掉C→T,得:

F2={CS→G,TH→R,HR→C,HS→R}

计算(C)F2+:

设X(0)=C

计算X(1):扫描F2中的各个函数依赖,没有找到左部为C的函数依赖。故有X(1)=X(0)。算法终止。故C→T不是冗余的函数依赖,不能从F2中去掉。

C.设TH→R为冗余的函数依赖,则去掉TH→R,得:

F3={CS→G,C→T,HR→C,HS→R}

计算(TH)F3+:

设X(0)=TH

计算X(1):扫描F3中的各个函数依赖,没有找到左部为TH或TH子集的函数依赖。故有X(1)=X(0)。算法终止。故TH→R不是冗余的函数依赖,不能从F3中去掉。

D.设HR→C为冗余的函数依赖,则去掉HR→C,得:

F4={CS→G,C→T,TH→R,HS→R}

计算(HR)F4+:

设X(0)=HR

计算X(1):扫描F4中的各个函数依赖,没有找到左部为HR或HR子集的函数依赖。故有X(1)=X(0)。算法终止。故HR→C不是冗余的函数依赖,不能从F4中去掉。

E.设HS→R为冗余的函数依赖,则去掉HS→R,得:

F5={CS→G,C→T,TH→R,HR→C}

计算(HS)F5+:

设X(0)=HS

计算X(1):扫描F5中的各个函数依赖,没有找到左部为HS或HS子集的函数依赖。故有X(1)=X(0)。算法终止。故HS→R不是冗余的函数依赖,不能从F5中去掉。即:F5={CS→G,C→T,TH→R,HR→C,HS→R}

③ 去掉F5中各函数依赖左边多余的属性(只检查左部不是单个属性的函数依赖),没有发现左边有多余属性的函数依赖。

故最小函数依赖集为:F={CS→G,C→T,TH→R,HR→C,HS→R}

(二)由于R中的所有属性均在F中都出现,所以转下一步。

(三)对F按具有相同左部的原则分为:

R1=CSG,R2=CT,R3=THR,R4=HRC,R5=HSR。

所以ρ={R1(CSG),R2(CT),R3(THR),R4(HRC),R5(HSR)}。

BCNF的保持无损连接的分解

将关系模式R<U,F>分解为一个BCNF的基本步骤是

1).检查R中关系模式是否符合BCNF,若都符合输出即可

2)若R中有关系模式S不符合BCNF,则必有X->A的闭包不包含S的全部属性,把S分为{S1,S2},其中S1=XA,S2=(S-A)X,分别计算其最小函数依赖集,并将{S1,S2}代替S代入第一步中。

例题:

关系模式R<U,F>,其中:U={A,B,C,D,E},F={A→C,C→D,B→C,DE→C,CE→A},将其分解成BCNF并保持无损连接。

解:

① 令ρ={R(U,F)}。

② ρ中不是所有的模式都是BCNF,转入下一步。

③ 分解R:考虑A→C函数依赖不满足BCNF条件(A所以不是候选关键码),将其分解成R1(AC)、R2(ABDE)。计算R1和R2的最小函数依赖集分别为:F1={A→C},F2={B→D,DE→D,BE→A}。其中B→D是由于R2中没有属性C且B→C,C→D;DE→D是由于R2中没有属性C且DE→C,C→D;BE→A是由于R2中没有属性C且B→C,CE→A。又由于DE→D是蕴含关系,可以去掉,故F2={B→D,BE→A}。

分解R2:考虑B→D函数依赖不满足BCNF条件,将其分解成R21(BD)、R22(ABE)。计算R21和R22的最小函数依赖集分别为:F21={B→D},F22={BE→A}。

由于R22上的候选关键字为BE,而F22中的所有函数依赖满足BCNF条件。故R可以分解为无损连接性的BCNF如:ρ={R1(AC),R21(BD),R22(ABE)}

模式分解详解,分解为3NF与分解为BCNF相关推荐

  1. 什么是奇异值?奇异值分解是什么?SVD分解详解及实战

    什么是奇异值?奇异值分解是什么?SVD(Singular Value Decomposition)分解详解及实战 TSVD:Truncated Singular Value Decomposition ...

  2. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  3. CentOS下Hive2.0.0集群模式安装详解

    本文环境如下: 操作系统:CentOS 6 32位 Hive版本:2.0.0 JDK版本:1.8.0_77 32位 Hadoop版本:2.6.4 MySQL版本:5.6.30 1. 准备工作 1.1 ...

  4. Kafka单机、集群模式安装详解(二)

    本文环境如下: 操作系统:CentOS 6 32位 JDK版本:1.8.0_77 32位 Kafka版本:0.9.0.1(Scala 2.11) 接上篇 Kafka单机.集群模式安装详解(一) 6. ...

  5. Java多线程编程中Future模式的详解

    转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...

  6. java 组合对象_Java 中组合模型之对象结构模式的详解

    Java 中组合模型之对象结构模式的详解 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 ...

  7. 学习组合模式,转载一段有关组合模式的详解

                   学习组合模式,转载一段有关组合模式的详解,从定义中可以看出,组合模式用来表示部分与整体的层次结构(类似于树结构),而且也可以使用户对单个对象(叶子节点)以及组合对象( 飞 ...

  8. Cisco 3945路由器密码恢复,rommon模式操作详解

    Cisco 3945路由器密码恢复,rommon模式操作详解 在一次客户的网络出现故障,网络中断,排除故障的原因,发现到达路由器地址不通: 观察到路由器接口灯全部熄灭,电源状态正常: 然后使用cons ...

  9. 动态复权(真实价格)模式原理详解!

    动态复权(真实价格)模式原理详解! 如果没有意外,你之前一直在使用前复权价格做回测,使用前复权价格回测存在未来函数(未卜先知,提前使用未来的数据),因此你的回测结果都是错的. Tell me why? ...

  10. 手机相机专业模式参数详解

    手机相机专业模式参数详解 1. M (measure) 大写的M,是指测光图标,下边有三个子图标,第一个矩阵测光,适合广阔的风景照,第二个中央测光,适合有主体画面中间的场景,第三个点测光,适合舞台摄影 ...

最新文章

  1. R语言dplyr处理dataframe:使用mutate函数生成新的列、recode函数进行数据编码、rename函数重命名字段、arrange排序数据列、select筛选数据、filter过滤数据
  2. eclipse 中文件引用报错不能编译,但引用文件确实存在
  3. 中国钠离子电池行业竞争需求状况及投资盈利分析报告2021-2027年版
  4. 最全的IDEA快捷键
  5. leetcode 108. Convert Sorted Array to Binary Search Tree | 108. 将有序数组转换为二叉搜索树(Java)
  6. c/s三层结构信息系统的三个层次_网络资讯:三层架构是什么
  7. python string与list互转
  8. 机器学习(2)之正规方程组
  9. 公布 | 中国图象图形学学会首批Fellow名单公布
  10. MySQL三种打开方式
  11. 华为PLC-IoT生态联盟成立,携手合作伙伴共赢智慧物联新时代
  12. 【转】线程、Thread类和线程终止
  13. 启动root用户 银河麒麟_银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP
  14. linux shell 常用命令总结
  15. dev的pdf Viewer打印如何从横向打印修改为竖向靠上打印?
  16. HTML中获取计算机用户名,VC++ 得到计算机名和用户名 GetComputerName GetUserName
  17. 计算机技能大赛备赛计划,技能大赛计划.doc
  18. unity3d meshBaker教程(二) 自动合并
  19. python实现服务器客户端模式_Python简单实现服务器与客户端通讯
  20. 史上最详细的WordPress安装教程(六):安装WordPress

热门文章

  1. 原型网络计算出的原型如何在机器学习中发挥作用?
  2. JAVA如何实现图片批量下载
  3. 在腾讯工作是怎么样的体验,android开发从入门到精通pdf
  4. 【收藏】天罡称骨算命法
  5. 长沙理工大学c语言程序设计作业答案,长沙理工大学2014年上期期末c语言编程题库...
  6. 老胡的周刊(第089期)
  7. 神经网络算法通俗解释,神经网络的数学表达式
  8. 语录系统php,php鸟哥语录
  9. 苹果Mac OS详细介绍
  10. 快来智影:微电影是如何诞生的?