1、概念型算法
F 的闭包:
在关系模式 R 中为 F 所逻辑蕴含的函数依赖的全体叫作 F 的闭包,记为 F + 。
属性集 X 关于函数依赖集 F 的闭包:
设 F 为属性集 U 上的一组函数依赖, X Í U , XF + ={ A|X → A 能由 F 根据 Armstrong 公理导出 } , XF + 称为属性集 X 关于函数依赖集 F 的闭包.
算法 求属性集 X ( X Í U )关于 U 上的函数依赖集 F 的闭包 XF +
输入: X , F 输出: XF +
步骤:
( 1 )令 X ( 0 ) =X , i =0
( 2 )求 B ,这里 B = { A |( $ V)( $ W )(V → W Î F ∧ V Í X ( i )∧ A Î W) } ;
( 3 ) X ( i+1 ) =B ∪ X ( i )
( 4 )判断 X ( i+1 ) = X ( i )吗 ?
( 5 )若相等或 X ( i ) =U , 则 X ( i )就是 XF + , 算法终止。
( 6 )若否,则 i =i +l ,返回第( 2 )步。
2、通俗算法
以下是写的比较科学规范的闭包求解方法,设X和Y均为关系R的属性集的子集,F是R上的函数依赖集,若对R的任一属性集B,一旦X→B,必有B⊆Y,且对R的任一满足以上条件的属性集Y1 ,必有Y⊆Y1,此时称Y为属性集X在函数依赖集F下的闭包,记作X+。
计算关系R的属性集X的闭包的步骤如下:
第一步:设最终将成为闭包的属性集是Y,把Y初始化为X;
第二步:检查F中的每一个函数依赖A→B,如果属性集A中所有属性均在Y中,而B中有的属性不在Y中,则将其加入到Y中;
第三步:重复第二步,直到没有属性可以添加到属性集Y中为止。 最后得到的Y就是X+
例(1): 设有关系模式R(U,F),其中U={A,B,C,D,E,I},F={A→D,AB→E,BI→E,CD→I,E→C},计算(AE)+
解: (1) 令X={AE},X(0)=AE
(2)在F中寻找尚未使用过的左边是AE的子集的函数依赖,结果是: A→D, E→C;所以 X(1)=X(0)DC=ACDE, 显然 X(1)≠X(0).
(3) 在F中寻找尚未使用过的左边是ACDE的子集的函数依赖, 结果是: CD→I;所以 X(2)=X(1)I=ACDEI。虽然X(2)≠X(1),但F中寻找尚未使用过函数依赖的左边已经没有X(2)的子集,所以不必再计算下去,即(AE)+=ACDEI。
说白话一点:闭包就是由一个属性直接或间接推导出的所有属性的集合。
例如:f={a->b,b->c,a->d,e->f};由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d}
难点:1、画函数依赖图不能画错;
2、没有入度为0的属性或入度为0不能遍历全图时较难。
3、如何定义“能正常遍历图中所有节点”?当存在多个属性共同决定某属性时,存在歧义易错。例架构师考试2009题26
需要注意问题:
1、图中第二条:“若能正常遍历图中所有节点”指的是该属性集合加起来能遍历全图。举例:设U={A、B、C、D、E},假设零入度的有C和D,C为起点能遍历B、A、E。D为起点能遍历A、E。C和D加起来能遍历所有,故CD集合为候选码。
结论:是一种快速算法,但由于难点3,不属于一种比较严谨的算法。可作为一种参考,若题目较复杂,不建议采用。
以下两个算法都是基于闭包算法的,思路略有差异,算法基本相同。
算法1:理论
首先对于给定的R(U)和函数依赖集F,可以将它的属性划分为4类:
L类,仅出现在F的函数依赖左部的属性。
R类,仅出现在F的函数依赖右部的属性。
N类,在F的函数依赖左部和右部均未出现的属性。
LR类,在F的函数依赖左部和右部两部均出现的属性。
根据以下定理和推论来求解候选码。
定理1:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选码的成员。
推论1:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,且X+包含了R的全部属性,则X必为R的唯一候选码。
定理2:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是R类属性,则X不在任何候选码中。
定理3:设有关系模式R及其函数依赖集F,如果X是R的N类属性,则X必包含在R的任一候选码中。
推论2:对于给定的关系模式R及其函数依赖集F,如果X是R的N类和L类组成的属性集,且X+包含了R的有属性,则X是R的唯一候选码。
例:如设有关系模式R(U),其函数依赖集为F,其中:
U={A,B,C,D,E}, F={A→C,C→A,B→AC,D→AC}
求R的候选码。
解:根据函数依赖可得:
属性B、D为L类,E为N类,因此属性B、D、E必为候选码的成员,且此三个属性的闭包:B+=ABC,(BD)+=ABCD,(BDE)+=ABCDE,根据推论2可得BDE是R的唯一候选码。所以R的候选码为BDE。 如果把例题中关系模式R(U)中的属性E去掉,那么再求R的候选码的话可以根据推论1得出BD为R的唯一候选码。
快速求解方法适用于判断有属性是属于L类、N类或其中一种的情况下求解。如果有L类和N类的属性,则求解候选码速度非常快。
简而言之:L、R、N、LR类。根据定理,L、N类必为侯选码之一,如果L+包含全部R,则L为唯一侯选。R类不在任何侯选码中。L+N类且(L+N)+包含所有R,则L+N为唯一侯选。(适于有L、N类至少一种的情况。)
算法2:较通俗
在学习数据库的时候,经常要碰到候选键的求取,但是一开始的时候,根本搞不清楚怎么去求,最近看了一些文章和资料,终于搞明白了。
首先来看候选键的定义:若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选键。
若W是候选键,则必须满足两个条件:W的闭包是U;W没有冗余。
设关系模式R中U=ABC.......等N个属性,U中的属性在FD中有四种范围:
(1)左右出现;
(2)只在左部出现;
(3)只在右部出现;
(4)不在左右出现;
算法:按以下步骤求候选键:
1.只在FD右部出现的属性,不属于候选码;
2.只在FD左部出现的属性,一定存在于某候选码当中;
3.外部属性一定存在于任何候选码当中;
4.其他属性逐个与2,3的属性组合,求属性闭包,直至X的闭包等于U,若等于U,则X为候选码。
例1:R,U=(A,B,C,D,E,G),F={AB-->C,CD-->E,E-->A.A-->G},求候选码。
因G只在右边出现,所以G一定不属于候选码;而B,D只在左边出现,所以B,D一定属于候选码;BD的闭包还是BD,则对BD进行组合,除了G以外,BD可以跟A,C,E进行组合
先看ABD
ABD本身自包ABD,而AB-->C,CD-->E,A-->G,所以ABD的闭包为ABDCEG=U
再看BDC
CD-->E,E-->A,A-->G,BDC本身自包,所以BDC的闭包为BDCEAG=U
最后看BDE
E-->A,A-->G,AB-->C,BDE本身自包,所以BDE的闭包为BDEAGC=U
因为(ABD)、(BCD)、(BDE)的闭包都是ABCDEG所以本问题的候选码有3个分别是ABC、BCD和BDE
例2:R,U=(A,B,C),F={AB-->C,C-->B},求候选码。
因为A只出现在左边,所以A一定是候选键。A的闭包还是A,则对A进行组合,可以和B,C进行组合。
首先看AB,AB本身自包AB,而AB-->C,所以AB的闭包是ABC=U。
再看AC,AC本身自包AC,而C-->B,所以AC的闭包是ABC=U。
因为AB,AC的闭包都是ABC,也就是U,所以候选键是AB,AC。
结论:算法一可作参考,不宜采用。算法二.2推荐采用。考试时由于题目只会出现在选择题,可以结合排出法、倒推(算闭包法)得出答案。