解题步骤:
1.求出R上的函数依赖集F的最小函数依赖集Fm
2.如果R中某些属性在Fm中的每个函数依赖的左右两边都不出现,那么就将这些属性从R中分离出去,单独构成一个分解的字模式放入P中。
例如:R(A,B,C) F={A->B},因为C不在依赖集中,所以可以分解为R1(A,B) R2(C)
3.如果Fm中有多个左部相同属性的函数依赖,可依据合并率将它们的右部分合并起来。
例如:A->B,A->C,那么A->BC
4.对于Fm中的每一个函数依赖:X->A,构成一个分解的子模式「X,A」放P中。
R(A,B,C,D) F={A->B,C->D} R1{AB} R2{CD},把每一个函数依赖都单独构成分解的子模式
5.检查在分解后的子模式集合中是否包含有R的一个候选码,如果没有包含,则把候选码作为一个分解放入P中(如果有多个候选码,任选1个)
R{A,B,C},假设A是候选键,F={B->C} R1{BC},R2{A},这里只是假设的情况,因为按照这个例子,在步骤二中A已经被分离出去了
看不懂没关系,来看看例子吧!
例:R(A,B,C,D,E,G),F={A->B,A->C,A->D,A->E,A->G,CDE->G,G->C,G->D}
步骤一:
如果删除A->B,看其余的依赖能否使A推出B
A的闭包={A,C,D,E,G}无B
如果删除A->C
A的闭包={A,B,D,E,G,C}删除A->C
更新F
F={A->B,A->D,A->E,A->G,CDE->G,G->C,G->D}
按照以上步骤继续推:
F={A->B,A->E,CDE->G,G->C,G->D,A->G}
步骤二:
F={A->B,A->E,CDE->G,G->C,G->D,A->G}
F中有R(A,B,C,D,E,G)中的所有元素
步骤三:左部分相同的进行合并:
F={A->BEG,CDE->G,G->CD}
步骤四:
p={R1(ABEG)R2(CDEG)R3(GCD)}
步骤五:
求F下的候选键:
如果不太熟悉的可以看我发布的这篇文章:
F={A->BEG,CDE->G,G->CD}
L:A
R:B
LR=C,D,E,G
由A的闭包=ABCDEG=U可以得知:A是唯一候选键
p={R1(ABEG)R2(CDEG)R3(GCD)}
因为R1中包含了A
所以P为一个保持无损连接和函数依赖的3NF
注:R2(CDEG)R3(GCD)
R3是R2的一个子集,P中存在冗余模式,所以把P进行简化,最终得:
P={R1(A,B,E,G)R2(C,D,E,G)}
假如P中无候选键:候选键是N
那么P={R1(A,B,E,G)R2(C,D,E,G),R3(N)},即把N单独分解出来写
这里还有关于保持无损连接的BCNF算法详细讲解,宜一起食用哟!💖💖💖