# 关系数据理论

## 问题的提出

针对一个具体问题，应该如何构造一个适合于它的数据库模式，即应该构造几个关系模式，每个关系由哪些属性组成等。这是数据库设计的问题，确切地讲是关系数据库逻辑设计问题。

由于关系模型有严格的数学理论基础，并且可以向别的数据模型转换，因此，人们就以关系模型为背景来讨论这个问题，形成了数据库逻辑设计的一个有力工具——关系数据库的规范化理论。

关系模式由五部分组成，即它是一个五元组：R(U, D, DOM, F)

* R：关系名
* U：组成该关系的属性名集合
* D：属性组U中属性所来自的域
* DOM：属性向域的映象集合
* F：属性间数据的依赖关系集合

由于D、DOM与模式设计关系不大，关系模式R（U, D, DOM, F）简化为一个三元组：

$$R(U,F)$$ 当且仅当U上的一个关系r满足F时，r称为关系模式 R（U, F）的一个关系。 作为二维表，关系要符合一个最基本的条件：每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于**第一范式（1NF）**

数据依赖

* 是一个关系内部属性与属性之间的一种约束关系
* 通过属性间值的相等与否体现出来的数据间相互联系
* 是现实世界属性间相互联系的抽象
* 是数据内在的性质
* 是语义的体现

数据依赖的主要类型

* 函数依赖（Functional Dependency，简记为FD）
* 多值依赖（Multi-Valued Dependency，简记为MVD）

## 规范化

### 函数依赖

定义：设R(U)是一个属性集U上的关系模式，X和Y是U的子集。若对于R(U)的任意一个可能的关系r，r中不可能存在两个元组在X上的属性值相等， 而在Y上的属性值不等， 则称**X函数确定Y**或**Y函数依赖于X**，记作$X \rightarrow Y$。\
注意：函数依赖不是指关系模式R的某个或某些关系满足的约束条件，而是值R的一切关系均要满足的约束条件。

平凡函数依赖与非平凡函数依赖 在关系模式R(U)中，对于U的子集X和Y，

* 如果X→Y，但$Y\nsubseteq X$，则称X→Y是**非平凡的函数依赖**
* 如果X→Y，但$Y\subseteq X$，则称X→Y是**平凡的函数依赖** 对于任一关系模式，平凡函数依赖都是必然成立的，它不反映新的语义。
* 若X→Y，则X称为这个函数依赖的决定属性组，也称为**决定因素（determinant）**。
* 若X→Y，Y→X，则记作$X\leftarrow\rightarrow Y$。
* 若Y不函数依赖于X，则记作$X\nrightarrow Y$。

完全函数依赖和部分函数依赖 定义：在R(U)中，

