数据库建模和设计(2):函数依赖、闭包、最小函数依赖集、范式、模式分解

一、函数依赖:

在关系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的一个候选键,SK, 则称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上的一组函数依赖,那么有如下推理规则

① A1自反律:若Y⊆X⊆U,则X→Y为F所蕴含;                    即:ABC→AB;   AB——>A (平凡依赖函数);
② A2增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含;
③ A3传递律:若X→Y,Y→Z为F所蕴含,则X→Z为F所蕴含。
根据上面三条推理规则,又可推出下面三条推理规则:
④ 合并规则:若X→Y,X→Z,则X→YZ为F所蕴含;
⑤ 伪传递规则:若X→Y,WY→Z,则XW→Z为F所蕴含;  即:A→B,AC→BC;BC→D ;得出AC→D;
⑥ 分解规则:若X→Y,Z⊆Y,则X→Z为F所蕴含。      即:A→BC;  能得出:  A→B,A→C;

四、闭包:

闭包就是由一个属性直接或间接推导出的所有属性的集合。


例如: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也不能去掉;

②再来看BD->E,首先去掉B,得到此时D的闭包D+ = D,不含E,保留B。然后去掉D,此时B+ = BDE,包含了E,所以去掉D,即得出:B->E;

③最后再来看AG->B,去掉A,G+ = G,不包含B,不能去掉A。去掉G的时候,A的闭包A+ =A,不含B,不能去掉A,还是AG->B

所以最后得出:F的最小函数依赖集是:F={B->D,DG->C,B->E,AG->B};

例2:已知关系R(ABCDEFG),函数依赖集F{ AD à EFCDàFBFàGDàFAàD },问:F的最小覆盖为;

步骤:

(1):将函数依赖右边变成一个属性:得到F={ AD à E, AD à F,CDàF,CDàB,FàGDàFAàD};

(2):去掉多余的函数依赖:

① 去掉AD à E,F={ AD à F,CDàF,CDàB,FàGDàFAàD};AD+ = ADFG,不包含E,保留AD à E。

②去掉AD à F,F={ AD à E,CDàF,CDàB,FàGDàFAàD};AD+ = ADEFG, 包含了F,所以去掉AD à F

③ 去掉CDàF,F={ AD à E,CDàB,FàGDàFAàD}; CD+ = CDBFG ,包含F,所以去掉CDàF

④去掉CDàB,F={ AD à E,FàGDàFAàD}CD+ = CDFG,不包含B,所以保留CDàB。

⑤去掉FàG,F={ AD à E,CDàBDàFAàD};F+ = F,不包含G,所以保留FàG;

去掉DàF,F={ AD à E,CDàB,FàGAàD};D+ = D,不含包F,所以保留DàF,

去掉AàD,F={ AD à E,CDàB,FàGDàF};A+ = A,不包含D,所以保留AàD;

综上运算,此时得到F={ AD à E,CDàB,FàGDàFAàD};

(3):去掉各依赖左部多余的属性。即:AD à ECDàB中查看检测;

①先来看AD à E,去掉A,D+ = DFG,不包含E,所以A不能去掉. 去掉D,A+ = ADEFG,包含了E;所以需要去掉D,此时得出:A à E;

③最后看CDàB,去掉C,D+ = DFG,不含F,保留C。去掉D,C+ = C,不包含B,不能去掉D,继续保留。所以依旧是:CDàB;

综上,得数F={A à ECDàB,FàGDàFAàD};

所以最后得出F={A à ECDàB,FàGDàFAàD};

六、三范式和BCNF范式:

(1):1NF:每个分量都是不可再分的数据项(值、原子)。即:属性中,不能存在复合属性 或者 多值属性。

(2):2NF:每一个非主属性 完全函数依赖 于 候选键(码)。注意:这里是码(不是主属性);即:不能存在 非主属性部分函数依赖于码。

(3):3NF:每一个非主属性 都不传递依赖于 码。 即:不能存在非主属性对于码的传递函数依赖。

(4):BCNF:不存在 主属性 对于 码 的 部分函数依赖 与 传递函数依赖。判断方法:箭头左边的必须是候选码(不能只是一个属性,部分码)。

七、模式分解:

当模式不符合关系范式时,需要进行模式分解。

1、模式分解的特性:

(1):数据内容的等价性。 即:分解后的数据内容 与 原始数据内容 相比 不能多,也不能少。 分解的无损连接性;

(2):数据约束的等价性。 即:分解后的数据约束(依赖关系)等不能丢失。 分解的保持依赖性;

2、无损连接分解的检测方法(判断一个分解是否无损连接):

方法一:算法:


(1)案例:



方法二:无损连接定理:


案例(1):关系模式R(SAIP),F={S—>A,SI—>P};  ρ={R1(SA),R2(SIP)}检测分解是否为无损连接?

因为:R1R2 = S ;R1R2 = A; R2R1 = IP;所以得出:S —>A;或者S —>IP; 而 S —>A 在F={S—>A,SI—>P}中,所以此分解是无损连接。

