首先,需要了解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})
如有错误,欢迎指正。