[数据库系统概论]数据库闭包、候选码关系模式相关知识点

此文章为转载

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LX__Mr/article/details/105470941
————————————————
版权声明:本文为CSDN博主「__cherish」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LX__Mr/article/details/105470941

前言

在准备研究生复试的过程中,数据库中的关系模式里面有几个问题比较容易混淆。
一个是最小依赖函数集,一个是求候选码,一个是求闭包,一个是要把关系模式分解成3NF且保持函数依赖,一个是分解成3NF且保持函数依赖和无损连接。

记录一下我对这几个问题的求法。可能会有哪里有漏洞,希望可以指出来。

求闭包

什么叫闭包?
闭包就是由一个属性直接或者间接推出的所有属性的集合。
例如:a→b,b→c;那么a的闭包就是{a,b,c};

例子:设有关系模式R(A,B,C,D),F是R上的FD集,F={AB→C, C→D, E→A, D→B},求属性集AB的闭包;

解:
要求AB的闭包,首选我们可以设AB的闭包为X={A,B};
要找到AB的闭包,那么就是在X的基础上,只要是X的子集能直接或者间接推出的属性,就把它给加到X里面,然后再在这个新的X基础上,再继续查找是否有属性能被X的子集推出,有的话添加进去X里面,没有则结束。

由于AB→C,那么就把C加到X中,C又可以推出D,则把D也加到X中,D可以推出B,但是B已经在X里面了,继续检查,已经检查完毕,所以AB的闭包就是{A,B,C,D};

求候选码

候选码的定义:能唯一地标识一个元组的属性组的值,就称为候选键,也就是不含有多余属性的超键。(即候选键的子集就不能唯一地标识元组了)

设关系模式有N个属性,全集U中属性在FD集中有四种情况:
①只出现在F左边
②只出现在F右边
③在F的左右均出现
④不出现在F中

notes:
、只出现在F右边的属性,肯定不属于候选键;
、只出现在F左边的属性,一定存在于某个候选码里面,如果它的闭包是U,那么它一定是候选码;
、出现在F左右两边的属性,如果它的闭包是U,那么它一定是候选码,如果闭包不是U,那么再让其与另外一个同样出现在F左右两边的属性结合,再求闭包;
、 不出现在F中的属性,直接添加到候选码当中;

例子:设有关系模式R(A,B,C,D,E),F={A→CD,BC→E,D→B,E→A}为R上的函数依赖集,试求R上的所有候选码;

解:
首先观察函数依赖集F,对其中的属性进行分组,
只出现在F左边:无
只出现在F右边:无
出现在F左右两边:A,B,C,D,E
不出现在F中:无

