一、函数依赖:
在关系R中,若属性或者属性集 A 中 两个元祖的值相等,如果这两个元祖中对应的属性或者属性集B中的值也相同,则记作A——>B。 A函数决定B; 或者 B函数依赖于A。
例1:下表就是问题领域, 则存在的函数依赖有哪些呢?
属性A的值都不相等,所以A--->B; 而属性B中前两行元祖相同,对应的属性C的前两组元祖也相同,所以B----->C;
而属性C的三行元祖是全部相同的,对应的属性A和属性B,没有三行元祖的值是全部一样的,所以C函数不决定任何.
属性A的元祖的值相同的时候,对应的属性C元祖的值也都相同,所以A--->C;
而属性B元祖的值相同的时候,没有全部一样的属性对应的元祖的值也一样。(b2的值虽然和d2的值对应,但是值为b3的两个元祖对应的是d3、d4,值不是相同的,故:B不能决定D;
而属性C中,前两行的元祖的值相同,对应的A属性中的前两行元祖的值也相等,但是属性C后三行的值c2是都一样的,在A、B、D属性中,后三行的值没有完全一样的,故:C也不能决定其他。
属性D中第2、3行中的值相等,对应的属性B中,第2、3行的元祖的值也是相等的,所以:D----->B;
对X——>Y,若Y⊄X,则称X→Y为非平凡的函数依赖; 如:(职工号,姓名)→性别,职工号——>姓名;
平凡函数依赖:(职工号,姓名)→姓名; (职工号,性别)——>性别;
1、完全函数依赖:
设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
比如:(学号,课号)——>成绩; 单独一个学号,不能决定成绩,单独一个课程,也不能决定成绩;只有二者同时,才能决定;
2、部分函数依赖:
设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
(学号,课号)——>姓名;学号和课号能决定姓名, 单独一个 学号 也能决定 姓名;
3、传递函数依赖:
设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
学号——>系号,系号——>系主任; 系主任 传递依赖于 学号;
二、候选键:
(1)可任选一候选键作为R的主键(Primary Key); 即:当候选码多于一个时,选定其中一个作为主码
(2)包含在任一候选键中的属性称主属性(Prime Attribute),其他属性称非主属性;
(3)若K是R的一个候选键,SK, 则称S为R的一个超键(Super Key)。
(4)若k是候选键(码),则必须满足两个条件,k的闭包是U,k没有冗余。
2、候选码的确定(算法)
设关系模式R中U=ABC.......等N个属性,U中的属性在FD中有四种范围:
(1)左右出现;
(2)只在左部出现;
(3)只在右部出现;
(4)不在左右出现;
算法:按以下步骤求候选键:
1.只在FD右部出现的属性,不属于候选码;
2.只在FD左部出现的属性,一定存在于某候选码当中;
3.外部属性一定存在于任何候选码当中; (左右都不出现)
4.其他属性逐个与2,3的属性组合,求属性闭包,直至X的闭包等于U,若等于U,则X为候选码。
3、候选码以及属性相关的案例;
U={学号,姓名,年龄,班号,班长,课号,成绩 }
候选键:学号,课号;
主属性:学号,课号;(主要的属性,能决定其他属性的), 即:学号,课号称为U的主属性;
非主属性:U中剩余的属性,即:姓名,年龄,班号,班长,成绩;
例1:R<U,F>,U=(A,B,C,D,E,G),F={AB-->C,CD-->E,E-->A.A-->G},求候选码以及主属性。
因为:G只在右边出现,所以候选码肯定不包含G,AB只出现在左边,所以,候选码中肯定有BD,而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
候选码:ABC,BCD,BDE;
主属性:ABCDE;
非主属性:G;
例2:R<U,F>,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
C-->B,而AC本身自包AC,所以AC的闭包为ABC=U;
候选码:AB,AC
主属性:ABC; 非主属性:无; 此时又称为 全码。(所有属性构成码)。
三、Armstrong公理系统:
设关系模式R<U,F>,其中U为属性集,F是U上的一组函数依赖,那么有如下推理规则四、闭包:
闭包就是由一个属性直接或间接推导出的所有属性的集合。
例如:f={a->b,b->c,a->d,e->f};由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d};
已知关系R(A1,A2,A3,A4,A5,A6),函数依赖集F为{ (A2,A3)——>A4,A3——>A6,(A2,A5)——>A1 }, 问(A2,A3)关于F的属性闭包为:{A2,A3,A4,A6}; 因为:A2,A3能带到A4,A3能得到A6;
已知关系R(A,B,C,D,E,F,G),函数依赖集F为{ A ——>B,B——>D,AD——>EF,AG——>C}, 问:A关于F的属性闭包为:{A,B,D,E,F}; 因为:A能得到B,B能得到D,AD能得到EF;
五、最小函数依赖集(最小覆盖):
1、定义:
如果函数依赖集F满足以下条件,则称F为一个极小函数依赖集。也称为最小依赖集或最小覆盖。
(1)F中任一函数依赖的右部仅含有一个属性。
(2)F中不存在这样的函数依赖X→A,使得F与F-{X→A}等价。
(3)F中不存在这样的函数依赖X→A,X有真子集Z使得F-{X→A}U{Z→A}与F等价。
2、最小依赖集通用算法:
① 用分解的法则,使F中的任何一个函数依赖的右部仅含有一个属性;
② 去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭包X+,看X+是否包含Y,若是,则去掉X→Y;否则不能去掉,依次做下去。直到找不到冗余的函数依赖;
③ 去掉各依赖左部多余的属性。一个一个地检查函数依赖左部非单个属性的依赖。例如XY→A,若要判Y为多余的,则以X→A代替XY→A是否等价?若A属于(X)+,则Y是多余属性,可以去掉。(以上步骤中,求出关系依赖集F,此时,再F的基础上,求出X或者Y的闭包,是否包含A)
3、最小依赖集案例:
例1:关系模式R(U,F)中,U=ABCDEG,F={B->D,DG->C,BD->E,AG->B,ADG->BC};求F的最小函数依赖集
步骤:
(1)用分解的法则,使F中的任何一个函数依赖的右部仅含有一个属性;得到:F={ B->D,DG->C,BD->E,AG->B,ADG->B,ADG->C};
(2)去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭包X+,依次做下去。直到找不到冗余的函数依赖;
① 去掉B->D,此时F={
DG->C,BD->E,AG->B,ADG->B,ADG->C},此条件下得出B的闭包 B+ = B;B+不包含D,所以B->D保留。
②去掉DG->C,此时F={
B->D,BD->E,AG->B,ADG->B,ADG->C},此时DG闭包DG+ = DG,不包含C,所以不能去掉DG->C.
③ 去掉BD->E,此时F={
B->D,DG->C,AG->B,ADG->B,ADG->C},此时闭包BD+ = BD,不包含E,所以不能去掉BD->E,继续保留。
④去掉AG->B,此时F={
B->D,DG->C,BD->E,ADG->B,ADG->C};此时AG+ = AG,不包含B,所以不能去掉AG->B,继续保留。
⑤去掉ADG->B,此时F={
B->D,DG->C,BD->E,AG->B,ADG->C},此时ADG+ = ADGCBE,包含了B,所以删除ADG->B,不保留。
⑥去掉ADG->C,此时F={
B->D,DG->C,BD->E,AG->B},此时ADG+ = ADGCBD,包含了C,所以删除ADG->C,不保留。
综上所得,此时得到F={ B->D,DG->C,BD->E,AG->B};
(3)去掉各依赖左部多余的属性。一个一个地检查函数依赖左部非单个属性的依赖。
此时函数依赖左边非单个属性有:DG->C,BD->E,AG->B;所以做如下操作:
①先来看DG->C,首先去掉D,则此时G的闭包G+ = G,不包含C,保留D。再次去掉G,此时D+ = D,不包含C,所以G也不能去掉;
②再来看