参考b站up主: 早上好我是DJ同学 的视频总结加个人笔记
求闭包
一步一步求即可
求候选键
首先求得是L∪N是否可以表示R 。不行的话就从LR中选
A已经被选择了而且已经可以构成R,在后面选择的时候就不用选
求最小函数依赖集
右部最小化,把多个属性各自分开
若删除依赖x,则x在F中先不看, B->D先不看
ADG->B先不看,通过闭包可以得到全集U(包含X->Y的Y,即在题中是B),因此要删除
ADG->B删除后就不能再使用了,F中消失了
ADG->C先不看,通过闭包可以得到全集U(包含X(ADG)->Y(C)的Y,即在题中是C),因此要删除
第三步(左边是单属性就不用处理了)左部最小化
删除D对于B->E没有影响,回看最开始的步骤图片
BD->E更换为B->D
虽然第三步完成了,但是在第三步中有删减更改,需要重新过一次第二步(第三步也是需要重新再处理的)
完成完第三步若没有更改才停止
流程图
求投影
这里的R指的是要求投影的R
这里的R是ACD
在ACD中取三个可以忽略,因为在题中没有依赖左边是三个的
找非(平凡trivial)函数(不是一眼看出来的,例如A^+=A这种就是trivial平凡)
D^+=DB,可以得到D->B
可以从AD->BC分解AD->B,AD->C,因为FD(函数依赖)中存在B,在投影中没有B这个属性的,所以用不了,去掉,最后得到的只有一个
多一个例题
因为在题中没有依赖左边是三个的
判断是否保持函数依赖 preserve all functional dependencies
求分解投影
这里先求AB投影
B->AC忽略C在AB投影中,因为AB投影中没有C这个属性
求AC的投影
A->C在R3中没有用,因为R3是AD,因此为空集
第二步已经成立,无需做第三步
另一题
C在步骤三中是没有成存在的,因为F1∪F2∪F3中没有C->D,所以需要单独算C的闭包。因为C可以推出D,所以成立
分解3NF
前面用到的求最小函数依赖的方法 注意CDE->G写的是CDE的闭包,不是A的
(左边是单属性就不用处理了)左部最小化
下一步是合并
然后是求候选键,因为下面的R3是R2的一个子集,所以可以删掉R3
最终结果
根据算法第三步可知,若没有候选键在模式中,需要补上候选键(至少一个),下面是例子
分解BCNF
先求候选键,R中候选键是A,找到左边不包含超键的属性C->D,C不是超键,分解R
分解方法:X->Y在这里是C->D,因为A是候选键也是超键,所以前面的FD就先忽略,到C->D,又因为C不是超键,所以要将Ri分解,这里的Ri是R,因为这是第一次迭代,所以i=0。把Ri分解成XY和Ri减去Y两个模式,在这里是X为C,Y为D,XY为CD,这里可以写成R1。Ri-Y就是集合的减法Ri为ABCDFEG减去Y为D,所以R2可以写成ABCEFG,后面的步骤同理
防止遗漏,求F的闭包,在题中是A,C,E的闭包,A的闭包是U全集,C的闭包是CDEFG,E的闭包是EFG,这里是为F2的构造做准备,所以后面的R2可以到C->EFG
不用写C,因为这是平凡依赖
需要再次求R2的候选键,R2中C和E不是超键为了不漏,需要求F2的闭包
再次求R3的候选键是C,R3(CEFG)可以得到两个依赖 绿色标记的就是分解好的bcnf
如有遗漏和错误,欢迎一起探讨!!!
自己作业的例题,可能会有错误