定義:如果函數依賴集f滿足下列條件,則稱f為最小函數依賴集或最小覆蓋。
① f中的任何一個函數依賴的右部僅含有一個屬性;
② f中不存在這樣一個函數依賴x→a,使得f與f-{x→a}等價;
③ f中不存在這樣一個函數依賴x→a,x有真子集z使得f-{x→a}∪{z→a}與f等價。
或者表述為:
最小依賴集:如果函數集合F滿足以下三個條件:
①F中每個函數依賴的右部都是單屬性;
②F中的任一函數依賴X→A,其F-{X→A}與F是不等價的;
③F中的任一函數依賴X→A,Z為X的子集。(F-{X→A}∪{Z→A}與F不等價。則稱F為最小函數依賴集合,記為Fmin。
演算法:計算最小函數依賴集。
輸入 一個函數依賴集
輸出 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>,u={a,b,c,d,e,g},f={ab→c,d→eg,c→a,be→c,bc→d,cg→bd,acd→b,ce→ag},求f的最小函數依賴集。
解1:利用演算法求解,使得其滿足三個條件
① 利用分解規則,將所有的函數依賴變成右邊都是單個屬性的函數依賴,得f為:f={ab→c,d→e,d→g,c→a,be→c,bc→d,cg→b,cg→d,acd→b,ce→a,ce→g}
② 去掉f中多餘的函數依賴
a.設ab→c為冗餘的函數依賴,則去掉ab→c,得:f1={d→e,d→g,c→a,be→c,bc→d,cg→b,cg→d,acd→b,ce→a,ce→g}
計算(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={ab→c,d→e,d→g,c→a,be→c,bc→d,cg→d,acd→b,ce→a,ce→g}
計算(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={ab→c,d→e,d→g,c→a,be→c,bc→d,acd→b,ce→a,ce→g}
計算(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={ab→c,d→e,d→g,c→a,be→c,bc→d,cg→d,acd→b,ce→g}
計算(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={ab→c,d→e,d→g,c→a,be→c,bc→d,cg→d,cd→b,ce→g}