目录
一、最小依赖集Fmin
1.概念
最小依赖集:在给定一组依赖关系中,找到最小的一个子集,使得在这个子集中不存在多余或冗余的依赖关系。简而言之,最小依赖集是数据之间必要的依赖关系的最小集合。
2.求最小函数依赖集步骤
1)拆右边(将函数依赖箭头右侧化为单属性)
2)拆左边(对于箭头左侧不是单属性的,尝试能否减少左侧属性,尽量使左侧变为单属性)
3)去掉多余的(对每个函数依赖分别尝试去除,观察是否影响左侧属性的闭包,如果不影响则去掉)
二、模式分解
1.概念
模式分解:把一个关系模式分解成若干个关系模式的过程称为关系模式的分解。(即把一个表分解成若干个表)
无损连接分解:分解后的若干表做自然连接,内容是否与原来一致,如果一致,则为无损连接分解。
保持函数依赖分解:关系模式的函数依赖集在分解后仍然保持不变。
2.判断是否为无损连接分解
1)如果分解后的关系模式是形如{U1,U2}的(分解成了两个表),公式判断:
或者 ,如果符合两个公式中任意一个,则为无损连接分解,否则为有损连接分解。
2)其他形式(分解成了三个表及以上):
(1)先求最小函数依赖集,后将左侧属性相同的函数依赖合并;
(2)建表(表格的行是分解成的表(R1,R2,...),列为属性(A,B,C,...)),每行中Rn包含的属性对应表格标为a,不包含的属性对应表格标为b;
(3)根据最小函数依赖集依次对表格进行改变,比如A->B,即为将A列中标为a的行,对应的B列中的内容标为a,将A列中标为b的行,对应的B列中的内容标为b,这样对最小函数依赖集的所有函数依赖经过一次全部扫描;
(4)在某次更改后,若出现某一行全部为a的情况,则终止,判断其为无损连接分解;
(5)若全部扫描后未出现全部为a的情况,重复步骤(3),直到前一次扫描和后一次扫描表格无任何变化时,停止扫描,判断其不是无损连接分解。
三、例题
1.例题1
1.1题目
F={A->B,A->C,A->F,AC->D,C->D,C->E,E->G}
1)求候选键
2)判断该关系模式符合第几范式
3)求最小依赖集Fmin
1.2解题思路
1)首先判断所有函数依赖中:
只在箭头左边出现的:A
只在箭头右边出现的:B,D,F,G
箭头两边都出现过的:C,E
(这里求闭包过程省略,根据题中函数依赖即可,具体方法可查看https://blog.csdn.net/m0_65985318/article/details/136572045)
所以候选键为A
2)因为A为候选键,所以A->D,因为AC->D,所以没有消除非主属性对码的部分函数依赖,不符合二范式,符合第一范式。
3)F={A->B,A->C,A->F,AC->D,C->D,C->E,E->G}
第一步:拆右边(例题中所有函数依赖箭头右边均为单属性,所以不用拆,直接第二步)
第二步:拆左边
左边不为单属性的有:AC->D
因为候选键为A,所以一定有A->D(候选键的闭包是全集,全集中一定包含D,所以A一定能推出D),所以可以用A->D来代替AC->D(C属性在这个函数依赖中多余)
所以F={A->B,A->C,A->F,A->D,C->D,C->E,E->G}(函数依赖集更新,后续步骤中用更新的F)
第三步:去掉多余的(从左到右依次尝试)
(1)删除A->B,F1={A->C,A->F,A->D,C->D,C->E,E->G}
因为删除的函数依赖集A->B左侧是A,删掉前,因为A是候选键,,所以我们要求删掉后A的闭包还是不是全集,或者说其实要判断的就是删掉A->B后,B还在不在A的闭包里,A还能不能推出B来。
如果B还在A的闭包,则说明A->B的函数依赖是多余的,如果不在,则说明A的闭包发生了变化,A->B的函数依赖是必要的。
,B不属于,所以不能删除;
(2)删除A->C,F2={A->B,A->F,A->D,C->D,C->E,E->G}(因为刚才A->B不能删除,所以要将放回来,将A->C删除)
,C不属于,不能删除;
(3)删除A->F,F3={A->B,A->C,A->D,C->D,C->E,E->G}
,F不属于,不能删除;
(4)删除A->D,F4={A->B,A->C,A->F,C->D,C->E,E->G}
,D属于,能删除;
(5)删除C->D,F5={A->B,A->C,A->F,C->E,E->G}(这里刚才A->D能删除,所以函数依赖集更新了,不以F为参照,而是以F4为参照删除C->D)
,D不属于,不能删除;
(6)删除C->E,F6={A->B,A->C,A->F,C->D,E->G}
,E不属于,不能删除;
(7)删除E->G,F7={A->B,A->C,A->F,C->D,C->E}
,G不属于,不能删除;
所以最终Fmin={A->B,A->C,A->F,C->D,C->E,E->G}
2.例题2
2.1题目
F={A->BD,A->C,B->C,AD->E}
1)求候选键
2)求满足第几范式
3)模式分解后分解为两个表R1(ABC),R2(BCD),该分解是否为无损连接分解
4)模式分解后分解为三个表ρ={R1(ABD),R2(ADE),R3(ABC)},判断ρ是否为无损连接分解
2.2解题思路
1)只左:A,只右:C,E,左右都有:B,D
因为A->BD,A->C,所以,又因为AD->E,所以,所以候选键为:A
2)因为A->BD,所以存在A->B,因为B->C,所以存在非主属性对码的传递函数依赖,不满足3NF;又因为A是候选键,所以A->E,因为AD->E,所以存在非主属性对码的部分函数依赖,不满足2NF,满足1NF
3)U1=ABC,U2=BCD,,,,不存在BC->D,由公式可知,该分解不是无损连接分解
4)先求Fmin:
拆右:因为A->BD,所以A->B,A->D
拆左:因为A->E,所以可用A->E代替AD->E
所以F={A->B,A->D,A->C,B->C,A->E}
去掉多余的:
(1)去掉A->B:F1={A->D,A->C,B->C,A->E},,B不属于,不能删除;
(2)去掉A->D:F2={A->B,A->C,B->C,A->E},,D不属于,不能删除;
(3)去掉A->C:F3={A->B,A->D,B->C,A->E},,C属于,能删除;
(4)去掉B->C:F4={A->B,A->D,A->E},,C不属于,不能删除;
(5)去掉A->E:F5={A->B,A->D,B->C},,E不属于,不能删除;
所以最终Fmin={A->B,A->D,B->C,A->E}
Fmin求出后左边相同的先合并:Fmin={B->C,A->BDE}
然后开始判断是否为无损连接分解,因为分解后不是两个表,所以无法直接用公式判断,需要画表格:
表格列为所有属性,A,B,C,D,E共五个每个占一列,所分成的三个表R1,R2,R3每个占一行
分解后的每个表中含有的属性标为(下标i为列号(A列列号为1,B列列号为2,以此类推...)
表中不含有的属性标为(下标i为行号,j为列号,比如图中b13代表R1(ABD)表中不含有属性C,且b13在表格中的位置为第一行第三列)
根据最小依赖集中的函数依赖依次对表格进行改变:
(1)B->C:(B列中为标为a的,对应行的C列也标为a
(2)A->BDE:(A列中标为a的,对应行B、D、E列的位置也标为a(为明细过程,分为以下三步)
A->B:
A->D:
A->E:
因为R1行和R3行出现全为a的情况,所以ρ={R1(ABD),R2(ADE),R3(ABC)}是无损连接分解。