前言
在本文中,會介紹爲什麼要引入最小函數依賴集,最小函數依賴集是什麼,以及如何求最小函數依賴集。
爲什麼需要最小函數依賴集
在關係數據模型中,一個關係通常由R(U,F)構成,U爲屬性的全集,F爲函數依賴集。在實際生活中,我們可以根據語義來定義關係中屬性的依賴關係,例如學號可以唯一確定一位學生的姓名、性別等等。但是,有時候給出的函數依賴集並不是最簡的,這有時會拖累我們對關係的後續處理,例如關係的分解、判斷是否爲無損分解等。所以,我們在必要時,需要對函數依賴集進行化簡,這就是需要最小函數依賴集的原因。
在正式介紹最小函數依賴集之前,還需要了解一個概念,那就是閉包。準確的說是屬性集X關於函數依賴集F的閉包。
閉包
閉包分爲兩種,一種是函數依賴集F的閉包,另外一種是屬性集X關於函數依賴集F的閉包。前者不做討論,重點說說後者。先來看定義
設F爲屬性集U上的一組函數依賴集,X、Y U,= {A|XA能由F根據Armstrong公理導出},稱爲**屬性集X關於函數依賴集F的閉包。
說白了,就是給定屬性集X,根據現有的函數依賴集,看其能推出什麼屬性。
這裏的Armstrong公理系統不用深究,想具體瞭解的可以點擊查看百度百科。
舉例:
已知關係模式R<U,F>,其中:
U = {A,B,C,D,E},
F = {AB C,BD,CE,ECB,ACB}
求。
解:
從AB出發,此時我們的集合裏已經包含了{A,B}。
我們從現有的函數依賴集中可知,
AB可以推出C,於是C加入集合,
B可以推出D,於是D加入集合,
C可以推出E,於是E加入集合,
EC可以推出B,因爲C、E、B都在集合中,於是不加入,
AC可以推出B,因爲A、B、C都在集合中,於是不加入
至此,可求得 ={A、B、C、D、E}。
最小函數依賴集
定義
如果函數依賴集F滿足下列條件,則稱F爲一個極小函數依賴集,亦稱爲最小依賴集或最小覆蓋。
(1)、F中任一函數依賴右部僅含有一個屬性。
(2)、F中不存在這樣的函數依賴 XA,使得F與F-{XA} 等價。
(3)、F中不存在這樣的函數依賴XA,X有真子集Z使得F-{XA}{ZA} 與F等價。
解釋
以上定義翻譯成大白話就是,一個函數依賴集F要想稱爲最小函數依賴集,要滿足以下三點:
1、F中任一函數依賴的右邊只有一個屬性。
2、F中不存在這樣的函數依賴:從現有的函數依賴集中刪除一個函數依賴XA,刪除後所得的函數依賴集與原來的函數依賴集等價,這樣的函數依賴是不允許存在的。
3、F中不存在這樣的函數依賴:假設函數依賴集中存在ABY,現對該依賴的左部進行化簡,即刪除A,得BY;或刪除B,得AY,若經過化簡後的函數依賴集與沒有化簡前的函數依賴集等價,那麼這樣的函數依賴是不允許存在的。
算法
1、首先,先利用函數依賴的分解性,將函數依賴集中右部不爲單個屬性的分解爲單屬性。
2、對於經過第1步篩選後的函數依賴集F中的每一個函數依賴XA,進行以下操作:
- 2.1、將XA從函數依賴中剔除
- 2.2、基於剔除後的函數依賴,計算屬性X的閉包,看其是否包含了A,若是,則該函數依賴是多餘的(這裏體現出前面說的等價,因爲如果基於化簡後的函數依賴依賴,計算X的閉包依然包含A,則說明A可以由其他依賴推出,XA不是必須的),可以刪除,否則不能刪除
3、對於經過第2步篩選後的函數依賴集F中每個左部不爲單個屬性的函數依賴ABY,進行以下操作:
我們約定,經過第二步篩選後的函數依賴集記爲F1,經過第三步處理後的函數依賴集爲F2。
- 3.1、去除A,得BY,得F2,基於F1和F2計算屬性B的閉包,如果二者相等,則說明它們是等價的,A可以去除;如果不相等,則A不能去除。
- 3.2、去除B,得AY,得F2,基於F1和F2計算屬性A的閉包,如果二者相等則說明它們是等價的,B可以去除;如果不相等,則B不能去除。
知識鏈接:函數依賴的分解性
若XYZ,則XY 且 XZ。
舉例
關係模式R(U,F)中,U={A,B,C,D,E,G},F={BD,DGC,BDE,AGB,ADGBC};求F的最小函數依賴集。
解:
1、首先根據函數依賴的分解性,對F進行第一次篩選,需要變動的有:
ADGBC拆解成ADGB、ADGC
得新函數依賴集:
F = {BD,DGC,BDE,AGB,ADGB,ADGC}
2、篩選多餘的函數依賴
- 2.1:去除BD,得F = {DGC,BDE,AGB,ADGB,ADGC}, = {B},不包含D,故BD不刪除。
- 2.2:去除DGC,得F = {BD、BDE,AGB,ADGB,ADGC},={D,G},不包含C,故DGC不刪除。
- 2.3:去除BDE,得F = {BD,DGC,AGB,ADGB,ADGC}, = {B,D},不包含E,故BDE不刪除。
- 2.4:去除AGB,得F = {BD,DGC,BDE,ADGB,ADGC}, = {A,G},不包含B,故AGB不刪除。
- 2.5:去除ADGB,得F = {BD,DGC,BDE,AGB,ADGC}, = {A,D,G,C,B,D},包含B,故ADGB去除。
- 2.6:去除ADGC,得F = {BD,DGC,BDE,AGB,ADGB}, = {A,D,G,C,B,D},包含C,故ADGC去除。
經過第二部篩選後,函數依賴集F變爲{BD,DGC,BDE,AGB}。
3、化簡函數依賴左側不爲單個屬性的函數依賴
- 3.1:先看DGC
- 3.1.1:去除D,得GC,得函數依賴集F1 = {BD,GC,BDE,AGB}。
基於F1,可求得 = {G,C}。
基於F(第二步求出的,下同),可求得 = {G}
可見二者並不相同,所以D不去除。 - 3.1.2:去除G,得DC,得函數依賴集F1 = {BD,DC,BDE,AGB}
基於F1,可求得 = {D,C}
基於F,可求得 ={D}
可見二者並不相同,所以G不去除。
- 3.1.1:去除D,得GC,得函數依賴集F1 = {BD,GC,BDE,AGB}。
綜上,DGC,已是最簡。
- 3.2:再看BDE
- 3.2.1:去除B,得DE,得函數依賴集F1 = {BD,DGC,DE,AGB}
基於F1,可求得 = {D,E}
基於F,可求得 = {D}
可見二者並不相同,所以B不去除。 - 3.2.2:去除D,得BE,得函數依賴集F1 = {BD,DGC,BE,AGB}
基於F1,可求得 = {B,E,D}
基於F,可求得 = {B,D,E}
可見二者相同,所以D可以去除。
- 3.2.1:去除B,得DE,得函數依賴集F1 = {BD,DGC,DE,AGB}
綜上,BDE,可化簡爲BE。
- 3.3:最後看AGB
- 3.3.1:去除A,得GB,得函數依賴集F1 = {BD,DGC,BE,GB}
基於F1,可求得 = {G,B}
基於F,可求得 = {G}
可見二者並不相同,所以A不可去除。 - 3.3.2:去除G,得AB,得函數依賴F1 = {BD,DGC,BE,AB}
基於F1,可求得 = {A,B}
基於F,可求得 = {A}
可見二者並不相同,所以G不可去除。
- 3.3.1:去除A,得GB,得函數依賴集F1 = {BD,DGC,BE,GB}
綜上,AGB,已是最簡。
綜上,R的最小函數依賴集爲F = {BD,DGC,BE,AGB}
寫在最後
這個問題是我在考研複試的時候複習過程中遇到的,主要的糾結點在於第三步的判斷上,查資料的時候發現網上很多都沒有寫清,最後還是在度孃的文庫裏找到了比較清楚的解釋,在此做一下思路的整理。
本文定義以及例子參考自:
- 《數據庫系統概論(第五版)》 王珊 薩師煊 編著 清華大學出版社
- CSDN 博文 數據庫建模和設計(2):函數依賴、閉包、最小函數依賴集、範式、模式分解