数据库复习笔记---关系数据库设计

关系数据库设计之函数依赖

非规范化设计的问题:数据冗余,插入/删除/更新异常
函数依赖的概念
平凡函数依赖
函数依赖集
最小(正则)覆盖
函数依赖集的闭包
属性集的闭包
无损连接分解(lossless decomposition)
依赖保持分解(function depencency preserving)
BCNF的定义、判断、分解
3NF的定义、判断、分解

先看一道例题:
Consider the following set F of functional dependencies on the relation schema R(A,B,C,D):
A->C
C->A
B->AC
D->AC
(1)Compute (AD)+. (2 points)
(2)Compute a canonical cover for the above set of functional dependencies F; give each step of your derivation with an explanation. (2 points)
(3)List the candidate keys for R. (2 points)
(4)Give a decomposition of R with only one time of BCNF decomposition using the original set of functional dependencies. (3 points)
(5)Give a 3NF decomposition of R based on the canonical cover. (3points)


答案:
在这里插入图片描述

涉及到的知识点:

求候选码的步骤:

设有关系模式RU= {A,B,C} 为R的 属性集F为R上的函数依赖集(知道R,U,F分别代表什么)

  • ①只在F右部出现的属性,不属于候选码
  • ②只在F左部出现的属性,一定存在于某候选码当中
  • ③两边都没有出现的属性,一定存在于候选码中
  • ④其他属性逐个与②③的属性结合,求属性闭包 ,直至X的闭包等于U。若等于U,则X为候选码

1NF-原子性

判断无损连接分解

U1∩U2→U1-U2 ∈F+ 或U1∩U2→U2 -U1∈F+,则是无损连接分解

判断保持依赖分解

在这里插入图片描述
在这里插入图片描述

BCNF

判断条件:
在这里插入图片描述
BCNF分解:
a->b
①R1:a∪b
②R2:R-(b-a)
看该关系下的函数依赖,检查是否都属于BCNF,不属于的再继续分解,直到都属于BCNF。

3NF

判断条件:
在这里插入图片描述
三个条件任选,可见比BCNF更宽容。


3NF分解:(步骤)
一、正则覆盖:
即求最小依赖集:
1、判断无关属性->去掉冗余属性
无关属性的判断(又称冗余):
给定一个函数依赖集F:
若要判断的属性位于依赖的右侧,例如{AB→C,……},则删除该属性,在余下的函数依赖集F’中计算该依赖左部集合的闭包α+。若α+中包含要判断的属性,则该属性就是无关属性(冗余)


例2:F{A→BC,B→AC,C→AB}
关注B属性。它在依赖右侧。删除该属性,余下F’={A→C,B→AC,C→AB},计算左侧剩余属性集(A)的闭包(A)+。
因为A→C,C→AB,所以(A)+中包含删去的属性B
故B是无关属性

若要判断的属性位于依赖的左侧,例如{AB→C},则删除该属性,在原本的依赖集F中计算该依赖左部集合的闭包α+。若α+闭包中包含该依赖右侧所有的属性,则该属性则是无关属性


例3:函数依赖集F{Z→X,X→P,XY→WP,XYP→ZW}
关注到XYP中的P属性。它在左侧。删除它,求解左侧剩下属性集XY的闭包,求取域是原来的F{Z→X,X→P,XY→WP,XYP→ZW}。因为XY→WP,所以(XY)+ = XYWP;又因为XYP→ZW,所以(XY)+ = XYWPZ,包含依赖右侧ZW
故P是无关属性


2、求一个最小正则
一般用Fc表示。具有如下性质:
Fc中的任何函数依赖都不含有无关属性
如存在函数依赖AB->C,A->C,那么B在AB->C中是无关的。因为有没有B,A->C总成立。
Fc中函数依赖的左半部分是唯一的。
正则覆盖结果不唯一。

其中的一个方法:
把右部分化为单属性
去掉左部分的冗余属性 比如AB->C
假设A冗余,那么看是否B+包含C
假设B冗余,…
去掉冗余的函数依赖 如去掉A->B, 那么看是否可由其他依赖推出A->B
合并函数依赖
在这里插入图片描述


3、分解全程
口诀:
保函依赖分解题,先求最小依赖集。
依赖两侧未出现,分成子集放一边,剩余依赖变子集。
若要连接成无损,再添候选做子集。
下面通过例题讲解口诀:


例1.已知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}

现在再做开始的例题,自我检验一下。


一些参考:
选取候选码:https://blog.csdn.net/hhhhxxn/article/details/105798727
正则覆盖:https://blog.csdn.net/qq_43179428/article/details/105563296
关系模式分解教程:https://www.cnblogs.com/kungfupanda/p/12362163.html
另:er图转换关系模式:https://www.cnblogs.com/vvlj/p/12750853.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值