轉換成3NF的保持函數依賴的分解算法
==================================================ide
算法2:函數
=================================================================== .net
例1:關係模式R<U,F>,其中U={C,T,H,R,S,G},blog
F={CS→G,C→T,TH→R,HR→C,HS→R},將其分解成3NF並保持函數依賴。it
解:根據算法進行求解 class
(一)計算F的最小函數依賴集im
① 利用分解規則,將全部的函數依賴變成右邊都是單個屬性的函數依賴。因爲F的全部函數依賴的右邊都是單個屬性,故不用分解。img
② 去掉F中多餘的函數依賴di
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}
(二)因爲R中的全部屬性均在F中都出現,因此轉下一步。
(三)對F按具備相同左部的原則分爲:
R1=CSG,R2=CT,R3=THR,R4=HRC,R5=HSR。
因此ρ={R1(CSG),R2(CT),R3(THR),R4(HRC),R5(HSR)}。
原文:http://blog.csdn.net/ristal/article/details/6652008