
給定關系模式R(U,F)。將R的所有屬性分為L,R,LR和N四類。其中
R表示屬性只在函數依賴右邊出現;
LR表示屬性既在左邊出現,又在右邊出現;
N表示函數依賴左右都未出現。

例:關系模式R(A,B,C,D),函數依賴F={A→BC,BC→A,BCD→EF,E→C},求R的候選碼。
解:
1.首選找出L,R,LR,N
只在函數依賴左邊出現 L={D}
只在函數依賴右邊出現R={F}
在函數依賴左右邊都出現 LR={A,B,C,E}
函數依賴左右邊都未出現 N={ }
2.令X,判斷是否是唯一候選碼
令X=L ∪ N ={D},則X={D},故D的閉包D+ = {D}。因此不是候選碼
3.在LR中選取元素
1.選取A,則(AD)+ ={A,D,B,C,E,F} 與R相同,故AD是候選碼
2.選取B,則(BD)+={B,D},顯然與R不同,故BD不是候選碼
3.選取C,則(CD)+={C,D},顯然與R不同,故CD不是候選碼
4.選取D,則(ED)+={D,E,C},顯然與R不同,故ED不是候選碼
4.因此,在LR中,使用了屬性A,還剩下屬性{B,C,E}未使用。
1.選取BC,則(BCD)+={D,B,C,E,F,A} 與R相同,故BCD是候選碼
2.選取BE,則(BED)+={D,B,E,C,A,F}與R相同,故BDE是候選碼
3.選取CE,則(CED)+={D,C,E},顯然與R不同,故CED不是候選碼。
此時,LR中無剩余屬性【也可以理解為,LR中無新的屬性組合(注意理解什么是候選鍵)】。
綜上所述,輸出的候選鍵為 DA,DBC和DBE。
求解步驟
計算關系R的屬性集X的閉包的步驟如下:
第一步:設最終將成為閉包的屬性集是Y,把Y初始化為X;
第二步:檢查F中的每一個函數依賴A→B,如果屬性集A中所有屬性均在Y中,而B中有的屬性不在Y中,則將其加入到Y中;
第三步:重復第二步,直到沒有屬性可以添加到屬性集Y中為止。 最后得到的Y就是X的閉包
舉個例子
關系R(A,B,C)滿足函數依賴M(A -> B,A -> C,B -> AC)求A,B,C的閉包
求解A的閉包:此時需要求解A的閉包,那么根據上面的描述,初始狀態Y = {A}
開始依次查找每一個函數依賴,如果函數依賴的左邊只有A,並且右邊的右邊的元素不在Y中,就把它加入Y
首先碰到A -> B,B不在Y中,此時把B加入到Y, Y = {A,B}
再來遍歷函數依賴,現在只要函數依賴左邊是{A ,B ,AB}中的一個,我們都可以把右邊的元素吸收至,碰到A -> C,左邊是A,且右邊是C,沒有在Y中,我們將其加入Y 。此時Y = {A, B ,C}已經包含了所有元素,算法結束。所以A的閉包為{A,B,C}
求解B的閉包:初始狀態Y={B}
依次遍歷所有函數依賴,查找左邊只有B的,查找到B -> AC,這個函數依賴的左邊只有一個B,右邊的元素不在Y中,我們將{A,C}加Y,此時Y已經達到{A,B,C},算法結束。所以B的閉包為{A,B,C}
求解C的閉包:初始狀態Y={C}
依次遍歷所有函數依賴,查找左邊只有C的,查找不到,已經沒有屬性可以添加至Y中,算法結束。所以C的閉包為{C}
至此,閉包求解結束。