假设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