6.1 解释函数依赖、完全函数依赖、部分函数依赖和传递函数依赖。
-
函数依赖:设 R(U)是属性集 U 上的关系模式,X 和 Y 是 U 的子集。对于 R(U)的任意关系的任意元组 t1, t2,如果
t1[Y]≠t2[Y]一定能够推出t1[X]≠t2[X](反过来讲,就是不存在 t1, t2,使得t1[X]=t2[X]而t1[Y]≠t2[Y])。则Y函数依赖于X,记作。 -
完全函数依赖:在中,如果,且Y不函数依赖于X的任意真子集。则Y完全函数依赖于X,记作。
-
部分函数依赖:在中,如果,且Y不完全函数依赖于X。则Y部分函数依赖于X,记作。
-
传递函数依赖:在中,如果,,并且,则称Z传递函数依赖于X,记作。
6.2 给出候选键三个不同的定义。
-
I. 对于指定的关系,具备区分每一个元组能力的的最小属性集。
-
II. 对于关系模式,如果,并且,则X是候选键。
-
III. 对于关系模式,如果,并且,则X是候选键。
6.3 解释范式,简述常用的范式及其之间的包含关系。
范式:满足系统规范要求的关系模式的集合。即:规范化的关系模式的集合。
常用范式:1NF、2NF、3NF、BCNF、4NF 和 5NF。
包含关系:。
6.4 解释关系模式规范化。简述关系模式的规范化过程。
关系模式规范化:利用关系规范化理论,对低级的关系模式进行分解和优化,从而消除冗 余的函数依赖,使其达到系统需要的更高的规范要求,并在一定程度上解决插入异常、修改异常、删除异常和数据冗余等问题的过程。
即:分解低级关系模式使其转换为高级关系模式的过程(范式分解)。
关系模式的规范化过程:
- 1NF → 确保数据表中各属性都是不可再分的最小数据项
- 2NF → 在1NF的基础上,消除非主属性对任意候选键的部分函数依赖
- 3NF → 在2NF的基础上,消除非主属性对任意候选键的传递函数依赖
- BCNF → 在3NF的基础上,消除各个主属性对不含其自身的其他各候选键的部分和传递函数依赖
6.5 解释范式分解。简述保连接分解和保依赖分解。
范式分解:分解低级范式,并转换为高级范式的过程。
保连接分解
将大表分解为若干个小表。如果将这些小表作自然连接后可以还原出原先的大表(既不能有信息丢失,又不能有错误的冗余信息产生),即,则该分解方案为保连接分解。
保依赖分解
将大表分解为若干个小表。如果分解后各小表的函数依赖关系求并集后仍然能够导出原先大表中的所有函数依赖关系(或者说求并集后与等价),即(也就是说)),则该分解方案为保依赖分解。
6.9 对于 R(U,F),U={A,B,C,D,E},F={AB→C,C→D,D→E},如下分解是否保连接? R {R1(A,B,C),R2(C,D),R3(D,E)}。
本题使用保连接判定算法进行判断
首先构造如下的状态表
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | a2 | a3 | b14 | b15 |
| R2 | b21 | b22 | a3 | a4 | b25 |
| R3 | b31 | b32 | b33 | a4 | a5 |
针对依赖关系,表中没有两行AB属性是一样的,不用更新。
针对依赖关系,更新状态表:
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | a2 | a3 | a4 | b15 |
| R2 | b21 | b22 | a3 | a4 | b25 |
| R3 | b31 | b32 | b33 | a4 | a5 |
针对依赖关系,更新状态表:
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | a2 | a3 | a4 | a5 |
| R2 | b21 | b22 | a3 | a4 | a5 |
| R3 | b31 | b32 | b33 | a4 | a5 |
于是状态表中第一行变为了全a符号,因此该分解是保连接的!
6.10 对于 R(U,F),U={A,B,C,D,E},F={A→C,B→C,C→D,DE→C,CE→A},判断: R {R1(A,D),R2(A,B),R3(B,E),R4(C,D,E),R5(A,E)}是否保连接?
首先构造如下的状态表
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | b12 | b13 | a4 | b15 |
| R2 | a1 | a2 | b23 | b24 | b25 |
| R3 | b31 | a2 | b33 | b34 | a5 |
| R4 | b41 | b42 | a3 | a4 | a5 |
| R5 | a1 | b52 | b53 | b54 | a5 |
针对依赖关系,更新状态表:
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | b12 | b13 | a4 | b15 |
| R2 | a1 | a2 | b13 | b24 | b25 |
| R3 | b31 | a2 | b33 | b34 | a5 |
| R4 | b41 | b42 | a3 | a4 | a5 |
| R5 | a1 | b52 | b13 | b54 | a5 |
针对依赖关系,更新状态表:
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | b12 | b13 | a4 | b15 |
| R2 | a1 | a2 | b13 | b24 | b25 |
| R3 | b31 | a2 | b13 | b34 | a5 |
| R4 | b41 | b42 | a3 | a4 | a5 |
| R5 | a1 | b52 | b13 | b54 | a5 |
针对依赖关系,更新状态表:
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | b12 | b13 | a4 | b15 |
| R2 | a1 | a2 | b13 | a4 | b25 |
| R3 | b31 | a2 | b13 | a4 | a5 |
| R4 | b41 | b42 | a3 | a4 | a5 |
| R5 | a1 | b52 | b13 | a4 | a5 |
针对依赖关系,更新状态表:
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | b12 | b13 | a4 | b15 |
| R2 | a1 | a2 | b13 | a4 | b25 |
| R3 | b31 | a2 | a3 | a4 | a5 |
| R4 | b41 | b42 | a3 | a4 | a5 |
| R5 | a1 | b52 | a3 | a4 | a5 |
针对依赖关系,更新状态表:
| 表名 | 属性A | 属性B | 属性C | 属性D | 属性E |
|---|---|---|---|---|---|
| R1 | a1 | b12 | b13 | a4 | b15 |
| R2 | a1 | a2 | b13 | a4 | b25 |
| R3 | a1 | a2 | a3 | a4 | a5 |
| R4 | a1 | b42 | a3 | a4 | a5 |
| R5 | a1 | b52 | a3 | a4 | a5 |
注意到表中第三行全部变成了a符号,因此该分解保连接!
6.12 对于R(U,F),U={A,B,C,D,E,P},F={A→B,AE→P, CD→A,CE→D, BC→D},则给出 R(U,F) 的一个保连接保依赖分解。
首先使用3NF保依赖分解算法。
-
创建初始为空的集合用于搜集分解后的小表
-
计算最小函数依赖集。此处显然
最小函数依赖集的要求:①函数依赖的右部均为单属性;②不含冗余函数依赖。即:不存在X→A,使得F≡F-{X→A};③函数依赖的左部均无冗余属性。即:不存在X→A,对于X的真子集Z,满足:F≡(F-{X→A})∪{Z→A}。
最小函数依赖集的计算和判定依赖Armstrong公理实现。
-
在本题中所有的属性都在函数关系中出现了,不用构造额外的小表来储存未在函数关系中出现的属性
-
确定主键为的小表,得到,并将其并入
-
同理可得主键分别为的小表并将它们也并入: 、 、 、
再检查的保连接性
我们知道,3NF分解保连接的条件为:至少存在一张小表的属性集,为原先大表的超键(即)。
如果保依赖算法分解出来的若干小表中不存在满足这一条件的,则需要再手动构造一张这样的表已保证分解的连接性。
因此一种简单的做法是我们先看看,已经通过保依赖算法分解出来的各小表中,有没有已经满足这个条件的小表,如果找到岂不就大功告成了。
注意到若取,则能够满足,即至少是原先大表的一个超键。因此,不需要再构造额外的含候选键全体属性的小表,来保证连接性。
本题的答案就是
当然我们也可以直接上手分析原大表的候选键是什么。
原先大表的函数依赖集为,显然该表候选键不可能只含一个属性,一定是一个复合候选键。
注意到在中,属性、无法被任何函数依赖推出,因此它们一定是候选键的一部分。
接下去我们又观察到,进一步利用可以得到、、,也就是说,因此即为原先大表的候选键!据此我们也能判断出是原先大表的一个超键。
6.13 对于R(U,F),U={A,B,C,D,E,G},F={B→A,B→D,C→G,C→BE,G→B,E→G}
(1)计算 R 的所有候选键。
除了利用上一题分享的分析候选键的思路,由于本题中依赖关系左侧都是单属性,我们可以直接画图来判断。
很容易看出只有可以成为候选键!
(2)计算 Fmin。
-
利用Armstrong公理的分解律,使函数依赖右端均为单个属性:
-
消除冗余的函数依赖:这一步操作直接通过看图观察比较容易:和是多余的,将这两条单向边(函数依赖)删去后,由仍然能推出和。
-
本题中函数依赖左端不含多个属性值,不需要考虑。
因此本题的答案为
(3)判断 R∈3NF?如果满足,则说明原因;否则进行 3NF 分解。
该表中显然存在关于候选键的传递依赖,不满足3NF。
保依赖保连接分解结果如下:
6.16 对于 R(U,F),U={A,B,C,D,E,G},F={AB→C,C→A,BC→D,ACD→B,D→EG,BE→C,CG→BD,CE→AG}。则:
(1)计算 AB 和 BD 的闭包。判断 AB 和 BD 是否为 R 的候选键?请说明原因。
求属性集闭包的算法和图论里的BFS算法有点像,也很简单,故此处不展示具体的过程。
最终结果为,因此、都为该表的候选键!
(2)判断 R 是否满足 3NF 和 BCNF?说明原因。
该表中存在非主属性部分依赖候选键的情况,例如由我们可以知道、,而只是候选键的一部分,不满足2NF。因此更不可能满足3NF和BCNF。
6.17 对于 R(U,F),U={A,B,C,D,E,G},F={AB→E,CD→G,B→D,C→A,D→B,G→AD}。则:
(1)计算 R 的所有候选键。计算 AB 的闭包。
利用候选键基于属性集闭包的第III定义,结合观察发现一定包括在候选键内、以及一定不包括在候选键内,很容易求出、、均为候选键。
由闭包的定义,
(2)判断 R∈3NF?如果满足,则说明原因;否则进行 3NF 分解。
不满足,表中存在非主属性对候选键的部份依赖,例如。
3NF保连接保依赖分解如下:
6.18 对于 R(U,F),U={A,B,C},F={A→B,B→C},判断如下三组分解的保连接性。
(1)R1(AB),R2(AC)
对于一张表拆成两张表的分解,原先大表的蕴含或者,是该分解是保连接的充分必要条件。
在本题中,,因此该分解保连接!
(2)R1(AB), R2(BC)
同理可得,该分解保连接!
(3)R1(AC), R2(BC)
同理可得,该分解不保连接!