举例(2):已知R<U,F>,U={A,B,C},F={A→B},如下的两个分解:
① ρ1={AB,BC};

② ρ2={AB,AC};

因为:ABBC = B;AB—BC = A;BC—AB = C;得出;B→A,或者 B→A,两个都不包含在F={A→B}中,所以 ρ1 分解是有损的。

因为:ABAC = A;AB—AC = B;AC—AB = C;得出:AB,或者A→C,而A→B包含在F={A→B}中,所以 ρ2 分解是无损的。


3、保持依赖分解的检测方法(判断一个分解是否保持依赖):

算法:

如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这个分解是保持依赖的(这是一个充分条件)。
如果上述判断失败,并不能断言分解不是保持依赖的,还要使用下面的通用方法来做进一步判断。
该方法的表述如下:
算法二:
对F上的每一个α→β使用下面的过程:
result:=α;
while(result发生变化)do
    for each 分解后的Ri //将每个分解后的结构Ri逐个带入
        t=(result∩Ri)+ ∩Ri //这里的意思是取result与Ri的交集的闭包值,之后再与Ri取交集
        result=result∪t

这里的属性闭包是在函数依赖集F下计算出来的。如果result中包含了β的所有属性,则函数依赖α→β。分解是保持依赖的当且仅当上述过程中F的所有依赖都被保持。


案例(1):关系模式R<U, F>,U={A, B, C, D, E},F={B→A,D→A,A→E,AC→B}则分解ρ={R1(ABCE),R2(CD)}是否满足保持函数依赖。

因为:B→A,A→E,AC→B在R1上成立,D→A在R1和R2上都不成立,因此需做进一步判断。

由于B→A,A→E,AC→B都是被保持的(因为它们的元素都在R1中),因此我们要进一步判断的是D→A是不是也被保持。

①先看R1:因为:result = D;result ∩R1 = ф (空集);所以:t=ф,result=D;

②再看R2:因为:result = D;result ∩R2 = D;D+ = DA; D+ ∩ R2 = D; 所以:t=D,result=D;

一个循环后result未发生变化,因此最后result=D,并未包含A,所以D→A未被保持,该分解不是保持依赖的。

案例(2):关系R<U,F>,U={A,B,C,D,E},F={A→C,B→C,C→D,DE→C,CE→A},R的一个分解为R1(AD),R2(AB),R3(BE),R4(CDE),R5(AE),判断这个分解是否具有函数依赖性。

因为:,C→D,DE→C均在R4(CDE)中被保持,而A→C,B→C,CE→A,在R1....R5上都不成立,需要进一步判断。

(1)A→C;

①先看R1:因为:result = A;result ∩R1 = A ; A+ = ACD ; A+ ∩ R1 = AD;所以:t=AD,result=AD; 此时,result改变,则,进入R2;

②再看R2:因为:result = AD;result ∩R2 = ф,最后还是result = AD;

再看R3:因为:result = AD;result ∩R3 = ф,最后还是result = AD;

再看R4:因为:result = AD;result ∩R4 = D,D+ = D; D+ ∩ R4= D;最后还是result = AD;

再看R5:因为:result = AD;result ∩R5 = A,最后还是result = AD;

最后result = AD 并未包含C;所以,所以D→A未被保持,该分解不是保持依赖的;

综合案例:设有关系模式R<U,F>,U={A,B,C,D,E},F={A→D,E→D,D→B,BC→D,CD→AB},设有一个分解P={R1(ED),R2(BCD),R3(ACD)}判断该分解是否保持函数依赖,并判断此分解是否具有无损连接性。

①判断是保持函数依赖的;F的最小函数依赖为:F={A→D,E→D,D→B,BC→D,CD→A};三个分解的模式中满足依赖的传递。

②判断是有损的模式分解; (没有一行全为a的);



4、关系模式保持依赖地分解成3NF:


分解规则:将每一个函数依赖单独组成一个关系;

案例(1):关系R<U,F>,U={A, B, C, D, E, F, G},F={A→B,A→C,C→D,C→E,E→FG},将R分解成3NF。(有非主属性传递依赖于码,不属于3NF目前);

①:U中所有元素均存在F中,进一步判断; F中并不存在依赖函数X→A,且XA = R;

②:将每一个函数依赖组成一个关系;即:ρ = {R1(A,B),R2(A,C),R3(C,D),R4(C,E),R5(E,F,G)};

③:合并关系(跟进F左边相同):即:ρ = {R1(A,B,C),R2(C,D,E),R3(E,F,G)};

案例(2):关系模式R<U,F>,其中U={C,T,H,R,S,G},F={CS→G,C→T,TH→R,HR→C,HS→R},将其分解成3NF并保持函数依赖。

因为:最小依赖集为:F={CS→G,C→T,TH→R,HR→C,HS→R}; 而U中所有元素 均在 F中有出现;

