數據庫系統概述----最小函數依賴集求解過程


最小函數依賴集的求解

 一、定義

  最小函數依賴集也稱為極小函數依賴集最小覆蓋;如果函數依賴集 滿足下列條件,則稱 為一個最小依賴集。

  1. 中任意函數依賴的右部僅含有一個屬性
  2. 中不存在這樣的函數依賴X→A,使得 與 - {X→A}等價,即 中的函數依賴均不能由 中其他函數依賴導出
  3. 中不存在這樣的函數依賴X→A,X有真子集 使得 - {X→A} ∪ {Z→A}與 等價,即 中各函數依賴左部均為最小屬性集(不存在冗余屬性)

 二、算法步驟:

  • 將 中的所有函數依賴的右邊化為單一屬性
  • 去掉 F 中的所有函數依賴左邊的冗余屬性(只針對F中左部不是單一屬性的函數依賴)
  • 去掉 F 中的所有冗余的函數依賴

三、例子說明

假設R<U , F> ,U = ABCD,函數依賴集F={A→BD,AB→C,C→D},求:最小函數依賴集

第一步:將F中的所有函數依賴的右邊化為單一屬性:

  因為= {A→BD,AB→C,C→D},函數依賴右邊化為單一屬性得:= {A→B,A→D,AB→C,C→D}

第二步:去掉F中的所有函數依賴左邊的冗余屬性(只針對F中左部不是單一屬性的函數依賴)

   F={A→B,A→D,AB→C,C→D}中只有函數依賴AB→C左部不是單一屬性,所以要對其進行去掉左邊冗余屬性的處理

  1. 先看A是不是冗余屬性因為BF+ ={ B }不包含A,所以A屬性不冗余         //這里應該注意的是,要看哪一個屬性是否是冗余屬性,則求該函數依賴左部除要查看的屬性外的其他屬性的集關於 的閉包是否包含要查看屬性
  2. 再看B是不是冗余屬性:因為AF+ ={A,B,C,D} 包含的B,所以B屬性冗余

   因此只將函數依賴AB→C左部B屬性去掉,所以F={A→B,A→D,A→C,C→D}

第三步:去掉 F 中的所有冗余的函數依賴

依據引理:設F為屬性集U上的一組函數依賴,XY ⊆ U,X→Y 能由根據Armstrong公理導出的充分必要條件是Y⊆ XF+ 。即判斷 中一個函數依賴X→Y是否冗余,則只需要判定 是否為的XF+ 子集。

 因為有F={A→B,A→D,A→C,C→D}:

  1. 先看判斷函數依賴A→D是否冗余,則把函數依賴A→DF={A→B,A→D,A→C,C→D}中去掉后得F={A→B,A→C,C→D},求得AF+ = { A,B,C,D} 包含了D,所以為函數依賴A→D冗余,所以應該從F={A→B,A→D,A→C,C→D}中去掉函數依賴A→D,得F={A→B,A→C,C→D}
  2. 再從F={A→B,A→C,C→D}依次判斷每一個函數依賴是否冗余,直至所有冗余的函數依賴都被消除。本例子中經過第1步后已消除 中的所有冗余函數依賴了,因此原F={A→BD,AB→C,C→D}的最小函數依賴集為 ={A→B,A→C,C→D}

 注意點:

  1. F的最小依賴集F m 不一定是唯一的,它與對個函數依賴FDi 及X→A中個屬性的處置的順序有關。在本例子中在去掉F中的冗余的函數依賴時(綠色字體那一步)若不是首先判斷A→D是否冗余,而是首先判斷其它函數依賴是否冗余,那么所得的最小函數依賴就可能不同了
  2. 要搞清楚在判斷一個函數依賴X→A是否為冗余時,是求X關於上一步所求得的新的函數依賴集 的閉包XF+ ,然后在判斷A是否包含在該XF+ 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM