在了解候选码的算法之前,先了解一下闭包
闭包的介绍
计算属性集闭包的思路是:从给定的属性集出发,如果发现包含了某个函数依赖左边的 属性,就把其右边的属性增加进来,不断地扩充该集合。最终,当该集合再也无法扩展时, 得到的结果就是闭包。
这种计算属性集闭包的流程图如图:
具体步骤:
第一步,设最终将成为闭包的属性集是 X,把 X 初始化为{ A1,A2,…,An }。
第二步,重复搜索和判断函数依赖 B1B2…Bm→C。如果左边所有的属性 B1,B2,…, Bm都在属性集 X 中,但是属性 C 不在 X 中,则将 C 添加到属性集 X 中。
第三步,重复第二步,直到没有属性可以添加到属性集 X 中为止。
第四步,最后得到的不能再添加的属性集 X 就是{ A1,A2,…,An }+的值。
举例说明更清楚一些:
例如,设关系 R(A,B,C,D,E,F)有这些函数依赖:AB→C,BC→AD,D→E 和 CF→B。求 AB 的闭包。
- 首先从 AB 出发,令 X={A,B}。由于函数依赖 AB→C 左边的所有属性都在 X 中,所 以可以把该依赖右边的属性 C 添加到 X 中。这时,X= {A,B,C}。
- 考虑函数依赖 BC→AD,由于该函数依赖的左边都在 X 中,因此可以把属性 A 和 D 添 加到 X 中。因为 A 已经在 X 中了,所以只需把 D 添加在 X 中。
- 这时,X={A,B,C,D}。 再考虑函数依赖 D→E。由于该函数依赖的左边在 X 中,因此可以把属性 E 添加到 X 中。这时,X={A,B,C,D,E}。
- 最后考虑函数依赖 CF→B。由于该依赖的左边不是全部在 X 中,所以该依赖就不能包 括在闭包中。 最后,得到的 AB 闭包为{A,B}+={A,B,C,D,E}。
候选码的算法
背景
在求解之前先要明白一些定理。我们把函数依赖集中F中的属性分为四类:
L类:所有依赖关系中仅出现在函数依赖左部的属性。
R类:所有依赖关系中仅出现在函数依赖右部的属性。
LR类:所有依赖关系中即出现在函数依赖左部又出现在函数依赖右部的属性。
N类:所有依赖关系中没有出现的属性。
定理一:对于给定的关系模式R及其函数依赖集F,若X(X∈U)是L类属性,则X必为R的任一候选码的成员。
定理二:对于给定的关系模式R及其函数依赖集F,若X(X∈U)是R类属性,则X不在任何候选码中。
定理三:对于给定的关系模式R及其函数依赖集F,若X(X∈U)是LR类属性,则X可能在候选码中。
定理四:对于给定的关系模式R及其函数依赖集F,若X(X∈U)是N类属性,则X必包含在R的任一候选码中。
例子
设有关系模式R(A,B,C,D,M,N),函数依赖集F={N→D,M→D,D→B,BC→D,DC→N},R的候选码为 ()。
第一步:
先判断所有属性属于哪一类。C仅仅出现在BC→D,
DC→N左边,属于L类。M仅仅出现在M→D左边,属于L类。
第二步:
由定理可知,C,M必出现在候选码中,因为不知道候选码中是否还有其他属性,假定目前候选码K=CM
第三步:
求K=CM的闭包,根据闭包算法可得CM+=CMDBN,可知不等于U。因此在这时可以从属性中选择一个属性和CM组成临时候选码K。
第四步:
抽取A组成临时候选码K,由闭包算法求得:ACM+=U得出ACM为候选码,
当然这个题看到这里就知道是ACM了
最后,如果第四步中在LR类中取一个属性的组合都不满足K的闭包等于数据集U,则从LR类中取2个,3个,……n个,分别组合,直到选出一个数据集K的闭包等于属性集U,K就是R的一个属性集。
END!!!