關係數據庫理論之最小函數依賴集

前言

在本文中,會介紹爲什麼要引入最小函數依賴集,最小函數依賴集是什麼,以及如何求最小函數依賴集。

爲什麼需要最小函數依賴集

在關係數據模型中,一個關係通常由R(U,F)構成,U爲屬性的全集,F爲函數依賴集。在實際生活中,我們可以根據語義來定義關係中屬性的依賴關係,例如學號可以唯一確定一位學生的姓名、性別等等。但是,有時候給出的函數依賴集並不是最簡的,這有時會拖累我們對關係的後續處理,例如關係的分解、判斷是否爲無損分解等。所以,我們在必要時,需要對函數依賴集進行化簡,這就是需要最小函數依賴集的原因。
在正式介紹最小函數依賴集之前,還需要了解一個概念,那就是閉包。準確的說是屬性集X關於函數依賴集F的閉包

閉包

閉包分爲兩種,一種是函數依賴集F的閉包,另外一種是屬性集X關於函數依賴集F的閉包。前者不做討論,重點說說後者。先來看定義

F爲屬性集U上的一組函數依賴集,XY \inUXF+X_F^+= {A|X\rightarrowA能由F根據Armstrong公理導出},XF+X_F^+稱爲**屬性集X關於函數依賴集F的閉包。

說白了,就是給定屬性集X,根據現有的函數依賴集,看其能推出什麼屬性。
這裏的Armstrong公理系統不用深究,想具體瞭解的可以點擊查看百度百科。
舉例:

已知關係模式R<U,F>,其中:
U = {A,B,C,D,E},
F = {AB \rightarrow C,B\rightarrowD,C\rightarrowE,EC\rightarrowB,AC\rightarrowB}
(AB)F+(AB)_F^+

解:

從AB出發,此時我們的集合裏已經包含了{A,B}。
我們從現有的函數依賴集中可知,
AB可以推出C,於是C加入集合,
B可以推出D,於是D加入集合,
C可以推出E,於是E加入集合,
EC可以推出B,因爲C、E、B都在集合中,於是不加入,
AC可以推出B,因爲A、B、C都在集合中,於是不加入
至此,可求得(AB)F+(AB)_F^+ ={A、B、C、D、E}。

最小函數依賴集

定義

如果函數依賴集F滿足下列條件,則稱F爲一個極小函數依賴集,亦稱爲最小依賴集最小覆蓋
(1)、F中任一函數依賴右部僅含有一個屬性。
(2)、F中不存在這樣的函數依賴 X\rightarrowA,使得FF-{X\rightarrowA} 等價。
(3)、F中不存在這樣的函數依賴X\rightarrowAX有真子集Z使得F-{X\rightarrowA}\bigcup{Z\rightarrowA}F等價。

解釋

以上定義翻譯成大白話就是,一個函數依賴集F要想稱爲最小函數依賴集,要滿足以下三點:
1、F中任一函數依賴的右邊只有一個屬性。
2、F中不存在這樣的函數依賴:從現有的函數依賴集中刪除一個函數依賴X\rightarrowA,刪除後所得的函數依賴集與原來的函數依賴集等價,這樣的函數依賴是不允許存在的。
3、F中不存在這樣的函數依賴:假設函數依賴集中存在AB\rightarrowY,現對該依賴的左部進行化簡,即刪除A,得B\rightarrowY;或刪除B,得A\rightarrowY,若經過化簡後的函數依賴集與沒有化簡前的函數依賴集等價,那麼這樣的函數依賴是不允許存在的。

算法

1、首先,先利用函數依賴的分解性,將函數依賴集中右部不爲單個屬性的分解爲單屬性。

2、對於經過第1步篩選後的函數依賴集F中的每一個函數依賴X\rightarrowA,進行以下操作:

  • 2.1、將X\rightarrowA從函數依賴中剔除
  • 2.2、基於剔除後的函數依賴,計算屬性X的閉包,看其是否包含了A,若是,則該函數依賴是多餘的(這裏體現出前面說的等價,因爲如果基於化簡後的函數依賴依賴,計算X的閉包依然包含A,則說明A可以由其他依賴推出,X\rightarrowA不是必須的),可以刪除,否則不能刪除

3、對於經過第2步篩選後的函數依賴集F中每個左部不爲單個屬性的函數依賴AB\rightarrowY,進行以下操作:
我們約定,經過第二步篩選後的函數依賴集記爲F1,經過第三步處理後的函數依賴集爲F2。

  • 3.1、去除A,得B\rightarrowY,得F2,基於F1和F2計算屬性B的閉包,如果二者相等,則說明它們是等價的,A可以去除;如果不相等,則A不能去除。
  • 3.2、去除B,得A\rightarrowY,得F2,基於F1和F2計算屬性A的閉包,如果二者相等則說明它們是等價的,B可以去除;如果不相等,則B不能去除。

知識鏈接:函數依賴的分解性
若X\rightarrowYZ,則X\rightarrowY 且 X\rightarrowZ。

舉例

關係模式R(U,F)中,U={A,B,C,D,E,G},F={B\rightarrowD,DG\rightarrowC,BD\rightarrowE,AG\rightarrowB,ADG\rightarrowBC};求F的最小函數依賴集。

