Lecture Notes: Database Management Systems
COMP3013 Database Management Systems
Dr. Zhiyuan Li
数据库规范化与 BCNF
Intro
1. 什么是规范化?
- 目标:
- 减少数据库中的数据冗余(Redundancy)。
- 消除插入、删除和更新异常(Anomalies)。
- 方法:
- 将关系模式分解为符合一定范式的子关系模式。
- 常见的范式包括:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BCNF(Boyce-Codd Normal Form)
2. 规范化的核心原则
- 无损分解(Lossless Decomposition):
- 分解后的子关系模式可以通过自然连接(Natural Join)无损恢复到原始关系模式。
- 依赖保留(Dependency Preservation):
- 分解后仍然可以在子关系模式中检查所有函数依赖(Functional Dependencies)。
Lecture 09: Functional Dependencies
1. 什么是函数依赖 (Functional Dependency, FD)?
- 定义:
- 在关系模式 $R$ 中,如果属性集合 $\alpha$ 的值唯一确定属性集合 $\beta$ 的值,那么 $\alpha \to \beta$ 是一个函数依赖。
- 公式:$\alpha \to \beta$
- 含义:$\alpha$ 的值唯一决定 $\beta$ 的值。
- 例子:
- 学生表(Student):
Student_ID → Student_Name
表示学号唯一决定姓名。 - 在关系 $r(A, B)$ 中,如果 $A → B$ 成立,则关系中的每个 $A$ 值对应唯一的 $B$ 值。
- 学生表(Student):
2. 平凡依赖 (Trivial Dependency)
- 定义:
- 如果 $\beta \subseteq \alpha$,则 $\alpha → \beta$ 是平凡依赖。
- 平凡依赖总是成立,无论关系中的数据如何。
- 例子:
- $Course_{Code} → Course_{Code}$
- $Student_{ID}, Course → Student_{ID}$
3. 闭包 (Closure)
- 定义:给定函数依赖集合 $F$,其闭包 $F^+$ 是包含 $F$ 和所有由 $F$ 推导出的函数依赖的集合。
- 如何计算闭包?
- 规则(Armstrong 公理):
- 自反性 (Reflexivity): 如果 $\beta \subseteq \alpha$,则 $\alpha → \beta$。
- 增广性 (Augmentation): 如果 $\alpha → \beta$,则 $\gamma\alpha → \gamma\beta$。
- 传递性 (Transitivity): 如果 $\alpha → \beta$ 且 $\beta → \gamma$,则 $\alpha → \gamma$。
- 规则(Armstrong 公理):
4. 闭包例子
- 给定 $R = \lbrace A, B, C \rbrace$ 和 $F = \lbrace A → B, B → C\rbrace$:
- 计算 $F^+$:
- $A → B$(已知)。
- $B → C$(已知)。
- $A → C$(通过 $A → B$ 和 $B → C$ 的传递性推导)。
- 计算 $F^+$:
5. 如何检查超键?
- 超键:一个属性集合是超键,如果其闭包包含关系中的所有属性。
- 检查方法:
- 计算属性集合 $\alpha$ 的闭包 $\alpha^+$。
- 如果 $\alpha^+$ 包含关系中的所有属性,则 $\alpha$ 是超键。
6. 伪代码:闭包计算
1 | 输入: 属性集合 α, 函数依赖集合 F |
1 | 输入: 函数依赖集合 F |
Lecture 10: Boyce–Codd Normal Form (BCNF)
1. 什么是 BCNF?
BCNF 是一种数据库设计规则,用来解决数据冗余和更新异常的问题。它是第三范式(3NF)的增强版本,要求更严格。
核心要求:
如果一个表 $R$ 中存在一个函数依赖 $\alpha \to \beta$,那么:
- 要么 $\beta$ 是 $\alpha$ 的子集(平凡依赖)。
- 要么 $\alpha$ 是这个表的超键(Superkey)。
如果表中的每一个函数依赖都符合上面的要求,那么这个表就是 BCNF。
2. 直观例子
假设我们有一个表 Course_Info
:
1 | +------------+-------------+-------------+-----------+ |
函数依赖:
- $c_{name} \to credits, domain$(课程名称唯一决定学分和领域)。
- $c_{name}, professor \to credits, domain$(课程名称和教授一起也可以决定学分和领域)。
分析:
- 这里 $c_{name} \to credits, domain$ 是一个有效的函数依赖,但 $c_{name}$ 不是超键(不能唯一标识表中的每一行)。
- 因此,这个表不符合 BCNF。
3. 如何解决?
通过BCNF 分解,将表分解为两个更小的表:
一个表保存课程的基础信息:
1
2
3
4
5
6+------------+-------------+-----------+
| c_name | credits | domain |
+------------+-------------+-----------+
| Database | 3 | CS |
| Algebra | 4 | Math |
+------------+-------------+-----------+另一个表保存教授信息:
1
2
3
4
5
6
7+------------+-------------+
| c_name | professor |
+------------+-------------+
| Database | Dr. Smith |
| Database | Dr. Johnson |
| Algebra | Dr. Smith |
+------------+-------------+
现在,每个表都符合 BCNF。
4. 总结
- BCNF 的定义简化版:
- 每个函数依赖的左边($\alpha$)必须是超键。
- 检查方法:
- 找出表中的函数依赖。
- 检查依赖的左边是否是超键。
- 不符合时:
- 通过分解表来解决,确保每个子表都符合 BCNF。
Lecture 11: Third Normal Form (3NF)
1. 什么是第三范式 (3NF)?
- 定义:关系模式 $R$ 满足 3NF,当对于每个函数依赖 $\alpha → \beta$:
- $\beta \subseteq \alpha$ (平凡依赖),或
- $\alpha$ 是超键 (Superkey),或
- $\beta - \alpha$ 中的每个属性是某个候选键的属性。
2. 为什么需要 3NF?
- 在某些情况下,BCNF 分解可能无法保留依赖。
- 3NF 允许一定的冗余,确保所有依赖都可以在分解后的关系中检查。
3. 示例
- 给定关系模式 $R = \lbrace J, K, L\rbrace$ 和函数依赖 $F = \lbrace JK → L, L → K\rbrace$:
- 候选键:$\lbrace J, K\rbrace$, $\lbrace J, L\rbrace$。
- 检查函数依赖:
- $JK → L$:满足 $JK$ 是超键。
- $L → K$:满足 $K$ 属于候选键。
- 结论:$R$ 已满足 3NF。
4. 3NF 分解算法
1 | 输入: 关系模式 R, 函数依赖集合 F |
Lecture 12: Multivalued Dependencies and 4NF
1. 什么是多值依赖 (Multivalued Dependency, MVD)?
- 定义:如果属性集合 $\alpha$ 确定 $\beta$ 的多个独立值,则称 $\alpha ↠ \beta$ 是一个多值依赖。
- 公式:$\alpha ↠ \beta$
- 例子:
- 学生 $ID ↠ ISBN$ 和 $ID ↠ Phone$。
- 学生的书籍 $ISBN$ 和电话 $Phone$ 彼此独立。
2. 第四范式 (4NF)
- 定义:关系模式 $R$ 满足 4NF,当对于每个多值依赖 $\alpha ↠ \beta$:
- $\beta \subseteq \alpha$ 或 $\alpha ∪ \beta = R$ (平凡 MVD),或
- $\alpha$ 是超键。
3. 示例
- $R = \lbrace ID, ISBN, Phone \rbrace$
- 多值依赖:$ID ↠ ISBN$ 和 $ID ↠ Phone$
- 违反 4NF:
- 因为 $ID$ 不是超键。
- 分解:
- $R_1 = \lbrace ID, ISBN \rbrace$
- $R_2 = \lbrace ID, Phone \rbrace$
4. 4NF 分解算法
1 | 输入: 关系模式 R, 多值依赖集合 D |
Lecture Notes: Database Management Systems
https://tosakaucw.github.io/lecture-notes-database-management-systems/