对属性进行了分类之后,这个例子里面的属性均出现在F左右两边,那么就要先对每个属性求闭包;(根据上面求闭包的方法
A的闭包:{A,B,C,D,E};因为闭包是U,所以属性A是候选码;
B的闭包:{B};
C的闭包:{C};
D的闭包:{D,B};
E的闭包:{A,B,C,D,E};因为闭包是U,所以E是候选码;

对剩下的三个属性B,C,D继续组合求闭包;
(这里注意为什么不用再考虑A和E属性,这里需要注意候选码的定义:候选码是不能有多余属性的超键,候选码的子集是不能够唯一标识元组的,否则我们把A和E考虑进去,求出来的就是超键而不是候选键)

对B和C组合,求BC的闭包:{A,B,C,D,E},闭包是U,所以是候选码;
对B和D组合,求BD的闭包:{B,D},不是候选码;
对C和D组合,求CD的闭包:{A,B,C,D,E},闭包是U,是候选码;

到了这里就已经结束了;
所以R上的所有候选码是(E),(A),(B,C),(C,D);

补充:如果R上还有一个属性G没有出现在函数依赖集F中,也就是属性G是上面所说的第四种情况,那就把属性G添加到候选码当中。

求候选码其实就是求闭包;

最小函数依赖集

最小函数依赖集,通俗的说,其实就是**不含有冗余属性和冗余依赖关系,且F的依赖关系中的右边全部都是单一属性;**

求最小函数依赖集的**步骤**:
1、将F中的所有依赖右边化为单一元素;
2、去掉F中的所有依赖左边的冗余属性;
3、去掉F中所有冗余依赖关系;

例子:F={ABD→E,AB→G,B→F,C→J,CJ→I,G→H};求最小函数依赖集;

解:
将F中的所有依赖右边化为单一元素;这里已经满足了;
(举个例子,如果有A→CD,就拆开成A→C,A→D);

去掉F中的所有依赖左边的冗余属性
(对于依赖左边有多个属性的,去掉其中一个,看是否还能使依赖关系成立,如果成立,那么去掉的这个属性是冗余的,否则就不是冗余的)

ABD→E,假如去掉A,求出BD的闭包,不包含E,所以属性A不冗余,不能去掉A,同理,如果去掉B或者D,AD和AB的闭包都不包含E,所以都不冗余;

同理,AB→G,A和B都不冗余;
B→F,C→J,G→H这三个的依赖左边都只有单个属性,所以跳过不考虑;

剩下最后一个CJ→I,这里如果去掉C,J的闭包是不包含有I的,所以C不冗余,但是如果去掉J,因为C→J,所以J是冗余的,所以这里去掉冗余属性J;

所以整理后,F={ABD→E,AB→G,B→F,C→J,C→I,G→H};

去掉F中所有冗余依赖关系
(这里是从F中去掉某个依赖关系,例如去掉了X→Y,从剩下的依赖关系中,求X的闭包,若闭包中包含了Y,那么X就是冗余的,需要去掉);

如果去掉ABD→E,F就剩下了F={AB→G,B→F,C→J,C→I,G→H};
这里我们求ABD的闭包,闭包是{A,B,D,G,H,F},不包含E,所以ABD不冗余,不可去掉;

同理,如果去掉AB→G,AB的闭包是{A,B,F},不包含G,所以不冗余,不能去掉;

同理,B→F,C→J,C→I,G→H都不是冗余的,不能去掉;

所以最小函数依赖集F={ABD→E,AB→G,B→F,C→J,C→I,G→H};

题目参考:最小函数依赖集百度百科

分解成3NF且保持函数依赖

参考了书本上的模式分解的算法,对于分解成3NF保持函数依赖的分解,书本上用的是合成法。

思路:
①对函数依赖集F进行极小化处理,即把F变为最小依赖函数集F’;
②对所有不出现在F’中的属性记为U0,把这些属性从U中去掉,剩余的属性仍然记为U;
③对F‘按照具有相同左部的原则分组,对于每一组的并集,如果可以组合成U,那么3NF的分解完成。

这里参考了JensLee的博客;
这位博主在中间加了两个步骤:
①如果求得的函数最小依赖集左部都是单属性,则已经完成对关系模式的3NF分解,结束。
②去掉多余的函数传递依赖;

例子:关系模式R<U,F>,有U={A,B,C,D,E,S,G},F={B→G,CE→B,C→A,CE→G,B→D,C→D};将关系模式分解为3NF且保持函数依赖;

解:
首先求出最小函数依赖集, 根据前面给出的例子,这里过程就不再赘述;
求出最小函数依赖集F={B→G,CE→B,C→A,B→D,C→D};

这里F中没有出现属性S,所以把它从U中去掉,新的U是{A,B,C,D,E,G};

然后将F按照左部 相同的原则进行组合,就变成了(BGD),(CEB),(CAD);
(这里检查一下,把三个组并起来,能重新组合成U,所以分组没问题)

这里就可以下结论,已经完成了3NF的分解,且 保持函数依赖;
结果为:(BGD),(CEB),(CAD);

分解成3NF且保持函数依赖和无损连接

这里的情况和分解成3NF并保持函数依赖挺像的,但是多了一个约束条件:要保持无损连接

参考了书本上的算法和high-functioning的博客;

下面给出分解的方法步骤:
①先求出保持函数依赖的3NF分解;
②求出关系模式的候选码;
③对保持函数依赖的分解结果和候选码作并集∪,令τ= ρ ∪{R(X)};
④若存在X⊆Ui,则将R(X)从τ中去掉;若存在Ui⊆X,则将R(Ui)从τ中去掉;

例子:(还是选用上例进行分析)
关系模式R<U,F>,有U={A,B,C,D,E,S,G},F={B→G,CE→B,C→A,CE→G,B→D,C→D};将关系模式分解为3NF且保持函数依赖和无损连接;

解:

上面已经求出了保持函数依赖的3NF分解,结果为(BGD),(CEB),(CAD);

求关系模式的候选码,这里求出的候选码为:{SCE};(过程不再赘述)

对候选码和分解结果作∪,τ={R1(BGD),R2(CEB),R3(CAD),Rx(SCE)};

由于Ui和X之间没有包含关系,所以 答案即为所求。

结果为:τ={R1(BGD),R2(CEB),R3(CAD),Rx(SCE)};
(结果为保持了函数依赖和无损连接的3NF分解)

  • 10
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值