本文出现了很多错误,在我考研期间所写,经验有所不足,建议不要看了。
在模式分解之前,首先对于1NF,2NF,3NF,BCNF有一个简明扼要的介绍。
1NF是一个关系模式最基本的要求,即一个不可分割的关系型数据库即可满足,
2NF要求每个关系模式都必须依赖于主键码。
3NF要求每个关系模式之间不能存在传递依赖与部分依赖。
BCNF要求每个关系模式的左部都至少包含候选关键字。
将关系模式R分解为一个3NF的基本步骤是
1).首先将关系模式R的函数最小依赖集求出来。
2).若求得的函数最小依赖集左部都是单属性,则完成对于关系模式R的3NF分解,结束。
3).去掉多余的函数传递依赖
3).找出不在F中的属性,将其构成一个关系模式并去掉,剩余的记为U。(如例1)
4).将左部相同的属性分为一组。对于每一组的并集若组合成为U,则完成3NF的分解。
例1.已知关系模式R,有U={A,B,C,D,E},F={A->B}.将关系模式R分解为3NF且保持函数依赖。
关系模式R的最小函数依赖集为Fm={A->B},在U中没有{C,D,E},于是将(CDE)组成一个关系模式并去掉。
剩余p={R<{A,B},{A->B}>},则关系模式R分解为3NF为(AB)。
下一个例题是一个完整的求模式分解的例题。
将关系模式R分解为一个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代入第一步中。
例2.关系模式R,有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)}。