数据库期末考试预习之候选码,最小函数依赖集,3NF分解算法,判断第几范式

一、候选码

参考链接:1

1.定义:
候选码(超级码)就是可以被选为主码的属性或属性组。当一个关系有N个属性或属性组可以唯一标识时,则说明该关系有N个候选码,可以选定其中一个作为主码。

候选码定义: 设K为关系模式R<U, F>的属性(组),若K→FU,则称K为R的 候选码。
主码:若R<U , F>有多个候选码,则可以从中选定一个作为R的主码。
主属性:包含在任一个候选码中的属性,称作主属性。
非主属性:不包含在任一个候选码中的属性,称作非主属性(或非码属性)。
全码:关系模式的码由全部属性构成。

例:
求出关系模式R<U, F>的所有候选码:
U={ A , B , C , D , E }
F={AB→C, B→D, C→E, EC→B, AC→B }

解: 验证AB是否码, 须证明 AB→FABCDE是否成立?
∵AB→C(已知), 而AB→AB(自反), ∴AB → ABC(合并)
∵B→D(已知), ∴AB→AD(增广), ∴AB → ABCD(合并)
∵C→E(已知), AB→C(已知), ∴AB → E(传递)
于是 AB → ABCDE(合并)

同理可证:AC也是一个候选码

2.方法:
讲解视频;候选码

设关系模式R<U, F>
将R的所有属性分为 L、 R、N和 LR四类,并令X代表L、N两类,Y代表LR类。
L类: 仅出现在F的函数依赖左部的属性;
R类: 仅出现在F的函数依赖右部的属性;
N类: 在F的函数依赖左右两边都不出现的属性;
LR类:在F的函数依赖左右两边都出现的属性 。
求属性集闭包X+,若 X+包含了R的全部属性则X即为R的唯一候选码, 转5;
否则, 在Y中取一属性A,求属性集闭包(XA)+,若(XA)+包含了R的全部属性,则转4;否则,调换一属性反复进行这一过程,直到试完所有Y中的属性。
如果已找出了所有的候选码,则转(5);否则在Y中依次取2个、3个、…属性,求X与它们的属性集闭包,直到其闭包包含R的全部属性。
停止,输出结果。

例1: 设关系模式R(A, B, C, D), 其函数依赖集:
F={D→B, B→D, AD→B, AC→D},求R的所有候选码。
解: L类: A, C
R类:
N类:
LR类: B, D
因为(AC)F+=ACDB,所以AC是R的唯一候选码

**例2:**设关系模式R(A, B, C, D, E, P), 其函数依赖集:
F={A→D, E→D, D→B, BC→D, DC→A},求R的所有候选码。
解: L类: C, E
R类:
N类: P
LR类: A, B, D
因为(CEP)F+=CEPDBA,所以CEP是R的唯一候选码。

例3: 设关系模式R(S, D, I, B, O, Q), 其函数依赖集:
F = { S→D, I→B, B→O, O→Q, Q→I },求R的所有候选码。
解: L类(S); R类(D) ; N类(无) ; LR类(I, B, O, Q)
因为S+=SD, 所以S不是R的候选码;
因为(SI)+=SIDBOQ,所以SI是一个候选码;
因为(SB)+=SBDOQI,所以SB也是一个候选码;
因为(SO)+=SODQIB,所以SO也是一个候选码;
因为(SQ)+=SQDIBO,所以SQ也是一个候选码。

二、最小函数依赖集

视频讲解:最小函数依赖集
参考链接:2
参考链接:3

1.定义:
如果函数依赖集F满足以下三个条件,则称F为最小函数依赖集,记作Fm。
①F中每个函数依赖的右部都是单属性,即右部最简化。
②对于F中任一函数依赖X -> A 和X的真子集X’,(F - (X - A)) ∪ (X’ -> A)
与F都不等价,即左部无多余属性。
③对于F中任一函数依赖X -> A,F - {X -> A}与F都不等价,即无多余函数依赖。