* 如果X→Y，并且对于X的任何一个真子集X’，都有${X'}\nrightarrow Y$, 则称**Y对X完全函数依赖**，记作 $$X \overset{F}{\rightarrow} Y$$
* 如果X→Y，但Y不完全函数依赖于X，则称**Y对X部分函数依赖**，记作 $$X \overset{P}{\rightarrow} Y$$

传递函数依赖 定义：在R(U)中，如果X→Y($Y\nsubseteq X$)，$Y\nrightarrow X$，Y→Z，$Z\nsubseteq Y$，则称Z对X**传递函数依赖**。记为： $$X\overset{传递}{\rightarrow} Z$$ 注: 如果Y→X， 即X←→Y，则Z直接依赖于X。

### 码

定义：设K为R\<U,F>中的属性或属性组合。若$K\overset{F}{\rightarrow} U$，则K称为R的**侯选码（Candidate Key）**。

如果U部分函数依赖于K，即$K\overset{P}{\rightarrow} U$，则K称为**超码（Surpkey）**。候选码是最小的超码，即K的任意一个真子集都不是候选码。若候选码多于一个，则选定其中的一个为**主码（primary key）**。

包含在任何一个候选码中的属性称为**主属性**；不包含在任何候选码的属性称为**非主属性**或**非码属性**。最简单的情况，单个属性是码；最极端的情况，整个属性组是码，称为**全码**。

定义：关系模式R中属性或属性组X并非R的码，但X是另一个关系模式的码，则称X是R的**外部码（Foreign key）**，也称**外码**。

### 范式

* 范式(Normal Form)是符合某一种级别的关系模式的集合.
* 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式
* 范式的种类：
  * 第一范式(1NF)
  * 第二范式(2NF)
  * 第三范式(3NF)
  * BC范式(BCNF)
  * 第四范式(4NF)
  * 第五范式(5NF)
* 各种范式之间存在联系： $$5NF\subset 4NF\subset BCNF\subset 3NF\subset 2NF\subset 1NF$$ 某一关系模式R为第n范式，可简记为R∈nNF。
* 一个低一级范式的关系模式，通过模式分解可以转换为若干个高一级范式的关系模式的集合，这种过程就叫**规范化（Normalization）**。

### 2NF

定义：若$R\in 1NF$，且每一个非主属性完全函数依赖于任何一个候选码，则$R\in 2NF$。

一个关系模式不属于2NF，会产生以下问题：

* 插入异常
* 删除异常
* 修改复杂

### 3NF

定义：设关系模式$R\langle U,F\rangle\in1NF$，若R中不存在这样的码X、属性组Y及非主属性Z（$Z\nsupseteq Y$），使得X→Y ，Y→X，Y→Z成立，$Y\nrightarrow X$，则称$R\langle U,F \rangle \in 3NF$。

由定义可以证明，若$R\in 3NF$，则每一个非主属性既不传递依赖于码，也不部分依赖于码。也就是说，可以证明如果R属于3NF，则必有R属于2NF。

一个关系模式不属于3NF，会产生以下问题：

* 插入异常
* 删除异常
* 修改复杂

### BCNF

定义：关系模式$R\langle U,F \rangle\in 1NF$，若X→Y且$Y\nsubseteq X$时X必含有码，则$R\langle U,F \rangle \in BCNF$。 也就是说，关系模式R\<U,F>中，若每一个决定因素都包含码，则$R\langle U,F \rangle \in BCNF$。

若$R\in BCNF$

* 所有非主属性对每一个码都是完全函数依赖
* 所有的主属性对每一个不包含它的码，也是完全函数依赖
* 没有任何属性完全函数依赖于非码的任何一组属性

如果一个关系数据库中的所有关系模式都属于BCNF，那么在函数依赖范畴内，它已实现了模式的彻底分解，达到了最高的规范化程度，消除了插入异常和删除异常。

### 多值依赖

定义：设R(U)是一个属性集U上的一个关系模式，X、Y和Z是U的子集，并且Z＝U－X－Y。关系模式R(U)中**多值依赖 X→→Y**成立，当且仅当对R(U)的任一关系r，给定的一对（x，z）值，有一组Y的值，这组值仅仅决定于x值而与z值无关。

平凡多值依赖和非平凡的多值依赖

* 若X→→Y，而Z＝Ф，则称X→→Y为**平凡的多值依赖**
* 否则称X→→Y为**非平凡的多值依赖**

多值依赖的性质

* 多值依赖具有对称性 若X→→Y，则X→→Z，其中Z＝U－X－Y
* 多值依赖具有传递性。 即若X→→Y，Y→→Z， 则 X→→Z -Y。
* 函数依赖是多值依赖的特殊情况。 若X→Y，则X→→Y。
* 若X→→Y，X→→Z，则X→→YZ。
* 若X→→Y，X→→Z，则X→→Y∩Z。
* 若X→→Y，X→→Z，则X→→Y-Z，X→→Z -Y。

多值依赖与函数依赖的区别

* 多值依赖的有效性与属性集的范围有关
* 若函数依赖X→Y在R（U）上成立，则对于任何$Y'\subset Y$均有X→Y’成立。多值依赖X→→Y若在R(U)上成立，不能断言对于任何$Y'\subset Y$有X→→Y'成立。

### 4NF

定义：关系模式R\<U，F>∈1NF，如果对于R的每个非平凡多值依赖X→→Y（$Y\nsubseteq X$），X都含有码，则R∈4NF（4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖）。

4NF所允许的非平凡的多值依赖实际上是函数依赖。 显然，如果一个关系模式是4NF，则必为BCNF。

### 规范化小结

* 关系数据库的规范化理论是数据库逻辑设计的工具
* 目的：尽量消除插入、删除和修改异常，数据冗余
* 基本思想：逐步消除数据依赖中不合适的部分 实质：概念的单一化

关系模式规范化的基本步骤 ![关系数据理论1](http://ofolh8dcq.bkt.clouddn.com/%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E7%90%86%E8%AE%BA1.PNG)

> 《数据库系统概论（第5版）》王珊 萨师煊 著
