轉換成3NF的保持函數依賴的分解算法:
ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}是關系模式R<U,F>的一個分解,U={A1,A2,...,An},F={FD1,FD2,...,FDp},並設F是一個最小依賴集,記FDi為Xi→Alj,其步驟如下:
① 對R<U,F>的函數依賴集F進行極小化處理(處理后的結果仍記為F);
② 找出不在F中出現的屬性,將這樣的屬性構成一個關系模式。把這些屬性從U中去掉,剩余的屬性仍記為U;
③ 若有X→A€ F,且XA=U,則ρ={R},算法終止;
④ 否則,對F按具有相同左部的原則分組(假定分為k組),每一組函數依賴Fi所涉及的全部屬性形成一個屬性集Ui。若Ui¢ Uj(i≠j),就去掉Ui。由於經過了步驟②,故,於是構成的一個保持函數依賴的分解。並且,每個Ri(Ui,Fi)均屬於3NF且保持函數依賴。
對於步驟1中函數集的極小化處理可以參見博客 http://i.cnblogs.com/PostDone.aspx?postid=4445027&actiontip
例1:關系模式R<U,F>,其中U={C,T,H,I,S,G},F={CS→G,C→T,TH→I,HI→C,HS→I},將其分解成3NF並保持函數依賴。
(一)計算F的最小函數依賴集
① 利用分解規則,將所有的函數依賴變成右邊都是單個屬性的函數依賴。由於F的所有函數依賴的右邊都是單個屬性,故不用分解。
② 去掉F中多余的函數依賴
A.設CS→G為冗余的函數依賴,則去掉CS→G,得:
F1={C→T,TH→I,HI→C,HS→I}
計算(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→I,HI→C,HS→I}
計算(C)F2+:
設X(0)=C
計算X(1):掃描F2中的各個函數依賴,沒有找到左部為C的函數依賴。故有X(1)=X(0)。算法終止。故C→T不是冗余的函數依賴,不能從F2中去掉。
C.設TH→I為冗余的函數依賴,則去掉TH→I,得:
F3={CS→G,C→T,HI→C,HS→I}
計算(TH)F3+:
設X(0)=TH
計算X(1):掃描F3中的各個函數依賴,沒有找到左部為TH或TH子集的函數依賴。故有X(1)=X(0)。算法終止。故TH→I不是冗余的函數依賴,不能從F3中去掉。
D.設HI→C為冗余的函數依賴,則去掉HI→C,得:
F4={CS→G,C→T,TH→I,HS→I}
計算(HI)F4+:
設X(0)=HI
計算X(1):掃描F4中的各個函數依賴,沒有找到左部為HI或HI子集的函數依賴。故有X(1)=X(0)。算法終止。故HI→C不是冗余的函數依賴,不能從F4中去掉。
E.設HS→I為冗余的函數依賴,則去掉HS→I,得:
F5={CS→G,C→T,TH→I,HI→C}
計算(HS)F5+:
設X(0)=HS
計算X(1):掃描F5中的各個函數依賴,沒有找到左部為HS或HS子集的函數依賴。故有X(1)=X(0)。算法終止。故HS→I不是冗余的函數依賴,不能從F5中去掉。即:F5={CS→G,C→T,TH→I,HI→C,HS→I}
③ 去掉F5中各函數依賴左邊多余的屬性(只檢查左部不是單個屬性的函數依賴)
沒有發現左邊有多余屬性的函數依賴。故最小函數依賴集為:
F={CS→G,C→T,TH→I,HI→C,HS→I}
(二)由於R中的所有屬性均在F中都出現,所以轉下一步。
(三)對F按具有相同左部的原則分為:R1=CSG,R2=CT,R3=THI,R4=HIC,R5=HSI。所以ρ={R1(CSG),R2(CT),R3(THI),R4(HIC),R5(HSI)}。
聲名:本文轉載自百度文庫
http://wenku.baidu.com/link?url=MUYZ--karIERpPnbvYAa5mb5f6LGCTtR41OFmv8lEMCivO96FmQ-ZbYtETZF-BlEw1Um6a3Bkb0qkxWE7d3AR9dyFsew-_HtMftPcbl0qli