數據庫學習筆記_11_canonical cover


   canonical cover:即函數依賴的最小覆蓋,假設我們要在一個數據庫里加上一條數據,那么我們得確定它不違背任意一條函數依賴,但是如果在函數依賴很多的情況下,那么這個檢查就非常的costly.為了簡化,我們得把目前的函數依賴變成一個簡化的函數依賴,使得它滿足其簡化前和簡化后的閉包相等,但是由於函數依賴的個數減少,檢查就變得容易。

  定義extraneous attribute為外來屬性,即在對應函數依賴中“不必要的屬性”

1.A是屬性集LA(a)的外來屬性,如果A為LA(a)的子集,且F和(F-{LA(a)->LA(b)})並{(LA(a)-A)->LA(b)}的閉包相同

2.A是屬性集LA(b)的外來屬性,如果A為LA(b)的子集,且F和(F-{LA(a)->LA(b)})並{LA(a)->(LA(b)-A)}的閉包相同

  就算法來說,是:

  set Fc=F

  while(Fc change)

  {

    for any pair of fa(LA(a)->LA(b)),fb(LA(c)->LA(d))

      if(a==c) delete fa,fb,and add fc(LA(a)->LA(bd))

    for every fa in Fc test if it contains a extraneous attribute under Fc

      if it has then delete it.

  }

然后是extraneous attribute的判定

  如果A在LA(b)中,那么A為LA(b)的EA,if(這里的F指代的是檢驗時輸入的函數依賴集)

    設F’=(F-LA(a)->LA(b))並{LA(a)->(LA(b)-A)}

    則在F’中求得LA(a)+ ,若A在LA(a+)中,說明A時多余的

  (拓展:其實講道理,要求的化只需要求單個屬性是否為EA就好了,因為若存在大於一個的屬性集為EA時,其單個屬性必定為EA,但是其加上其他屬性卻不一定為EA,故單個查找算是容易控制規模的方法)

  若A在LA(a)中,那么那么A為LA(a)的EA, if:

    設LA(y)為LA(a)-A,求得LA(y)+   查看LA(y)+ 是否包含LA(b),若包含,則A為多余屬性


免責聲明!

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



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