求閉包
求屬性集()關於 上的函數依賴集的閉包 。
1、令,i=0。
2、對於F中所有左邊爲或其子集的函數依賴,把其右邊的屬性加入,得到。
3、判斷是否等於U,若相等,則。判斷是否等於,若相等,則。否則繼續執行第二步,i++。
例:有關係 ,,,求。
- 令
- 由得,
- 由得,
- 故
求候選碼
1、把函數依賴集F中的屬性分爲L類、R類、LR類和N類。
L類:只在函數依賴左邊出現的屬性
R類:只在函數依賴右邊出現的屬性
LR類:在函數依賴左邊和右邊都出現的屬性
N類:未在函數依賴中出現的屬性
2、對於各類,有如下性質:
- 若X是L類,則X必爲關係R的任一候選碼
- 若X是L類,且 ,則X爲唯一候選碼
- 若X是R類,則X不在任何候選碼中
- 若X是N類,則X必包含在任一候選碼中
3、對屬於L類的屬性,不斷的加入LR的屬性,形成屬性組W,求 ,若 ,則W爲候選碼。求出所有的Wi。
例:有關係 ,,
L類:A、B, R類:C、E, LR類:D, N類:無
則候選碼中一定有AB,有,由性質2得,(A, B)爲唯一候選碼。
分解爲2NF
若關係中,主鍵爲W,有且,則可把關係分解爲 ,。
判斷R1,R2是否均符合2NF;若不符合,則繼續按上述方法分解,直到符合爲止。
例:有關係 ,,
已知候選碼爲(A, B),有,故R不符合2NF,分解爲,。
R1,R2均符合2NF。
求最小依賴集
1、去掉F中所有函數依賴右邊的多屬性。
例:
2、去掉F中所有函數依賴左邊的多屬性。
例:對於,若,則
3、去掉冗餘的函數依賴。
例:對於,若去掉該條函數依賴後,對於F中剩下的函數依賴,可以得到,則該條函數依賴可去除
分解爲3NF(保持函數依賴)
1、求F的最小依賴集,仍記爲F。
2、對於F中爲出現的屬性,把這些屬性構成一個關係模式R0,同時把這些屬性從U中除去,剩餘的屬性仍記爲U。
3、若有,且XA=U,則算法終止,否則執行第4步。
4、對F中的所有函數依賴,按具有相同左部的原則分爲k組。每一組中出現的所有屬性組成的集合爲,若則去掉。剩餘的所有各組成一個關係模式。
例:有關係,,,
1、求F的最小依賴集
- 右邊無多屬性,跳過
- 左邊爲多屬性,求得,故不可去除
- 去掉,有;去掉,有;去掉,有,故不可去除
因此,F最小依賴集爲。
2、 F中所有屬性均有出現,故跳過該步。
3、不滿足算法終止條件,跳過該步。
4、按相同左部可分爲(A, B, C),(A, D),(D, E)。他們之間彼此不存在包含關係,因此該關係模式可分解爲,,。