關係規範化之求最小函式依賴集(最小覆蓋)

2021-07-11 10:15:25 字數 3121 閱讀 6153

最小函式依賴集

一、等價和覆蓋

定義:關係模式r上的兩個依賴集f和g,如果f+=g+,則稱f和g是等價的,記做f≡g。若f≡g,則稱g是f的乙個覆蓋,反之亦然。兩個等價的函式依賴集在表達能力上是完全相同的。

二、最小函式依賴集

定義:如果函式依賴集f滿足下列條件,則稱f為最小函式依賴集或最小覆蓋。

① f中的任何乙個函式依賴的右部僅含有乙個屬性;

② f中不存在這樣乙個函式依賴x→a,使得f與f-等價;

③ f中不存在這樣乙個函式依賴x→a,x有真子集z使得f-∪與f等價。

演算法:計算最小函式依賴集。

輸入 乙個函式依賴集

輸出 f的乙個等價的最小函式依賴集g

步驟:① 用分解的法則,使f中的任何乙個函式依賴的右部僅含有乙個屬性;

② 去掉多餘的函式依賴:從第乙個函式依賴x→y開始將其從f中去掉,然後在剩下的函式依賴中求x的閉包x+,看x+是否包含y,若是,則去掉x→y;否則不能去掉,依次做下去。直到找不到冗餘的函式依賴;

③去掉各依賴左部多餘的屬性。乙個乙個地檢查函式依賴左部非單個屬性的依賴。例如xy→a,若要判y為多餘的,則以x→a代替xy→a是否等價?若a 

(x)+,則y是多餘屬性,可以去掉。

舉例:已知關係模式r,u=,f=,求f的最小函式依賴集。

解1:利用演算法求解,使得其滿足三個條件

① 利用分解規則,將所有的函式依賴變成右邊都是單個屬性的函式依賴,得f為:f=

② 去掉f中多餘的函式依賴

a.設ab→c為冗餘的函式依賴,則去掉ab→c,得:f1=

計算(ab)f1+:設x(0)=ab

計算x(1):掃瞄f1中各個函式依賴,找到左部為ab或ab子集的函式依賴,因為找不到這樣的函式依賴。故有x(1)=x(0)=ab,演算法終止。

(ab)f1+= ab不包含c,故ab→c不是冗餘的函式依賴,不能從f1中去掉。

b.設cg→b為冗餘的函式依賴,則去掉cg→b,得:f2=

計算(cg)f2+:設x(0)=cg

計算x(1):掃瞄f2中的各個函式依賴,找到左部為cg或cg子集的函式依賴,得到乙個c→a函式依賴。故有x(1)=x(0)∪a=cga=acg。

計算x(2):掃瞄f2中的各個函式依賴,找到左部為acg或acg子集的函式依賴,得到乙個cg→d函式依賴。故有x(2)=x(1)∪d=acdg。

計算x(3):掃瞄f2中的各個函式依賴,找到左部為acdg或acdg子集的函式依賴,得到兩個acd→b和d→e函式依賴。故有x(3)=x(2)∪be=abcdeg,因為x(3)=u,演算法終止。

(cg)f2+=abcdeg包含b,故cg→b是冗餘的函式依賴,從f2中去掉。

c.設cg→d為冗餘的函式依賴,則去掉cg→d,得:f3=

計算(cg)f3+:設x(0)=cg

計算x(1):掃瞄f3中的各個函式依賴,找到左部為cg或cg子集的函式依賴,得到乙個c→a函式依賴。故有x(1)=x(0)∪a=cga=acg。

計算x(2):掃瞄f3中的各個函式依賴,找到左部為acg或acg子集的函式依賴,因為找不到這樣的函式依賴。故有x(2)=x(1),演算法終止。(cg)f3+=acg。

(cg)f3+=acg不包含d,故cg→d不是冗餘的函式依賴,不能從f3中去掉。

d.設ce→a為冗餘的函式依賴,則去掉ce→a,得:f4=

計算(cg)f4+:設x(0)=ce

