关系数据库原理之求闭包

闭包就是由一个属性直接或间接推导出的所有属性的集合,例如: f={a->b,b->c,a->d,e->f} 由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d}
 
以下是写的比较科学规范的顶一记求解方法
设X和Y均为关系R的属性集的子集,F是R上的函数依赖集,若对R的任一属性集B,一旦X→B,必有BY,且对R的任一满足以上条件的属性集Y1 ,必有YY1,此时称Y为属性集X在函数依赖集F下的闭包,记作X+。
计算关系R的属性集X的闭包的步骤如下:
 第一步:设最终将成为闭包的属性集是Y,把Y初始化为X;
第二步:检查F中的每一个函数依赖A→B,如果属性集A中所有属性均在Y中,而B中有的属性不在Y中,则将其加入到Y中;
第三步:重复第二步,直到没有属性可以添加到属性集Y中为止。 最后得到的Y就是X+。
 
 例1,设关系R(A,B,C,D,E,G)有函数依赖集 F={AB→C,BC→AD,D→E,CG→B},求AB的闭包。
 解:首先从AB出发,令X={A,B},由于函数依赖AB→C左边的所有属性都在X中,所以可以把右边的C添加到X中,这时X={A,B,C}。
其次考虑函数依赖BC→AD,左边B、C均在X中,右边D不在X中,将其添加到X中,此时X={A,B,C,D}。
再考虑函数依赖D→E,同理可将E添加到X中,此时X={A,B,C,D,E}。
 上述方法再不能向X中添加属性,所以得到{A,B}+={A,B,C,D,E}。
 
如果知道如何计算任意属性的闭包,那么就能检验任意函数依赖X→Y是否被函数依赖集F逻辑蕴涵,其步骤如下:
 第一步:计算X的闭包X+;
第二步:判断Y是否被X+ 所包含,如果YX+,说明F逻辑蕴涵函数依赖X→Y;否则说明F不会逻辑蕴涵函数依赖X→Y。
 例如: 在例1中得到属性D在{A,B}+ 中,所以F逻辑蕴涵AB→D。
现在判断函数依赖D→A是否被函数依赖集F逻辑蕴涵。
计算{D}+,得到{D}+={D,E},由于A不在{D}+中,所以该函数依赖不蕴涵于给定的函数依赖集F。
 
如果要求候选码的话就是他的闭包包括了属性集的所有属性就是候选码。但要求其子集都不是超码,既不能推出其所有的属性。
来源:http://blog.sina.com.cn/s/blog_627a16f10100ykon.html

你可能感兴趣的:(关系闭包)