发新话题
打印

MySQL——最小函数依赖集知多少

MySQL——最小函数依赖集知多少

假设S 1和S 2是两个函数依赖集,如果所有为S 1所蕴涵的函数依赖都为S 2所蕴涵,—即S 1+是S 2+的子集,则S 2是S 1的覆盖,D B M S只要实现了S 2中的函数依赖,就自动实现S 1中的函数依赖。

如果S 2是S 1的覆盖,同时S 1是S 2的覆盖—则S 1和S 2等价,即S 1+=S 2+。很显然,如果S 1和S 2等价,则D B M S只要实现S 1中的函数依赖,就自动实现S 2中的函数依赖,反之亦然。

当且仅当函数依赖集满足以下条件时,该函数依赖集为最小函数依赖集:

1) 每个函数依赖的右边(应变量)只含有一个属性(即它是单元素集合)。

2) 每个函数依赖的左边(自变量)是不可约的—删除自变量的任何一个属性都将改变

闭包S+(即会使S转变为一个不等价于原来的S的集合)。这种函数依赖被称为左部不可

约的函数依赖。

3) 删除S中任何一个函数依赖都将改变它的闭包S+,即使S转变为一个不等价于原来的S的集合。

关于第2点和第3点,在这里要指出的是,为了知道如果删除某些元素是否会改变闭包,

不必要清楚地知道闭包的内容。例如:观察大家熟悉的零件关系变量P,有下列函数依赖:

P #→P N A M E

P #→C O L O R

P #→W E I G H T

P #→C I T Y

显而易见,该函数依赖集是最小依赖集:每个函数依赖中右边只含有一个属性,同样,

左边也是不可约的,且任何一个函数依赖都不能被删除而不改变闭包(即不丢失信息)。相反,下面的函数依赖集不是最小依赖集。

1 ) P #→{ P N A M E,COLOR} :第一个函数依赖的右边不是单属性集

P #→W E I G H T

P #→C I T Y

2 ) { P #,P N A M E }→COLOR :第一个函数依赖左边的P N A M E可以删

P #→PNAME 除 而 不改变闭包(即左边是可约的)

P #→W E I G H T

P #→C I T Y

3 ) P #→P# : 第 一个函数可以删除而不改变闭包

P #→P N A M E

P #→C O L O R

P #→W E I G H T

P #→C I T Y

任何一个函数依赖集至少存在一个最小函数依赖集。假设函数依赖集为S,根据分解规则,

可以假定每个函数依赖的右边是单属性的而不会失去它的一般性(如果右边不是单属性的,则可以利用分解规则把它分解成单属性),接着考察每个函数依赖f左边的每一个属性A,如果把A从f的左边删除而并不改变闭包,则把A从f的左边删除,然后考察S中剩余的每一个函数依赖f,如果把f删除而不改变闭包,则把f从S中删除,最后所得的集合S是和原来的函数依赖集S等价的最小函数依赖集。

例:假设给定关系变量R、A、B、C、D是R的属性集,R满足函数依赖:

A→B C

B→C

A→B

A B→C

A C→D

现在计算该函数依赖的最小函数依赖集。

1) 把所有的函数依赖写成右边是单属性的函数依赖:

A→B

A→C

B→C

A→B

A B→C

A C→D

很显然,函数依赖A→B出现了两次,可以删除其中的一次。

2) 可以把C从函数依赖A C→D的左边删除,因为A→C,根据增广律可以得出A→A C,给

定A C→D,根据传递律可以得出A→D。所以C在函数依赖A C→D的左边是冗余的。

3) 接着发现可以删除函数依赖A B→C,因为A→C,根据增广律可得A B→C B,又根据分

解规则可以导出A B→C。

4) 函数依赖A→C由函数依赖A→B和B→C蕴涵,所以它可以删除。最后剩下下列函数依

赖:

A→B

B→C

A→D

该集合是不可约。

一个函数依赖集I是不可约的,且等价于某个函数依赖集S,则说I是S的最小等价依赖集。

这样,如果要实现一个函数依赖集S,系统只要实现它的一个最小依赖集就足够了(重复一次:要计算最小依赖集I不必计算闭包S+)。应该清楚的是给定函数依赖集的最小依赖集并不一定是唯一的。

转载请注明出处:  程序员之家  http://www.phome.asia

TOP

发新话题