計算x(1):掃瞄f4中的各個函式依賴,找到左部為ce或ce子集的函式依賴,得到乙個c→a函式依賴。故有x(1)=x(0)∪a=cea=ace。

計算x(2):掃瞄f4中的各個函式依賴,找到左部為ace或ace子集的函式依賴,得到乙個ce→g函式依賴。故有x(2)=x(1)∪g=aceg。

計算x(3):掃瞄f4中的各個函式依賴,找到左部為aceg或aceg子集的函式依賴,得到乙個cg→d函式依賴。故有x(3)=x(2)∪d=acdeg。

計算x(4):掃瞄f4中的各個函式依賴,找到左部為acdeg或acdeg子集的函式依賴,得到乙個acd→b函式依賴。故有x(4)=x(3)∪b=abcdeg。因為x(4)=u,演算法終止。

(ce)f4+=abcdeg包含a,故ce→a是冗餘的函式依賴,從f4中去掉。

③ 去掉f4中各函式依賴左邊多餘的屬性(只檢查左部不是單個屬性的函式依賴)由於c→a,函式依賴acd→b中的屬性a是多餘的,去掉a得cd→b。

故最小函式依賴集為:f=

解2:利用armstrong公理系統的推理規則求解

① 假設cg→b為冗餘的函式依賴,那麼,從f中去掉它後能根據armstrong公理系統的推理規則匯出。

因為cg→d (已知)

所以cga→ad,cga→acd (增廣律)

因為acd→b (已知)

所以cga→b (傳遞律)

因為c→a (已知)

所以cg→b (偽傳遞律)

故cg→b是冗餘的。

② 同理可證:ce→a是多餘的。

③ 又因c→a,可知函式依賴acd→b中的屬性a是多餘的,去掉a得cd→b。

故最小函式依賴集為:f=

//求最小覆蓋fm 

//輸入:屬性全集u,u上的函式依賴集f

//輸出:函式依賴集f的最小覆蓋fm

#include #include using namespace std;

struct functiondependence//函式依賴

;void init (functiondependence fd,int n)

cout<<"函式依賴集合";

cout<<"f=

return ss;

} bool isin(string f,string zz)//能夠判斷f中決定因素f裡所有的因素是否在x中,但這樣可能導致結果出現重複

} /*if(ra(dyna3[i],dyna3[j])==true)

*/dyna4[count2].x=dyna3[i].x;

dyna4[count2].y=dyna3[i].y;

count2++;

}//求得最小覆蓋

cout<"<"<>n;

functiondependence fd[n];

fmin(fd,n);

return 0;

}

誰能告訴我,怎麼突然不能上傳了?

規範化理論 如何計算最小依賴集?

如果函式依賴集f滿足一下條件,則稱f為乙個最小函式依賴集。1 f中任意一函式的右部僅含有乙個屬性。2 f中不存在這樣的函式依賴x a,使得f與f 等價,即f中的函式依賴均不能由f中其他函式依賴匯出。3 f中不存在這樣的函式依賴x a,x有真子集z使得f 演算法步驟 1 將f中的所有函式依賴的右邊化為...

求最小函式依賴集

用分解的法則,使f中的任何乙個函式依賴的右部僅含有乙個屬性 去掉多餘的函式依賴 從第乙個函式依賴x y開始將其從f中去掉,然後在剩下的函式依賴中求x的閉包x y1 閉包就是由乙個屬性直接或間接推導出的所有屬性的集合,例如 f 由a可直接得到b和d,間接得到c,則a的閉包就是 看x 是否包含y,若是,...

關聯式資料庫規範化之函式依賴和正規化

設r u 是乙個屬性集上的關係模式,x,y是u的子集。函式依賴 如果x y,則稱y函式依賴於x。平凡函式依賴 如果x y,且y是x的子集。非平凡函式依賴 如果x 且y不是x的子集。完全函式依賴 如果x y,且x的任何乙個真子集都不能推出y,則y完全函式依賴於x。部分函式依賴 如果x y,且x的至少存...