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

posted @ 2017-05-15 10:38  duskcloudxu  阅读(4516)  评论(0编辑  收藏  举报