打赏

数据库中函数依赖

  • 属性集合的闭包

假设{A1,A2,...,An}是属性集合,S是FD的集合。则S集合下的属性集合{A1,A2,...,An}的闭包是满足下面条件的属性集合B,即使得每一个满足S中所有FD的关系,也同样满足A1 A2 ... An->B。也就是说A1 A2 .... An->B能由S中的FD推断出来。属性集合{A1,A2,...,An}的闭包记为{A1,A2,...,An}+。

计算闭包的过程:从一个给定的属性集合出发,重复地扩展这个集合,只要某个FD左边的属性全部包含在这个集合中,就把此FD右边的属性也包含进去。反复使用这个方法,直到不再产生新的属性为止。最后的结果集合就是给定属性集合的闭包。

简单来说,闭包就是由一个属性集合出发,直接或间接的得到别的属性并加入到闭包中,重复地扩展这个集合,例如:f={a->b,b->c,a->d,e->f};那么可以得出b、d依赖于a,c依赖于b,从而有a可以决定b、c、d,所以a的闭包就是{a,b,c,d}。

属性集合的闭包算法:

输入:属性集合{A1,A2,...,An},FD的集合S。

输出:闭包{A1,A2,...,An}+

方法

1.如果必要,分解S中的FD,使每个FD的右边只有一个属性。

2.设X是属性集合,也就是闭包。首先将X初始化{A1,A2,...,An}。

3.反复寻找这样的FD:B1 B2,,,Bm->C,使得B1 B2 ... Bm在X中,而C不在X中;若找到则把C加入X,并重复这个过程。因为集合X只能增长,而任何一个关系模式中的属性都是有限的,所以最终没有任何元素能再加入X时,本步骤结束。

4.当不能再添加任何属性时,集合X就是{A1,A2,...,An}+。

  • 函数依赖集的投影

假设有一个含有FD集合S的关系R通过计算R1L(R)得到L对其部分属性的投影。那么R1中有那些FD成立?

解决这个问题,可以通过计算函数依赖集S的投影获得。S的投影是所有满足一下吗条件的FD集合:

a)从S推断而来。b)只包含R1的属性。

由于可能存在大量的FD,而且其中有很多可能是冗余的(即其中一些FD由另一些FD推出),因此可以对它们进行简化。

函数依赖投影算法如下:

输入:关系R和通过投影R1L(R)计算得到的关系R1,以及在R中成立的FD的集合S。

输出:在R1中成立的FD集合。

方法

1.令T为最终输出的FD集合,初始化T为空集。

2.对R1的属性集合的每一个子集X,计算X+。该计算依据FD集合S,可能会涉及一些在R模式中却不在R1模式中的属性。对于所有在X+中且属于R1的属性A,将所有非平凡的FD X->A添加到T中。

3.现在,T是在R1中成立的FD基本集,但可能不是最小化基本集。通过如下方法对T进行修改来构造最小化基本集。

a)如果T中的某个FD F能从T中其它FD推断出来,则从T中删除F。

b)设Y->B是T中的一个FD,Y至少有两个属性,从Y中删除一个属性并记为Z。如果Z->B能够从T中的FD(包含Y->B)推断,则使用z->B替换Y->B。

c)以各种可能的方式重复上面两个步骤,直到T不再发生变化。

通俗理解:首先计算属性集的闭包,例如{A}+为{A,B,C},如果关系R的投影R1为{A,B},则需要包含A->B,而不包含A->C。(如果存在某个属性集能够包含所有属性,那么可以不求此属性集的闭包)。类似的接着计算其余所有属性的闭包。再求最小化基本集:如果投影后某个函数依赖能够通过投影后的其他函数依赖推出,则删除;(例如:{A->C,A->B,B->C},删除A->C,因为此函数依赖能够通过其他函数依赖推导)。如果某个函数依赖A->B,删除A中某个属性后仍然在投影的函数依赖中成立,则删除。(投影后的函数依赖为{AC->B,A->B},则把{AC->B}删除,因为如果删除C即A->B 能够从投影的函数依赖中推出)。

posted @ 2022-02-13 11:41  不像话  阅读(549)  评论(0编辑  收藏  举报