2.方法:
输入:一个函数依赖集F。
输出:F的一个等价的最小函数依赖集Fm。
步骤:
(1)用分解规则,使F中的每个函数依赖的右部仅含单属性。此步为等价分解。
(2)去掉多余的函数依赖。逐一检查上步结果F的各函数依赖X -> A,并将X -> A从F中去掉,然后在剩下的F中去求X+,若A包含于X+,则X -> A多余。依次做下去,直到找不到冗余的函数依赖。此步为等价消依赖。
(3)去掉各依赖左部多余的属性。一个一个地检查左部非单个属性地函数依赖。即XY -> A ,判断Y是否多余,则在分解后地F求X的属性闭包X+,若A包含于X+ ,则Y是多余的。此步为等价消属性。

口诀:
右侧先拆单,依赖依次删。
还原即可删,再拆左非单。

例:
U=(A,B,C,D,E,G) F={BG->C,BD->E,DG->C,ADG->BC,AG->B,B->D},求F最小依赖集。

解:

第一步:右边单一化。

F1={BG->C,BD->E,DG->C,ADG->B,ADG->C,AG->B,B->D}

第二步:逐个求,在去掉它的F中求闭包,如果包含右边属性,则表示这个函数依赖要去掉。

BG->C:求(BG)+=BCDEG,包含右边属性C,所以去掉。

BD->E:(BD)+=BD,不包含右边E,所以不用去掉。

DG->C:(DG)+=DG,也不用去掉。

ADG->B:(ADG)+=U,包含B,所以去掉。

ADG->C:(ADG)+包含C,去掉。(在这里,求闭包的时候,不能再用前面去掉的函数依赖了,所以如果从后往前判断,可能不用去掉ADG->B,所以最小依赖集不唯一,写出一个即可。)

AG->B:(AG)+=AG,不用去掉。

B->D:(B)+=B,不用去掉。

所以F2={BD->E,DG->C,AG->B,B->D}

第三步:对左边属性单一化,判断冗余,代替。

BD->E:B->E,求(B)+=BD,包含D,所以D冗余。
D->E,求(D)+=D,所以B不冗余。
所以用B->E代替BD->E。

DG->C:D->C,(D)+=D,所以G不冗余。
G->C,(G)+=G,所以D不冗余。

AG->B:A->B,(A)+=A,所以G不冗余。
G->B,(G)+=G,所以A不冗余。

所以Fm={B->E,DG->C,AG->B,B->D}。

三、3NF分解算法

1.定义:
第三范式(3NF):第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

2.方法
参考链接:4

步骤:
(1)找出F的一个最小基本集,记为G。
(2)对于G中的每一个FD X→A,将XA作为分解出的某个关系的模式。
(3)如果第2步分解出的关系的模式均不包含R的超键,则增加一个关系,其模式为R的任何一个键。

口诀:
保函依赖分解题,先求最小依赖集。

依赖两侧未出现,分成子集放一边,剩余依赖变子集。

若要连接成无损,再添候选做子集。

例:
已知R(ABCDE), F={A ->D,E->D,D->B,BC->D,DC->A}求保持函数依赖的3NF分解,和具有无损连接性及保持函数依赖的3NF分解

第一步:保函依赖分解题,先求最小依赖集。
先求出R的最小依赖集,可得F={A ->D,E->D,D->B,BC->D,DC->A}

第二步:依赖两侧未出现,分成子集放一边。
首先可以发现没有不出现在两侧的元素不用单独分出一个子集。
“剩余依赖变子集”然后我们将各依赖分别划分为子集得到:{AD} {ED} {DB} {BCD} {DCA},
即为所求保持函数依赖的3NF分解

第三步:若要连接成无损,再添候选做子集。
(1)候选码的求解:所谓候选码即能决定整个关系的,我们通过找未出现在依赖右边的和两侧均未出现的元素即可求得,
(2)可以发现C E未出现在右边,因此候选码为{CE}。故所求具有无损连接性及保持函数依赖的3NF分解为{AD} {ED} {DB} {BCD} {DCA} {CE}

四、判断属于第几范式

讲解视频:第几范式

1NF是指数据库表的每一列都是不可分割的基本数据项,即实体中的某个属性不能有多个值或者不能有重复的属性。

2NF要求属性完全依赖于主键,不能存在仅依赖主关键字一部分的属性。

3NF要求每一个非主属性既不部分依赖于码也不传递依赖于码。

BCNF消除了主属性对候选码的部分和传递函数依赖。

  • 22
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值