解:
1、首先根據函數依賴的分解性,對F進行第一次篩選,需要變動的有:
ADG\rightarrowBC拆解成ADG\rightarrowB、ADG\rightarrowC
得新函數依賴集:
F = {B\rightarrowD,DG\rightarrowC,BD\rightarrowE,AG\rightarrowB,ADG\rightarrowB,ADG\rightarrowC}

2、篩選多餘的函數依賴

  • 2.1:去除B\rightarrowD,得F = {DG\rightarrowC,BD\rightarrowE,AG\rightarrowB,ADG\rightarrowB,ADG\rightarrowC},BF+B_F^+ = {B},不包含D,故B\rightarrowD不刪除。
  • 2.2:去除DG\rightarrowC,得F = {B\rightarrowD、BD\rightarrowE,AG\rightarrowB,ADG\rightarrowB,ADG\rightarrowC},(DG)F+(DG)_F^+={D,G},不包含C,故DG\rightarrowC不刪除。
  • 2.3:去除BD\rightarrowE,得F = {B\rightarrowD,DG\rightarrowC,AG\rightarrowB,ADG\rightarrowB,ADG\rightarrowC},(BD)F+(BD)_F^+ = {B,D},不包含E,故BD\rightarrowE不刪除。
  • 2.4:去除AG\rightarrowB,得F = {B\rightarrowD,DG\rightarrowC,BD\rightarrowE,ADG\rightarrowB,ADG\rightarrowC},(AG)F+(AG)_F^+ = {A,G},不包含B,故AG\rightarrowB不刪除。
  • 2.5:去除ADG\rightarrowB,得F = {B\rightarrowD,DG\rightarrowC,BD\rightarrowE,AG\rightarrowB,ADG\rightarrowC},(ADG)F+(ADG)_F^+ = {A,D,G,C,B,D},包含B,故ADG\rightarrowB去除
  • 2.6:去除ADG\rightarrowC,得F = {B\rightarrowD,DG\rightarrowC,BD\rightarrowE,AG\rightarrowB,ADG\rightarrowB},(ADG)F+(ADG)_F^+ = {A,D,G,C,B,D},包含C,故ADG\rightarrowC去除
    經過第二部篩選後,函數依賴集F變爲{B\rightarrowD,DG\rightarrowC,BD\rightarrowE,AG\rightarrowB}。

3、化簡函數依賴左側不爲單個屬性的函數依賴

  • 3.1:先看DG\rightarrowC
    • 3.1.1:去除D,得G\rightarrowC,得函數依賴集F1 = {B\rightarrowD,G\rightarrowC,BD\rightarrowE,AG\rightarrowB}。
      基於F1,可求得GF+G_F^+ = {G,C}。
      基於F(第二步求出的,下同),可求得GF+G_F^+ = {G}
      可見二者並不相同,所以D不去除。
    • 3.1.2:去除G,得D\rightarrowC,得函數依賴集F1 = {B\rightarrowD,D\rightarrowC,BD\rightarrowE,AG\rightarrowB}
      基於F1,可求得DF+D_F^+ = {D,C}
      基於F,可求得DF+D_F^+ ={D}
      可見二者並不相同,所以G不去除。

綜上,DG\rightarrowC,已是最簡。

  • 3.2:再看BD\rightarrowE
    • 3.2.1:去除B,得D\rightarrowE,得函數依賴集F1 = {B\rightarrowD,DG\rightarrowC,D\rightarrowE,AG\rightarrowB}
      基於F1,可求得DF+D_F^+ = {D,E}
      基於F,可求得DF+D_F^+ = {D}
      可見二者並不相同,所以B不去除。
    • 3.2.2:去除D,得B\rightarrowE,得函數依賴集F1 = {B\rightarrowD,DG\rightarrowC,B\rightarrowE,AG\rightarrowB}
      基於F1,可求得BF+B_F^+ = {B,E,D}
      基於F,可求得BF+B_F^+ = {B,D,E}
      可見二者相同,所以D可以去除

綜上,BD\rightarrowE,可化簡爲B\rightarrowE。

  • 3.3:最後看AG\rightarrowB
    • 3.3.1:去除A,得G\rightarrowB,得函數依賴集F1 = {B\rightarrowD,DG\rightarrowC,B\rightarrowE,G\rightarrowB}
      基於F1,可求得GF+G_F^+ = {G,B}
      基於F,可求得 GF+G_F^+ = {G}
      可見二者並不相同,所以A不可去除。
    • 3.3.2:去除G,得A\rightarrowB,得函數依賴F1 = {B\rightarrowD,DG\rightarrowC,B\rightarrowE,A\rightarrowB}
      基於F1,可求得AF+A_F^+ = {A,B}
      基於F,可求得AF+A_F^+ = {A}
      可見二者並不相同,所以G不可去除。

綜上,AG\rightarrowB,已是最簡。
綜上,R的最小函數依賴集爲F = {B\rightarrowD,DG\rightarrowC,B\rightarrowE,AG\rightarrowB}

寫在最後

這個問題是我在考研複試的時候複習過程中遇到的,主要的糾結點在於第三步的判斷上,查資料的時候發現網上很多都沒有寫清,最後還是在度孃的文庫裏找到了比較清楚的解釋,在此做一下思路的整理。
本文定義以及例子參考自:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章