数据库学习笔记_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为多余属性