【专业课学习】《数据库原理》第六章习题

306 阅读10分钟

112919338_p0.jpg

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,记作XYX \rightarrow Y

  • 完全函数依赖:在R(U,F)R(U, F)中,如果XYX\rightarrow Y,且Y不函数依赖于X的任意真子集。则Y完全函数依赖于X,记作XFullYX \xrightarrow{Full} Y

  • 部分函数依赖:在R(U,F)R(U, F)中,如果XYX\rightarrow Y,且Y不完全函数依赖于X。则Y部分函数依赖于X,记作XPYX \xrightarrow{P} Y

  • 传递函数依赖:在R(U,F)R(U, F)中,如果XYX \rightarrow YYZY \rightarrow Z,并且YXY\nrightarrow X,则称Z传递函数依赖于X,记作XTZX \xrightarrow{T} Z

6.2 给出候选键三个不同的定义。

  • I. 对于指定的关系,具备区分每一个元组能力的的最小属性集。

  • II. 对于关系模式R(U,F)R(U, F),如果XUX \subseteq U,并且XFullUX \xrightarrow{Full} U,则X是候选键。

  • III. 对于关系模式R(U,F)R(U, F),如果XUX \subseteq U,并且XF+=UX_{F}^{+} = U,则X是候选键。

6.3 解释范式,简述常用的范式及其之间的包含关系。

范式:满足系统规范要求的关系模式的集合。即:规范化的关系模式的集合。

常用范式:1NF、2NF、3NF、BCNF、4NF 和 5NF。

包含关系:1NF2NF3NFBCNF4NF5NF1NF \supset 2NF \supset 3NF \supset BCNF \supset 4NF \supset 5NF

6.4 解释关系模式规范化。简述关系模式的规范化过程。

关系模式规范化:利用关系规范化理论,对低级的关系模式进行分解和优化,从而消除冗 余的函数依赖,使其达到系统需要的更高的规范要求,并在一定程度上解决插入异常、修改异常、删除异常和数据冗余等问题的过程。

即:分解低级关系模式使其转换为高级关系模式的过程(范式分解)。

关系模式的规范化过程:

  • 1NF → 确保数据表中各属性都是不可再分的最小数据项
  • 2NF → 在1NF的基础上,消除非主属性对任意候选键的部分函数依赖
  • 3NF → 在2NF的基础上,消除非主属性对任意候选键的传递函数依赖
  • BCNF → 在3NF的基础上,消除各个主属性对不含其自身的其他各候选键的部分和传递函数依赖

6.5 解释范式分解。简述保连接分解和保依赖分解。

范式分解:分解低级范式,并转换为高级范式的过程。

保连接分解

将大表R(U,F)R(U, F)分解为若干个小表R1(U1,F1),R2(U2,F2),...,Rn(Un,Fn)R_{1}(U_{1}, F_{1}), R_{2}(U_{2}, F_{2}), ... , R_{n}(U_{n}, F_{n})。如果将这些小表作自然连接后可以还原出原先的大表(既不能有信息丢失,又不能有错误的冗余信息产生),即R=i=1nRiR = \overset{n}{\underset{i=1}{ \bowtie }} R_{i} ,则该分解方案为保连接分解。

保依赖分解