所以:可将每一个函数依赖单独组成一个关系;即:ρ = {R1(CSG),R2(CT),R3(THR),R4(HRC),R5(HSR)};

5、关系模式无损连接地分解成BCNF:


分解规则:将左侧不含候选键的函数依赖单独组成一个关系, 将包含候选键的组成一关系;

案例(1):关系R<U,F>,U={A, B, C, D, E, F, G},F={A→B,A→C,C→D,C→E,E→FG},将R分解成BCNF;(目前,有 不依赖于 候选键的其他函数依赖,不满足BCNF);

①找出候选码:A;

②将左侧不含候选码的组成一个关系,包含候选码的组成一个关系:ρ = {R1(C,D),R2(C,E),R3(E,F,G),R4(A,B,C)};

③合并关系:即:ρ = {R12(C,D,E),R3(E,F,G),R4(A,B,C)};


案例(2)关系模式R<U,F>,其中U={C,T,H,R,S,G},F={CS→G,C→T,TH→R,HR→C,HS→R},将其分解成BCNF并保持无损连接。

①找出候选码:HS;

②将左侧不含候选码的组成一个关系,包含候选码的组成一个关系:ρ = {R1(C,T),R2(S,G,C,R,G)};(即:R2中不能含T);

计算此时R1和R2的最小函数依赖集分别为:F1={C→T},F2={CS→G,CH→R,HR→C,HS→R}(因为R2中不能含有T,根据C→T,TH→R,可以转化成CH→R);

又因为:R1(C,T)、F1={C→T}(已满足BCNF);

R2(S,G,C,R,G)、F2={CS→G,CH→R,HR→C,HS→R};此时R2的码为:HS;而F中箭头左侧有不是如CS、CH、HR不是码,故不满足BCNF,需要进一步分解;

分解R2: R2(S,G,C,R,G)、F2={CS→G,CH→R,HR→C,HS→R};得:R21(CSG),R22(CHR),R23(HSR);(左侧不含候选码的组成一个关系); 此时:R21、R22、R23均已满足BCNF;

③最终分解后得出:ρ = {R1(C,T),R21(CSG),R22(CHR),R23(HSR)};


案例(3)关系模式R<U,F>,其中:U={A,B,C,D,E},F={A→C,C→D,B→C,DE→C,CE→A},将其分解成BCNF并保持无损连接。

①找出候选码:BE;

②因为目前左侧都不包含码。不能组成一个包含码的关系。

考虑A→C函数依赖不满足BCNF条件(因A不包含候选键BE),将其分解成R1(AC)、R2(ABDE)。 (R2中不能包含C);

计算此时R1和R2的最小函数依赖集分别为:F1 = {A→C};F2 = {B→D,BE→A};(因为C→D,B→C,DE→C,CE→A,R2中不能包含C,而C→D,B→C,可以转化成:B→D;DE→C 可以转化成 DE→D,CE→A 可以转化成BE→A);又由于DE→D是蕴含关系,可以去掉;

分解R2:R2上的候选关键字为BE。考虑B→D函数依赖不满足BCNF条件,将其分解成R21(BD)、R22(ABE)。计算R21和R22的最小函数依赖集分别为:F21={B→D},F22={BE→A}。
由于R22上的候选关键字为BE,而F22中的所有函数依赖满足BCNF条件。故R可以分解为无损连接性的BCNF如:ρ={R1(AC),R21(BD),R22(ABE)}。

6、关系模式分解既保持依赖又无损连接:

分解规则:将R的一个保持依赖的分解,再并上候选码; 即:(原模式)候选码 U 保持依赖的3NF分解;

案例(1)关系模式R<U,F>,其中:U={C,T,H,R,S,G},F={CS→G,C→T,TH→R,HR→C,HS→R},分解成3NF并保持无损连接和函数依赖。

①找出候选码:  HS;

②模式分解成保持依赖的3NF为:ρ={R1(GSC),R2(CT),R3(THR),R4(HRC),R5(HSR)};

③将原候选码,作为一个关系,加入ρ中,即:τ={CT,CSG,CHR,HSR,HRT,HS};

而由于:HS是模式HSR的一个子集,所以消去HS后的分解{CT,CSG,CHR,HSR,HRT}就是具有无损联接性和保持函数依赖性的分解,且其中每一个模式均为3NF。

案例(2)已知:关系模式R(U,F) U=ABCD   F={A→C,C→A,B→AC,D→AC},将模式R无损失连接且保持函数依赖分解为3NF。

①找出候选码:  BD;

②求出关系F的最小依赖集:F={A→C,C→A,B→C,D→C};

模式分解成保持依赖的3NF为:ρ={R1(AC),R2(BC),R3(CD)};

将模式R无损失连接且保持函数依赖分解为3NF:ρ={R1(AC),R2(BC),R3(CD),R4(BD)};

猜你喜欢

转载自blog.csdn.net/prdslf001001/article/details/80336835