数据库复习
列出下图所示关系满足的所有非平凡的函数依赖(忽略蕴含的函数依赖)。
A B C
a1 b1 c1
a1 b1 c2
a2 b1 c1
a2 b1 c3
做题之前搞清几个概念:
- 函数依赖:X和Y是关系R的两个属性集合,当任意时刻R中任意两个元组的X属性相同时,则Y也必定相同。我们就说X->Y或Y依赖X
- 平凡&非平凡函数依赖:设一个关系为R(U),X和Y为属性集U上的子集,如果X->Y并且X不包含Y,则称X->Y为非平凡函数依赖;否则若X包含Y,则必有X->Y,则称为平凡函数依赖。
现在依据上面的概念来做这道题目
首先看A属性,当A确定时,发现B也会完全相同。并且A并不包含B,所以A->B是一个非平凡的函数依赖。
之后再看B属性,当B属性确定时,发现并没有哪个属性是必定相同的。所以B不存在函数依赖
最后看C属性,当C属性确定时,发现B属性被确定,则C->B也是一个非平凡函数依赖。
所以最后答案为A->B和C->B
假设有关系模式R(A,B,C,D,E),其函数依赖集F={A→BC,CD→E,B→D,E→A}
列出R的所有候选码。
- 码就是键。超键=码。即可以唯一标识一条记录的属性或属性集
- 候选键=候选码,即能够唯一标识一条记录的最小属性集
- 主键=主码,从候选码中人为的选择一条
所以根据上述概念来看,如果要找到所有候选码,那就要从超键里进一步挑选,先找到所有超键。
而判断属性集合是否为超键,还要先了解如何寻找属性集的闭包,如果闭包中包含所有属性,那么就是超键。闭包求解比较好理解,不再阐述。
当考虑一个属性的超码后,发现A和E是超码,那么因为候选码是最小属性集,所以A和E将不会出现在两个属性的候选码中,不再考虑。
同样方法,最终求得BC、CD是两个属性的超码。此时不再存在更大的候选码。
综上,候选码为A、E、BC、CD
假设有关系模式R(A,B,C,D,E),其函数依赖集F={A→BC,CD→E,B→D,E→A}
计算正则覆盖Fc。
- 正则覆盖中任何函数依赖都不包含无关属性。无关属性的定义很形象,例如AB->C,如果你认为此函数依赖中A是无关属性,也就是说有无A都可以推导出这个函数依赖,那么形式化可以写为(F-{AB->C}∪{B->C}),如果F逻辑蕴涵上述内容,那么就说明A是无关属性。
- 正则覆盖中函数依赖的左半部分是唯一的
以本题为例,阐述求解函数依赖的过程:
1.右侧化为单属性(阿姆斯特朗定理逆用)
2.去除左侧无关属性
3.去除冗余函数依赖
4.合并
综上,F的正则覆盖其实就是自己。
考虑如下关系模式R(A,B.C.D,E,F)上的函数依赖集F:
{A→BCD,BC→DE,B→D,D→A}
计算B的闭包。
求属性集合的闭包十分简单,直接写答案:
考虑如下关系模式R(A,B.C.D,E,F)上的函数依赖集F:
{A→BCD,BC→DE,B→D,D→A}
(使用Armstrong公理)证明AF是超码。
证明某个属性集合是超码,其实就是验证其闭包含有所有属性。而求闭包则应用到阿姆斯特朗定理
直接求AF的闭包即可:
{A,B,C,D,E,F}包含全部属性,所以是超码
考虑如下关系模式R(A,B.C.D,E,F)上的函数依赖集F:
{A→BCD,BC→DE,B→D,D→A}
计算上述函数依赖集F的正则覆盖;给出你的推导的步骤并解释。(直接写答案)
考虑如下关系模式R(A,B.C.D,E,F)上的函数依赖集F:
{A→BCD,BC→DE,B→D,D→A}
基于正则覆盖,给出R的一个3NF分解。
分解分为BCNF分解和3NF分解,本题讲述如何3NF分解。
如果要求解3NF分解,首先要求解函数依赖集的最小依赖,而最小依赖其实就是正则覆盖,所以即求解正则覆盖即可
求解正则覆盖后,观察所有函数依赖的左右两侧,如果出现有属性从未出现过,则单独分为一个子集。之后按照函数依赖,将一个函数依赖的左右两侧属性合并,并为一个子集。
其实就是3NF分解,但一般题型都要求无损连接性与保持函数依赖,所以还要有最后一步。
我们要在上一步求解出的3NF分解后添加候选码,候选码就是从两侧均未出现的元素和未出现在右侧的属性,最终合并得正确答案。
上述最后一步中,我们发现此时F属性从未出现过,而AF正好就是候选码,所以我们直接添加到最后,得到最终答案即可。
首先审题得知,要求给出无损链接并保持依赖的3NF分解,即最终要加入候选码。
第一步求出F的正则覆盖就是其本身。
第二步寻找是否存在N类属性。求解发现不存在,所以按照已有函数依赖左侧右侧并集划分为若干子集。{ABC},{CDE},{BD},{EA}
第三步,因为题目要求特殊,最终还要加入候选码。首先寻找有无L类属性或两侧均未出现属性,发现没有。则无需添加
综上,最终答案为{ABC},{CDE},{BD},{EA}
考虑如下关系模式R(A,B.C.D,E,F)上的函数依赖集F:
{A→BCD,BC→DE,B→D,D→A}
利用原始的函数依赖集,给出R的一个BCNF分解。
BCNF分解较为复杂,资料不太详细,暂时理解过程如下:
首先要知悉如何判断R满足BCNF与否。方法如下:
- 若R的函数依赖集合中存在某函数依赖左侧不存在候选码中的其一,则R不符合BCNF,需要进行分解
在进行第一次分解时,按照如下方式分解为R1和R2: - 若R中存在若干函数依赖不符合BCNF,则任选其一开始分解(此类题答案不唯一的原因)
- 如本题从A->BCD开始进行分解,则R1即为左右两侧属性的集合{A,B,C,D};R2集合则为R与选择函数依赖右侧属性集合的差集
- 在进行第一步分解后,就需要检验R1与R2此时是否符合BCNF,而检验是否符合BCNF的标准此时是,从R1和R2中各选择其属性子集,进行如下验证:若选取的子集的闭包不包含Ri与选取子集的差集中的任意属性或选取子集的闭包包含Ri的所有属性,则符合BCNF。若不符合BCNF,则需要进一步分解
- 若经过一次分解过后的R仍然不符合BCNF,则之后的分解方式如下:以R1中的属性子集{A}检验出不符合BCNF为例,求解A属性的闭包与R1的交集,将A属性与交集单独分解为一个子集。另外再将除A闭包以外的所有属性与A单独再分为一个子集。则完成了进一步分解,此时再重复上一步骤,判断分解结果是否都满足BCNF。直至满足为止
首先求解R的候选码,不难得出候选码为A、E、BC、CD。
第一步,从函数依赖集合中找一条不满足BCNF的函数依赖。F中只有B->D不满足。则选择该条函数依赖进行分解。将R分解为{B,D}与{ABCE}
第二步,判断R1与R2是否符合BCNF要求。{B,D}的属性子集为{B}&{D},分别求解闭包,得知第一子集满足包含R1所有属性,第二子集闭包满足只包含自身,均无问题。所以{BD}符合BCNF要求。求解R2的属性子集{A}{B}{C}{E}。第一和第四子集均符合包含R2所有属性,第二第三子集均符合闭包只含自身。所以也符合BCNF要求。综上所述最终R的BCNF分解即为{B,D}与{A,B,C,E}
无损分解的判定也十分简单,只需遵循以下内容即可:
- 首先需要求解函数依赖集的闭包,利用阿姆斯特朗定理
- 求解完毕后,只要R1∩R2->R1或R1∩R2->R2在闭包中,那么就是无损分解
- 其实还有更简单的方式,只要R1∩R2是R1或R2的超码,那么分解就是一个无损分解
上述题目中,R1∩R2={A},而A的闭包则正好是{A,B,C,D,E},满足是R1或R2的超码,所以是一个无损链接分解。
同样按照上述方式判断。R1∩R2={C},C的闭包为{C},所以并不能成为R1或R2的超码,即分解并不是无损分解