闭包就是由一个属性直接或间接推导出的所有属性的集合,例如: 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关系数据库原理之求闭包
精选 转载
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
鸿蒙开发必须了解的闭坑指南
鸿蒙应用的包名必须唯一,这个唯一不仅仅指的是鸿蒙应用中,更是和Android应用的包名也不能相同,否则难以上架鸿蒙商店!
鸿蒙开发包名 鸿蒙上架 HarmonyOs上架 -
求凸包或者闭包的顺序
已知一个多边形N有点A,B,C,D,E,F,G,H组成,切多边形的凹凸性不确定,如何判断多边形的方向呢。如
#include #define 叉乘 -
【集合论】关系闭包 ( 自反闭包 | 对称闭包 | 传递闭包 )
一、关系闭包 、二、自反闭包 、三、对称闭包 、四、传递闭包 、
关系闭包 自反闭包 对称闭包 传递闭包 二元关系 -
POJ 3660 Cow Contest——flody求传递闭包
题意:有n个牛, 他们之间有m个优劣关系, 求有多少个牛int main() {
flody #include i++ ios
















