闭包数据库
① 数据库函数依赖问题
你好!
首先我们可以看到,C→D在R2上保持函数依赖,但是A→D,B→D在R1,R2上都不保持,所以做进一步判断——
判断的算法如下:
对F上的每一个α→β使用下面的过程:
①令result=α;
②t=(result∩Ri)+ ∩Ri;
result=result∪t
(第二步的Ri={R1(...),R2(...),...,Rn(...)},该步骤遍历一遍分解出的关系模式)
要注意的是这里的属性闭包是在函数依赖集F下计算出来的,如果result中包含了β的所有属性,则函数依赖α→β,分解是保持依赖的(当且仅当上述过程中F的所有依赖都被保持)。
那么我们来判断一下,首先是A→D:
先对R1,令result=A,result∩R1=A,A+=AD,t=A+∩R1=A,result=A;
再对R2,令result=A,result∩R2=空集,空集无法求闭包,那么t=空集,result=A。
可以发现无论对于R1还是R2最后的result都是A,并未包含D,所以A→D未被保持,这里已经可以得出该分解不保持函数依赖。
对于B→D也是一样的方法:
先对R1,令result=B,result∩R1=B,B+=BD,t=B+∩R1=B,result=B;
再对R2,令result=B,result∩R2=空集,空集无闭包,t=空集,result=B;
result并未包含D,所以B→D也同样未被保持,该分解不保持函数依赖。
② 数据库选择,图片第70题
首先对于给定的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的任一候选码中。
步骤:
(1)将R的所有属性分为L、R、N、LR四类,令X代表L、N两类,Y代表LR类。
(2)求 X+(X的闭包)若X+包含了R的全部属性,则X即为R的惟一候选码,转(5);否则转(3)在Y中逐一取每个属性A,求(XA)+。若它包含了R的全部属性,则转(5);否则调换一属性反复进行这一过程,直到试完所有Y中的属性。
(4)在Y中依次取两个、三个属性…求它们的属性闭包直到其闭包包含R的全部属性。
(5)输出结果。
1、给出解题的过程:
a.L:B ; R:D,E ; LR:A,C ;没有N类属性
b.D和E不包含在任何候选码中,只剩下A,B和C,而B属于L类,故必定包含在任意候选码中。将A,B和C组合:AB,BC和ABC
c.求闭包
AB的闭包:ABCDE
BC的闭包:ABCDE
不用再计算{ABC}的闭包了,因为存在两个元素的候选键的闭包包含全部属性
d.输出候选码为AB,BC
2、求F的最小覆盖为:F1={AB->C,C->A,C->D,B->E}则无损且保持函数依赖的分解为:
R1(A,B,C) R2(C,A,D) R3(B,E)
或者分解R1(A,B,C) R2(C,D) R3(B,E)也是正确的。