4. 关系数据理论
4.2 规范化
### 函数依赖
- 设 $R$ 是属性集 $U$ 上的关系模式, $X, Y$ 是 $U$ 的子集. 若对于 $R$ 中的任何一个可能的关系 $r$ , $r$ 中不可能存在两个元组在 $X$ 上的属性值相等, 而在 $Y$ 上的属性值不等, 则称** $X$ 函数确定 $Y$ 或 $Y$ 函数依赖于 $X$ , 记作 $X \to Y$ **
- 若 $X \to Y$, 但 $Y \subseteq X$, 则称 $X \to Y$ 是平凡的函数依赖
- 若 $X \to Y$, 但 $Y \nsubseteq X$, 则称 $X \to Y$ 是非平凡的函数依赖
### 函数依赖
- 若 $X \to Y$, 则 $X$ 是这个函数依赖的决定属性组
- 若 $X \to Y$, $Y \to X$, 则记作 $X \gets \to Y$
- 若 $Y$ 不函数依赖于 $X$, 则记作 $X \nrightarrow Y$
### 函数依赖
- 函数依赖是数据取值之间的约束关系
- 函数依赖是语义范畴的概念
- 设计者也可以对现实世界作强制性规定
- 函数依赖是指 $R$ 的一切关系均要满足的约束条件
### 完全 / 部分函数依赖
- 设 $R$ 是属性集 $U$ 上的关系模式, $X, Y$ 是 $U$ 的子集. 若 $X \to Y$, 且对于 $X$ 的任何一个真子集 $X'$, $X' \nrightarrow Y$, 则称** $Y$ 对 $X$ 完全函数依赖**, 记为 $X \xrightarrow{F} Y$
- 若 $X \to Y$, 但 $Y$ 不完全函数依赖于 $X$, 则称** $Y$ 对 $X$ 部分函数依赖**, 记为 $X \xrightarrow{P} Y$
### 传递函数依赖
- 在 $R(U)$ 中, 若 $X \to Y$ 且 $Y \nsubseteq X$, $Y \nrightarrow X$, $Y \to Z$, $Z \nsubseteq Y$, 则称** $Z$ 对 $X$ 传递函数依赖**, 记为 $X \xrightarrow{传递} Z$
### 码
- 设 $K$ 为关系模式 $R(U)$ 中的属性或属性组合, 若 $K \xrightarrow{F} U$, 则称 $K$ 为 $R$ 的**候选码**
- 若 $U$ 部分函数依赖于 $K$, $K \xrightarrow{P} U$, 则 $K$ 称为**超码**
- 若候选码多于一个, 则选定其中的一个为**主码**
- 包含在任何一个候选码中的属性称为**主属性**
- 不包含在任何候选码中的属性称为**非主属性**
- 整个属性组是码则称为**全码**
### 外码
- 设关系模式 $R$ 中的属性或属性组 $X$ 并非 $R$ 的码, 但 $X$ 是另一个关系模式的码, 则称 $X$ 是 $R$ 的**外码**
### 范式
- 范式是关系数据库中的一种标准化级别
- 关系数据库中的关系满足不同程度的要求
- 不同程度的要求叫作不同的范式
### 规范化
- 一个低一级范式的关系模式可以通过模式分解转换为若干个高一级范式的关系模式集合
- 这个过程就是规范化
- 规范化将不符合特定范式的关系模式转换为满足特定范式要求的模式
### 2NF
- 若关系模式 $R \in 1NF$, 并且每一个非主属性完全函数依赖于任何一个候选码, 则 $R \in 2NF$
### 例 4
- 关系模式 S-L-C (Sno, Sdept, Sloc, Cno, Grade), 码为 (Sno, Cno)
- 存在函数依赖:
- $(Sno, Cno) \xrightarrow{F} Grade$
- $Sno \to Sdept$
- $(Sno, Cno) \xrightarrow{P} Sdept$
- $Sno \to Sloc$
- $(Sno, Cno) \xrightarrow{P} Sloc$
- $Sdept \to Sloc$

#### Example 4
### 2NF
- 若关系模式 $R \in 1NF$, 并且每一个非主属性完全函数依赖于任何一个候选码, 则 $R \in 2NF$
- 非主属性 $Sdept, Sloc$ 不完全函数依赖于码
- 例 4 不属于 2NF
### 该关系模式的问题
- 数据冗余: 住处和系名重复存储
- 插入异常: 学生未选课
- 删除异常: 删除只选择一门课的学生
- 修改复杂: 学生转系
### 例 4 改善
- 将 S-L-C 分解
- S-C (Sno, Cno, Grade)
- S-L (Sno, Sdept, Sloc)
- 非主属性对候选码都是完全函数依赖

#### Example 4
### 3NF
- 若关系模式 $R(U, F) \in 1NF$, 并且 $R$ 中不存在这样的码 $X$, 属性组 $Y$ 及非主属性 $Z (Z \nsubseteq Y)$, 使得$ X \to Y$, $Y \to Z$ 成立, 且 $Y \nrightarrow X$, 则 $R(U, F) \in 3NF$
- 若关系模式 $R \in 2NF$, 并且每一个非主属性都不传递函数依赖于任何一个候选码, 则 $R \in 3NF$
- 例 4 中关系模式 S-L 不属于 3NF
### 该关系模式的问题
- 数据冗余: 住处和系名重复存储
- 插入异常: 某系无学生
- 删除异常: 删除系
- 修改复杂: 调整住处
### 例 4 改善
- 将 S-L 分解
- S-D (Sno, Sdept)
- D-L (SDept, Sloc)
- 没有非主属性对码的传递依赖

#### Example 4
### BCNF
- 若关系模式 $R(U, F) \in 1NF$, 若$ X \to Y$ 且 $Y \nsubseteq X$ 时 $X$ 必含有码, 则 $R(U, F) \in BCNF$
- 所有非主属性对每一个码都是完全函数依赖
- 所有主属性对于每一个不包含它的码也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性
### 总结
- 1NF: 属性不可分
- 2NF: 非主属性完全函数依赖于码
- 3NF: 非主属性不传递函数依赖于码
- BCNF: 主属性完全函数依赖于码
### 总结
- 1NF 消除非主属性对码的部分函数依赖得到 2NF
- 2NF 消除非主属性对码的传递函数依赖得到 3NF
- 3NF 消除主属性对码的部分和传递函数依赖得到 BCNF

### 4.2 规范化
- 什么是函数依赖?
- 完全函数依赖和部分函数依赖有何区别?
- 什么是传递函数依赖?
- 描述规范化的过程.
- 请描述2NF, 3NF, BCNF 的要求和效果.
----
[ 4.1 问题的提出](dbds-4-1.html#/overview)
[| 练习 |](dbds-exec.html)
[ 5.1 数据库设计概述](dbds-5-1.html#/overview)