算法:
1.求出R上的函數(shù)依賴集F的最小函數(shù)依賴集Fm
2.如果R中某些屬性在Fm中的每個(gè)函數(shù)依賴的左右兩邊都不出現(xiàn),那么就將這些屬性從R中分離出去,單獨(dú)構(gòu)成一個(gè)分解的字模式放入P中。
3.如果Fm中有多個(gè)左部相同屬性的函數(shù)依賴,可依據(jù)合并率將它們的右部分合并起來。
4.對(duì)于Fm中的每一個(gè)函數(shù)依賴:X—>A,構(gòu)成一個(gè)分解的子模式{X,A}放P中。
5.檢查在分解后的子模式集合中是否包含有R的一個(gè)候選碼,如果沒有包含,則把候選碼作為一個(gè)分解放入P中(如果有多個(gè)候選碼,任選1個(gè))
6.結(jié)束。
注:前置知識(shí)點(diǎn):最小函數(shù)依賴集、候選鍵的計(jì)算。
例題:R(A,B, C,D,E,G),F(xiàn) = {A -> B , A -> C , A - >D , A -> E , A - >G , CDE ->G , G ->C , G -> D}
解:
步驟一:計(jì)算最小函數(shù)依賴集Fm 。
假設(shè)刪除A -> B,則A的閉包={A,C,D,E,G},無B,保留
假設(shè)刪除 A -> C,則A的閉包={A,B,D,E,G,C},有C,刪除,
此時(shí)F更新為:
F = {A -> B , A - >D , A -> E , A - >G , CDE ->G , G ->C , G -> D}
假設(shè)刪除A - >D,則A的閉包={A,B,E,G,C,D},有D,刪除
此時(shí)F更新為:
F = {A -> B , A -> E , A - >G , CDE ->G , G ->C , G -> D}
假設(shè)刪除A - >E,則A的閉包={A,B,G,C,D},無E,保留
假設(shè)刪除A - >G,則A的閉包={A,B,E},無G,保留
假設(shè)刪除CDE - >G,則CDE的閉包={C,D,E},無G,保留
假設(shè)刪除G - >C,則G的閉包={G,D},無C,保留
假設(shè)刪除G - >D,則G的閉包={G,C},無D,保留
看冗余項(xiàng),
如果刪除C,則DE的閉包={D,E},保留
如果刪除D,則CE的閉包={C,E},保留
如果刪除E,則CD的閉包={C,D},保留
此時(shí),最小函數(shù)依賴集Fm為:
Fm = {A -> B , A -> E , A - >G , CDE ->G , G ->C , G -> D}
*注:Fm不唯一
步驟二:R中的所有屬性均出現(xiàn)
步驟三:合并Fm
Fm= {A->BEG , CDE ->G , G ->CD }
步驟四:
P={R1(ABEG),R2(CDEG),R3(CDG)}
計(jì)算求得F的候選鍵為A,顯然R1中包含了A,故步驟五結(jié)束。
注意:此時(shí)觀察到 P中存在冗余模式,即 R3是R2的子集,因此將其合并
更新P={R1(ABEG),R2(CDEG)}
綜上,P為一個(gè)保持無損連接和函數(shù)依賴的3NF
學(xué)者網(wǎng)

評(píng)論 0