《数据库原理》部分习题解析
1. 课本pg196.第1题。
(1)函数依赖
若对关系模式 R(U) 的任何可能的关系 r,对于任意两个元组 t₁ 和 t₂,若 t₁[X] = t₂[X],则必须有 t₁[Y] = t₂[Y],则称属性集 Y 函数依赖于属性集 X,记作:
X → Y
函数依赖是数据库规范化的基础,用于描述属性间的约束关系。
(2)部分函数依赖
若某关系的主键是复合主键(例如 A 和 B),存在一个非主属性 C 满足 A → C,但 B 无影响,即 C 并不依赖整个主键,则称为部分函数依赖。
(3)完全函数依赖
若某非主属性 C 对整个主键 (A, B) 依赖,且不依赖其任何子集,即:
(A, B) → C 且 A ⊬ C,B ⊬ C
(4)传递依赖
若存在 A → B,且 B → C,则可推出 A → C,且 C 并不直接依赖于 A,称为传递函数依赖。
(5)候选码
候选码是能唯一标识关系中元组的最小属性集。一个关系可有多个候选码。
(6)超码
超码是能够唯一标识元组的属性集,可以包含冗余属性。候选码 ⊆ 超码。所有候选码都是超码,但不是所有超码都是候选码。
(7)主码
从候选码中选出的一个,用作关系的唯一标识。主码值不能为 NULL。在一个表中只能有一个主码。
(8)外码
指向其他表主码的属性,表示关系间的引用。
(9)全码
若关系中所有属性组合构成唯一标识元组的候选码(即没有非主属性),则称该关系为全码关系。
(10)第一范式(1NF)
每一个属性的值必须是不可再分的数据项(原子性),即不能有数组、集合、嵌套结构。
(11)第二范式(2NF)
在满足1NF的基础上,消除了非主属性对主键的部分函数依赖。
(12)第三范式(3NF)
在2NF基础上,消除了非主属性对主键的传递依赖。形式:若 A 是主键,B 是非主属性,A → B 成立;如果还存在 B → C,那么 C 不应为非主属性。
(13)BCNF
每一个非平凡函数依赖 X → Y 中,X 必须是候选码(或超码)。
(14)第四范式(4NF)
在BCNF基础上,消除了非平凡且非函数依赖的多值依赖。如:若 A →→ B,且 B 与其他属性无关,则存在多值依赖,应进行拆分。
2. 课本pg197.第2题。
(1) 学生信息关系模式
关系模式:Student (Sno, Sname, Birthdate, Dept, Classno, Dormitoryno)
最小依赖集:
1. Sno → Sname
2. Sno → Birthdate
3. Sno → Classno
4. Classno → Dept (每个班只属于一个系)
5. Dept → Dormitoryno
传递函数依赖:
Sno → Classno → Dept,Dept → Dormitoryno ⇒ Sno → Dormitoryno
候选码: Sno
外部码(外键): Dept → Dept 表;Classno → Class 表
全码: 无
(2) 班级信息关系模式
关系模式:Class (Classno, Major, Dept, Cnum, Cyear)
最小依赖集:
1. Classno → Major, Dept, Cnum, Cyear
2. (Dept, Major, Cyear) → Classno, Cnum (同一系‑专业当年只招一个班)
传递函数依赖: 无
候选码:
• Classno
• Dept, Major, Cyear
外部码(外键): Dept → Dept 表
全码: 无
(3) 系信息关系模式
关系模式:Dept (Dept, Deptno, DeptLoc, Deptnum)
最小依赖集(假设系名唯一):
1. Deptno → Dept, Deptnum
2. Dept → DeptLoc
传递函数依赖:
Deptno → Dept → DeptLoc ⇒ Deptno → DeptLoc
候选码: Deptno 和 Dept
外部码: 无
全码: 无
(4) 学会信息关系模式
关系模式:Union (Uname, Uyear, ULoc, Unum)
最小依赖集: Uname → Uyear, ULoc, Unum
传递函数依赖: 无
候选码: Uname
外部码: 无
全码: 无
(5) 学生‑学会关系模式
关系模式:StuUn (Sno, Uname, Uyear)
最小依赖集: (Sno, Uname) → Uyear
传递函数依赖: 无
完全函数依赖: (Sno, Uname) → Uyear (删除任一属性即失效)
候选码: Sno, Uname
外部码(外键): Sno → Student 表;Uname → Union 表
全码: 无
3. 课本pg197.第6题。
(1) BCNF 判定
已知 A 是候选码,且仅有函数依赖 BC → DE。
R 属于 BCNF 当且仅当 BC → A 成立(即 BC 的闭包等于全集 U)。
若 BC 不能决定 A,则 BC 不是超键,该依赖违反 BCNF。
(2) 若 F = { A → B ; BC → D ; DE → A }
候选码的闭包计算结果:
ACE → ABCDE
BCE → ABCDE
CDE → ABCDE
所有候选码: ACE, BCE, CDE
(3) 在同一 F 下的范式
由于右部属性 B、D、A 均为主属性(包含在某候选码中),每条 FD 均满足 3NF 的条件。但左部 A、BC、DE 皆不是超键,所以违反 BCNF。
所以R 满足 3NF,但不满足 BCNF。
4. 设属性集U={XYZW},函数依赖集F={X→Y,Y→Z,W→Y},计算属性集闭包X+,XW+和(YW)+。
1. X⁺(X 的闭包)
步骤 | 当前闭包 | 说明 |
① | { X } | 初始仅含 X |
② | { X , Y } | X → Y 加入 Y |
③ | { X , Y , Z } | Y → Z 加入 Z |
④ | — | 无更多依赖可用 |
X⁺ = { X , Y , Z }
2. (XW)⁺(XW 的闭包)
步骤 | 当前闭包 | 说明 |
① | { X , W } | 初始含 X, W |
② | { X , W , Y } | X → Y 加入 Y |
③ | { X , W , Y , Z } | Y → Z 加入 Z |
④ | — | 已含 W,W → Y 已满足;闭包 = U |
(XW)⁺ = { X , Y , Z , W } = U
3. (YW)⁺(YW 的闭包)
步骤 | 当前闭包 | 说明 |
① | { Y , W } | 初始含 Y, W |
② | { Y , W , Z } | Y → Z 加入 Z |
③ | — | 已含 Y,依赖 W → Y 不变;无法推出 X |
(YW)⁺ = { Y , Z , W }
5. 设有关系模式R(A, B, C, D, E)与它的函数依赖集F={A→BC, CD→E, B→D, E→A},计算属性集闭包A+,B+,E+, (AD)+,(BC)+,(CD)+,(BCD)+;说明这些属性是否为R的候选码。
属性集 | 闭包计算过程(按依赖逐步加入) | 结果 | 是否候选码¹ |
A | {A} ⭢ A→BC ⇒ {A B C} ⭢ B→D ⇒ {A B C D} ⭢ CD→E ⇒ {A B C D E} | A⁺ = ABCDE | 是 |
B | {B} ⭢ B→D ⇒ {B D} | B⁺ = BD | 否 |
E | {E} ⭢ E→A ⇒ {E A} ⭢ A→BC ⇒ {E A B C} ⭢ B→D ⇒ {E A B C D} | E⁺ = ABCDE | 是 |
A D | {A D} ⭢ A→BC ⇒ {A B C D} ⭢ CD→E ⇒ {A B C D E} | (AD)⁺ = ABCDE | 超键,非最小 |
B C | {B C} ⭢ B→D ⇒ {B C D} ⭢ CD→E ⇒ {B C D E} ⭢ E→A ⇒ {A B C D E} | (BC)⁺ = ABCDE | 是 |
C D | {C D} ⭢ CD→E ⇒ {C D E} ⭢ E→A ⇒ {A C D E} ⭢ A→BC ⇒ {A B C D E} | (CD)⁺ = ABCDE | 是 |
B C D | {B C D} ⭢ CD→E ⇒ {B C D E} ⭢ E→A ⇒ {A B C D E} | (BCD)⁺ = ABCDE | 超键,非最小 |
综上,候选码为:A E BC CD
6. 设有函数依赖集F={C→A, A→B, B→C, C→B, A→C, BC→A},求其最小函数依赖集Fmin。
原依赖集
F = { C→A ; A→B ; B→C ; C→B ; A→C ; BC→A }
最小化步骤
(1)右拆:原依赖右部均为单属性,无需拆分。
(2)左约:
对 BC→A: C⁺ (在当前集合) = ABC ⊇ A ⇒ B 冗余 → 删除整条(因为 C 单独已推出 A)。
(3)依赖约(逐条测试可推导性):
A→B:必留(若删则无法由其它依赖推 B)。
B→C:必留(若删则无法推 C)。
C→A:必留(删除则无法推 A)。
其余三条(C→B, A→C, BC→A)都已冗余,可由保留三条推得。
Fmin={C→A,A→B,B→C}
满足:
(1)每条右部单属性。
(2)每条左部无多余属性。
(3)集内任一依赖都无法由其余依赖推出。
7. 设有关系模式R(Sno, Dept, Loc),其中属性Sno、Dept和Loc分别表示学生学号、所在系别和系所在地点。函数依赖集有F={Sno→Dept, Dept→Loc},若R有两种分解方法,分别为ρ1= {R1(Sno, Dept), R2(Sno, Loc)};ρ2= {R1(Sno, Dept), R2(Dept, Loc)}。
(1)分别判别ρ1和ρ2是否有无损连接性。(用chase进行判别)
(a)ρ₁ = { R₁(Sno, Dept), R₂(Sno, Loc) }
行 / 列 | Sno | Dept | Loc |
R₁ | a₁ | a₂ | b₁ |
R₂ | a₁ | b₂ | a₃ |
1、Sno → Dept:两行 Sno 均为 a₁ ⇒ 统一 Dept → a₂
2、Dept → Loc:两行 Dept 均为 a₂ ⇒ 统一 Loc → a₃
行 / 列 | Sno | Dept | Loc |
R₁ | a₁ | a₂ | a₃ |
R₂ | a₁ | a₂ | a₃ |
结果:两行完全一致 → ρ₁ 无损连接。
(b)ρ₂ = { R₁(Sno, Dept), R₂(Dept, Loc) }
行 / 列 | Sno | Dept | Loc |
R₁ | a₁ | a₂ | b₁ |
R₂ | b₂ | a₂ | a₃ |
1、Dept → Loc:Dept 同为 a₂ ⇒ 统一 Loc → a₃
2、Sno → Dept 不再触发(Sno 值不同)
行 / 列 | Sno | Dept | Loc |
R₁ | a₁ | a₂ | a₃ |
R₂ | b₂ | a₂ | a₃ |
此时交集属性 {Dept} = a₂ 能决定 R₂ 的整行;满足无损条件 → ρ₂ 亦无损连接。
(2)分别判别ρ1和ρ2是否有保持函数性。
ρ₁:
投影 F 到 R₁:得到 Sno → Dept
投影 F 到 R₂:无非凡依赖
合并后缺少 Dept → Loc ⇒ 不保持函数性。
ρ₂:
投影到 R₁:Sno → Dept
投影到 R₂:Dept → Loc
合并恰为原 F ⇒ 保持全部依赖(保持函数性)。