求候選碼的簡單方法方法:
(1)如果有屬性不在函數依賴集中出現,那么它必須包含在候選碼中;
(2)如果有屬性只在函數依賴集的右邊出現,則該屬性一定不包含在候中。
(3)如果有屬性只在函數依賴集的左邊出現,則該屬性一定包含在候選碼中。
(4)如果有屬性或屬性組能唯一標識元組,則它就是候選碼;
例 1:R<U,F>,U=(A,B,C,D,E,G),F={AB-->C,CD-->E,E-->A.A-->G},求候選碼。
因 G 只在右邊出現,所以 G 一定不屬於候選碼;
而 B,D 只在左邊出現,所以 B,D 一定屬於候選 碼;
BD 的閉包還是 BD,則對 BD 進行組合,
除了 G 以外,BD 可以跟 A,C,E 進行組合
先看 ABD
ABD 本身自包 ABD,而 AB-->C,CD-->E,A-->G,所以 ABD 的閉包為 ABDCEG=U
再看 BDC CD-->E,E-->A,A-->G,BDC 本身自包,所以 BDC 的閉包為 BDCEAG=U
最后看 BDE E-->A,A-->G,AB-->C,BDE 本身自包,所以 BDE 的閉包為 BDEAGC=U
因為(ABD)、 (BCD)、 (BDE)的閉包都是 ABCDEG 所以本問題的候選碼有 3 個分別是 ABC、BCD 和 BDE
例 2:R<U,F>,U=(A,B,C),F={AB-->C,C-->B},求候選碼。
因為A只出現在左邊,所以A一定是候選鍵。
A的閉包還是A,則對A進行組合,可以和B,C 進行組合。
首先看AB,AB本身自包AB,而AB-->C,所以AB的閉包是ABC=U。
再看AC,AC本身自包AC,而C-->B,所以AC的閉包是ABC=U。
因為AB,AC的閉包都是ABC,也就是U,所以候選鍵是AB,AC。
【例 1】關系模型 R<U,F>,U={A,B,C,D},F={B→D,AB→C},求 R 候選碼。
在求解之前先要明白一些定理。我們把函數依賴集中 F 中的屬性分為四類:
L 類:A,B
R 類:C,D
LR 類:
N 類:
AB閉包:AB+=ABCD
【例 2】關系模型 R<U,F>,U={A,B,C,D},F={BCD→A,A→C},求 R 候選碼。
L 類:B,D
R 類:
LR 類:A,C
N 類:
BD閉包:BD+=BD
ABD閉包:ABD+=ABCD是R的一個候選碼
BCD閉包:BCD+=ABCD也是R的一個候選碼
第一步:同樣對U中屬性進行分類,得出A是LR類,B是L類C是LR類,D是L類。
第二步:由定理可知,BD必在候選碼中,A,C可能在候選碼中。假定目前候選碼K=BD。
第三步:求K=BD的閉包。根據閉包算法得,BD+=BD,並不等於U。這時,我們從LR類中取一個屬性,和BD組成臨時候選碼K。
第四步:先從LR類中取A,得到 K=ABD。再求 K=ABD 的閉包,得到 ABD+=ABCD,正好等於U,說明K=ABD是R的一個候選碼。
再從LR類中取C,得到K=BCD。再求 K=BCD 的閉包,得到BCD+=ABCD,也等於U,說明K=BCD也是R的一個候選碼。所以R的候選碼 K={ABD,BCD}。
最后,如果第四步中在 LR 類中取一個屬性的組合都不滿足 K 的閉包等於數據集 U,則從 LR 類中取 2 個,3 個,……n 個,
分別組合,直到選出一個數據集 K 的閉包等於屬性集 U,K 就是 R 的一個屬性集。
L 類:所有依賴關系中僅出現在函數依賴左部的屬性。
R 類:所有依賴關系中僅出現在函數依賴右部的屬性。
LR 類:所有依賴關系中即出現在函數依賴左部又出現在函數依賴右部的屬性。
N 類:所有依賴關系中沒有出現的屬性。
根據以下定理和推論來求解候選碼。
定理 1:對於給定的關系模式R及其函數依賴集F,若X(X∈R)是L類屬性,則X必為R的任一候選碼的成員。
推論 1:對於給定的關系模式R及其函數依賴集F,若X(X∈R)是L類屬性,且X+包含了R的全部屬性,則X必為R的唯一候選碼。
定理 2:對於給定的關系模式R及其函數依賴集F,若X(X∈R)是R類屬性,則X不在任何候選碼中。
定理 3:設有關系模式R及其函數依賴集F,如果X是R的N類屬性,則X必包含在R的任一候選碼中。
推論 2:對於給定的關系模式R及其函數依賴集F,如果X是R的N類和L類組成的屬性集,且X+包含了R的有屬性,則X是R的唯一候選碼