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為多余屬性