求候选键/候选码要先会求闭包,如果不会可以参考我的这篇文章。
下面给出一个方法,我称它为“LRN法”。
对于给定的关系R(A1,A2,…, An)和函数依赖集F,可将其属性分为四类:
L类:仅出现在F的函数依赖左部的属性;
R类:仅出现在F的函数依赖右部的属性;
N类:在F的函数依赖左右两边均未出现的属性;
LR类:在F的函数依赖左右两边均出现的属性。
这里还有几个定理,非常有用(我一般用定理1/2/3和推论1)。
定理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(X属于R)是N类属性,则X必为R的任一候选关键字的成员。
推论2:对于给定的关系模式R及其函数依赖集F,若X(X属于R)是N类和L类组成的属性集,且X+包含了R的全部属性,则X必为R的唯一候选关键字。
例:关系模式R(U,F),其中U={A,B,C},F={AB→C,C→A},试求此关系的候选键。
解:
第一步:用“LRN法”求出L、R、N、LR各有哪些元素。一般都是先写N、LR,再写L、R。防止冲突。
L:B
R:none
N:none
LR:A,C
第二步:
先求B的闭包(B)+
再求(AB)+=ABC=U,所以AB是候选键。
再求(BC)+=ABC=U,所有BC也是候选键。
于是:候选键为AB,BC。
这里总结一下解题套路:
第一步:用“LRN法”求出L、R、N、LR各有哪些元素。
第二步:根据三个定理、两个推论,一般都是先求L中元素的闭包。如果是U,则符合推论1,候选码唯一。如果不是U,这时就要并上LR中的元素,继续求闭包,一般都是两两组合。然后如果其中有一组闭包是U,其他一组不是U,那就不用再三个组合了,因为这样会产生冗余,除非三个一组里面不包含前面求到的闭包是U的两个元素。
版权声明:本文为博主原创文章,未经博主允许不得转载。