将大表R(U,F)R(U, F)分解为若干个小表R1(U1,F1),R2(U2,F2),...,Rn(Un,Fn)R_{1}(U_{1}, F_{1}), R_{2}(U_{2}, F_{2}), ... , R_{n}(U_{n}, F_{n})。如果分解后各小表的函数依赖关系FiF_{i}求并集后仍然能够导出原先大表中的所有函数依赖关系FF(或者说求并集后与FF等价),即F+=(i=1nFi)+F^{+}=(\overset{n}{\underset{i=1}{\cup}} F_{i})^{+}(也就是说F(i=1nFiF \equiv (\overset{n}{\underset{i=1}{\cup}} F_{i})),则该分解方案为保依赖分解。

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
R1a1a2a3b14b15
R2b21b22a3a4b25
R3b31b32b33a4a5

针对依赖关系ABCAB \rightarrow C,表中没有两行AB属性是一样的,不用更新。

针对依赖关系CDC \rightarrow D,更新状态表:

表名属性A属性B属性C属性D属性E
R1a1a2a3a4b15
R2b21b22a3a4b25
R3b31b32b33a4a5

针对依赖关系DED \rightarrow E,更新状态表:

表名属性A属性B属性C属性D属性E
R1a1a2a3a4a5
R2b21b22a3a4a5
R3b31b32b33a4a5

于是状态表中第一行变为了全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
R1a1b12b13a4b15
R2a1a2b23b24b25
R3b31a2b33b34a5
R4b41b42a3a4a5
R5a1b52b53b54a5

针对依赖关系ACA \rightarrow C,更新状态表:

表名属性A属性B属性C属性D属性E
R1a1b12b13a4b15
R2a1a2b13b24b25
R3b31a2b33b34a5
R4b41b42a3a4a5
R5a1b52b13b54a5

针对依赖关系BCB \rightarrow C,更新状态表:

表名属性A属性B属性C属性D属性E
R1a1b12b13a4b15
R2a1a2b13b24b25
R3b31a2b13b34a5
R4b41b42a3a4a5
R5a1b52b13b54a5

针对依赖关系CDC \rightarrow D,更新状态表:

表名属性A属性B属性C属性D属性E
R1a1b12b13a4b15
R2a1a2b13a4b25
R3b31a2b13a4a5
R4b41b42a3a4a5
R5a1b52b13a4a5

针对依赖关系DECDE \rightarrow C,更新状态表:

表名属性A属性B属性C属性D属性E
R1a1b12b13a4b15
R2a1a2b13a4b25
R3b31a2a3a4a5
R4b41b42a3a4a5
R5a1b52a3a4a5

针对依赖关系CEACE \rightarrow A,更新状态表:

表名属性A属性B属性C属性D属性E
R1a1b12b13a4b15
R2a1a2b13a4b25
R3a1a2a3a4a5
R4a1b42a3a4a5
R5a1b52a3a4a5

注意到表中第三行全部变成了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保依赖分解算法。
  1. 创建初始为空的集合AnsAns用于搜集分解后的小表

  2. 计算最小函数依赖集。此处显然Fmin=F={AB,AEP,CDA,CED,BCD}F_{min} = F = \{A→B, AE→P, CD→A,CE→D, BC→D\}

最小函数依赖集的要求:①函数依赖的右部均为单属性;②不含冗余函数依赖。即:不存在X→A,使得F≡F-{X→A};③函数依赖的左部均无冗余属性。即:不存在X→A,对于X的真子集Z,满足:F≡(F-{X→A})∪{Z→A}。

最小函数依赖集的计算和判定依赖Armstrong公理实现。

  1. 在本题中所有的属性都在函数关系中出现了,不用构造额外的小表来储存未在函数关系中出现的属性

  2. 确定主键为AA的小表,得到R1({A,B},AB)R_{1}(\{A, B\}, {A \rightarrow B}),并将其并入AnsAns

  3. 同理可得主键分别为AECDCEBCAE、CD、CE、BC的小表并将它们也并入AnsAnsR2({A,E,P},AEP)R_{2}(\{A, E, P\}, {AE \rightarrow P})R3({A,C,D},CDA)R_{3}(\{A, C, D\}, {CD \rightarrow A})R4({C,D,E},CED)R_{4}(\{C, D, E\}, {CE \rightarrow D})R5({B,C,D},BCD)R_{5}(\{B, C, D\}, {BC \rightarrow D})

再检查RR的保连接性

我们知道,3NF分解保连接的条件为:至少存在一张小表RiR_{i}的属性集,为原先大表R(U,F)R(U, F)的超键(即CandidateKeysUiCandidateKeys \subseteq U_{i})。

如果保依赖算法分解出来的若干小表中不存在满足这一条件的,则需要再手动构造一张这样的表已保证分解的连接性。

因此一种简单的做法是我们先看看,已经通过保依赖算法分解出来的各小表中,有没有已经满足这个条件的小表,如果找到岂不就大功告成了。

注意到若取X=U4={C,D,E}X = U_{4}=\{C, D, E\},则能够满足XF+=UX_{F}^{+}=U,即U4U_4至少是原先大表R(U,F)R(U, F)的一个超键。因此,不需要再构造额外的含候选键全体属性的小表,来保证连接性。

本题的答案就是R={R1,R2,R3,R4,R5}R = \{R_{1}, R_{2}, R_{3}, R_{4}, R_{5}\}

当然我们也可以直接上手分析原大表的候选键是什么。

原先大表的函数依赖集为F={AB,AEP,CDA,CED,BCD}F=\{A→B,AE→P, CD→A,CE→D, BC→D\},显然该表候选键不可能只含一个属性,一定是一个复合候选键。

注意到在FF中,属性EECC无法被任何函数依赖推出,因此它们一定是候选键的一部分。

接下去我们又观察到CEDCE \rightarrow D,进一步利用DD可以得到CDACD \rightarrow AABA \rightarrow BAEPAE \rightarrow P,也就是说(CE)F+={A,B,C,D,E,P}=U(CE)_{F}^{+} = \{A, B, C, D, E, P\} = U,因此CECE即为原先大表的候选键!据此我们也能判断出U4U_4是原先大表R(U,F)R(U, F)的一个超键。

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 的所有候选键。

除了利用上一题分享的分析候选键的思路,由于本题中依赖关系左侧都是单属性,我们可以直接画图来判断。

微信图片_20231119175244.jpg

很容易看出只有CC可以成为候选键!

(2)计算 Fmin。
  1. 利用Armstrong公理的分解律,使函数依赖右端均为单个属性:CBECB,CEC \rightarrow BE \Rightarrow C \rightarrow B, C \rightarrow E

  2. 消除冗余的函数依赖:这一步操作直接通过看图观察比较容易:CBC \rightarrow BCGC \rightarrow G是多余的,将这两条单向边(函数依赖)删去后,由CC仍然能推出BBGG

  3. 本题中函数依赖左端不含多个属性值,不需要考虑。

因此本题的答案为Fmin=BA,BD,CE,GB,EGF_{min}={B \rightarrow A, B \rightarrow D, C \rightarrow E, G \rightarrow B, E \rightarrow G}

(3)判断 R∈3NF?如果满足,则说明原因;否则进行 3NF 分解。

该表中显然存在关于候选键的传递依赖,不满足3NF。

保依赖保连接分解结果如下:

R1({A,B,D},{BA,BD})R_{1}(\{A, B, D\}, \{B→A, B→D\})

R2({C,E},{CE})R_{2}(\{C, E\}, \{C→E\})

R3({B,G},{GB})R_{3}(\{B, G\}, \{G→B\})

R4({E,G},{EG})R_{4}(\{E, G\}, \{E→G\})

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算法有点像,也很简单,故此处不展示具体的过程。

最终结果为(AB)F+=(BD)F+={A,B,C,D,E,G}=U(AB)_{F}^{+}=(BD)_{F}^{+}=\{A, B, C, D, E, G\}=U,因此ABABBDBD都为该表的候选键!

(2)判断 R 是否满足 3NF 和 BCNF?说明原因。

该表中存在非主属性部分依赖候选键的情况,例如由DEGD→EG我们可以知道DED→EDGD→G,而DD只是候选键的一部分,不满足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定义,结合观察发现CC一定包括在候选键内、AA以及EE一定不包括在候选键内,很容易求出CBCBCDCDCGCG均为候选键

由闭包的定义,(AB)F+={A,B,D,E}(AB)_{F}^{+}=\{A, B, D, E\}

(2)判断 R∈3NF?如果满足,则说明原因;否则进行 3NF 分解。

不满足,表中存在非主属性对候选键的部份依赖,例如CAC \rightarrow A

3NF保连接保依赖分解如下:

R1({A,B,E},{ABE})R_{1}(\{A, B, E\}, \{AB→E\})

R2({C,D,G},{CDG})R_{2}(\{C, D, G\}, \{CD→G\})

R3({B,D},{BD,DB})R_{3}(\{B, D\}, \{B→D, D→B\})

R4({A,C},{CA})R_{4}(\{A, C\}, \{C→A\})

R5({A,D,G},{GA,GD})R_{5}(\{A, D, G\}, \{G→A, G→D\})

6.18 对于 R(U,F),U={A,B,C},F={A→B,B→C},判断如下三组分解的保连接性。

(1)R1(AB),R2(AC)

对于一张表拆成两张表的分解,原先大表的FF蕴含R1R2R1R2R_{1} ∩ R_{2} → R_{1} - R_{2}或者R1R2R2R1R_{1} ∩ R_{2} → R_{2} - R_{1},是该分解是保连接的充分必要条件

在本题中,((R1R2=A)(R1R2=B))F((R_{1} ∩ R_{2} = A) → (R_{1} - R_{2} = B)) ∈ F,因此该分解保连接!

(2)R1(AB), R2(BC)

同理可得,该分解保连接!

(3)R1(AC), R2(BC)

同理可得,该分解不保连接!