算法
1.给定关系模式R(U,F),X∈U,将R的所有属性分为L,R,N和LR四类。
L:表示属性只在函数依赖的左边出现;
R:表示属性只在函数依赖的右边出现
N:表示属性在函数依赖中左右都未出现;
LR:表示属性既可以出现在左边,又可以出现在右边;
2.令X = L u N,Y = LR。求X的闭包,若X的闭包包含了R的所有属性,则X为R的唯一候选码,转5。
3.Y中选取任意一个属性A,求(XA)的闭包,若它包含了R的全部属性,则是候选码。调换属性,反复进行这个过程,知道试完Y中的所有属性。
4.如果已找出所有的候选码,转5,否则在Y中一次选取2个属性,3个属性,…,求它们的闭包。若其闭包包含R的全部属性,则是候选码。
5.结束算法,输出候选码。
定理
(1)若X是L类属性,则X必为R的候选码成员;若X的闭包包含全部属性U,则X必为R的唯一候选码。
(2)若X是R类属性,则X不在任何候选码中。
(3)若X是N类属性,则X必为R的候选码成员。
(4)若X是L类和N类属性组成的属性集,且X的闭包包含U,则X是R的唯一候选码。
(5)若X是LR类属性,则X可能为R的任一候选码的成员,也可能不为R的任一候选码的成员。
实例
例:关系模式R(A,B,C,D,E,F),函数依赖F={A→BC,BC→A,BCD→EF,E→C},求R的候选码。
1.首先找出L,R,N,LR四中属性分类
L:D
R:F
N:
LR:A,B,C,E
(注意:如果R ={A,B,C,D,Z},因为Z不出现在函数依赖F的任何一边中,所以Z属于N类,Z必为候选码成员)
2.令X = L u N = {D},则X = {D},此时就要去找D的闭包,从函数依赖F中可看到D不能决定任何一个其它属性,所以D的闭包D+ = {D},因此不是候选码。
(注意:如果此时D的闭包等于R全集,那么D就是唯一的候选码,算法退出)
3.从LR中分别选取一个属性和第2步的L属性进行组合,然后再求各自的闭包。如(注意:第3步后所求到的候选码都不是唯一的)
选取A :(AD)+ = {A,D,B,C,E,F} = R
解释:因为A→BC,BCD→EF,所以AD u BC u EF = ABCDEF,所以AD是候选码
选取B:(BD)+={B,D} ≠ R
解释:因为B和D都不能推出其它的属性,所以BD不是候选码
选取C:(CD)+={C,D} ≠ R
解释:因为C和D都不能推出其它的属性,所以CD不是候选码
选取E:(ED)+={E,D,C} ≠ R
解释:因为E→C,但C和D都不能推出其它的属性,所以ED也不是候选码
4.这一步是要选择LR中的两个属性和D相结合,因为在上一步骤中选取了属性A,所以还剩下属性B,C,E未使用
选取BC :(BCD)+={D,B,C,E,F,A} = R
解释:因为BC→A,BCD→EF,BCD u A u EF = ABCDEF, 所以BCD是候选码
选取BE:(BED)+={D,B,E,C,A,F} = R
解释:因为E→C,BC→A,BCD→EF,BED u C u A u EF = ABCDEF,所以BED是候选码
选取CE:(CED)+={C,E,D} ≠ R
解释:因为C、D推不出其它属性,E→C,CE、CD、ED也推不出其它属性,所以CED不是候选码
因为这一步选取了BC和BE,所以属性B、C、E已经被选用,加上上一步选取的A属性,LR中的属性已全部选完,也可以理解为LR中无新的属性组合
综上所诉,输出的候选码为AD、BCD和BED
总结
上诉加号都表示闭包的意思,求候选码需要先懂得如何求闭包。