一、一個關系模式的碼的求解方法
求候選碼的簡單方法方法:
(1)如果有屬性不在函數依賴集中出現,那么它必須包含在候選碼中;
(2)如果有屬性不在函數依賴集中任何函數依賴的右邊出現,那么它必須包含在候選碼中;
(3)如果有屬性只在函數依賴集的左邊出現,則該屬性一定包含在候選碼中。
(4)如果有屬性或屬性組能唯一標識元組,則它就是候選碼;
之后對於根據上述方法剔除和加入的key進行組合判斷,即將已經選出來的key和其余剩下的屬性進行一一組合,然后判斷即可
例題:
(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
二、轉換為2nf的方法
這個一般畫圖就能解決,只要把非主屬性對key的部分依賴的部分隔離為一個新的關系就好了。
三、轉換為3nf的方法(這里直接寫保持依賴and無損分解的轉換方法)
1.求解最小依賴集(對每一個依賴關系逐一去掉,判斷去掉這個依賴是否對整個依賴集有影響),直接上題
例1:關系模式R<U,F>,其中U={C,T,H,R,S,G},
F={CS→G,C→T,TH→R,HR→C,HS→R},將其分解成3NF並保持函數依賴。
解:根據算法進行求解
(一)計算F的最小函數依賴集
① 利用分解規則,將所有的函數依賴變成右邊都是單個屬性的函數依賴。由於F的所有函數依賴的右邊都是單個屬性,故不用分解。
② 去掉F中多余的函數依賴
A.設CS→G為冗余的函數依賴,則去掉CS→G,得:
F1={C→T,TH→R,HR→C,HS→R}
計算(CS)F1+:
設X(0)=CS
計算X(1):掃描F1中各個函數依賴,找到左部為CS或CS子集的函數依賴,找到一個C→T函數依賴。故有X(1)=X(0)∪T=CST。
計算X(2):掃描F1中的各個函數依賴,找到左部為CST或CST子集的函數依賴,沒有找到任何函數依賴。故有X(2)=X(1)。算法終止。
(CS)F1+= CST不包含G,故CS→G不是冗余的函數依賴,不能從F1中去掉。
B.設C→T為冗余的函數依賴,則去掉C→T,得:
F2={CS→G,TH→R,HR→C,HS→R}
計算(C)F2+:
設X(0)=C
計算X(1):掃描F2中的各個函數依賴,沒有找到左部為C的函數依賴。故有X(1)=X(0)。算法終止。故C→T不是冗余的函數依賴,不能從F2中去掉。
C.設TH→R為冗余的函數依賴,則去掉TH→R,得:
F3={CS→G,C→T,HR→C,HS→R}
計算(TH)F3+:
設X(0)=TH
計算X(1):掃描F3中的各個函數依賴,沒有找到左部為TH或TH子集的函數依賴。故有X(1)=X(0)。算法終止。故TH→R不是冗余的函數依賴,不能從F3中去掉。
D.設HR→C為冗余的函數依賴,則去掉HR→C,得:
F4={CS→G,C→T,TH→R,HS→R}
計算(HR)F4+:
設X(0)=HR
計算X(1):掃描F4中的各個函數依賴,沒有找到左部為HR或HR子集的函數依賴。故有X(1)=X(0)。算法終止。故HR→C不是冗余的函數依賴,不能從F4中去掉。
E.設HS→R為冗余的函數依賴,則去掉HS→R,得:
F5={CS→G,C→T,TH→R,HR→C}
計算(HS)F5+:
設X(0)=HS
計算X(1):掃描F5中的各個函數依賴,沒有找到左部為HS或HS子集的函數依賴。故有X(1)=X(0)。算法終止。故HS→R不是冗余的函數依賴,不能從F5中去掉。即:F5={CS→G,C→T,TH→R,HR→C,HS→R}
③ 去掉F5中各函數依賴左邊多余的屬性(只檢查左部不是單個屬性的函數依賴),沒有發現左邊有多余屬性的函數依賴。
故最小函數依賴集為:F={CS→G,C→T,TH→R,HR→C,HS→R}
2.對於最小依賴集里的依賴,若存在兩側均未出現的屬性,則將這些屬性划分為一個集合
3.如果要求連接成無損,則直接再添加一個候選碼
三、轉BCNF
將關系模式R<U,F>分解為一個BCNF的基本步驟是