Recall:
数据库中的一些术语:(后面的中文可能翻译不准确,我自己这么称呼它们)relation
—— 关系模型
tuple
entity
—— 表中的一条记录
,也成为实体
attribute/column
—— 每个表头即属性
domain
—— 属性的取值域FD(functional dependency)
—— 函数依赖MVD(Multi-Valued Dependency)
—— 多值依赖。。这个真不知道该怎么翻译
Normalization of Database
数据库正规化是数据库中如何合理且有效组织数据的一门技术,它也为我们提供了一套系统地消除数据冗余(redundancy)
和异常(anomaly)
的方法。
正规化主要就是两个目的:
- 消除数据冗余(或者说没意义的数据)
- 确保数据之间的依赖关系是合乎逻辑的
Problems Without Normalization
假如在设计数据库关系的时候没考虑正规化,不仅会因为数据间的冗余从而浪费存储空间,同时,它也会给我们更新、删除数据时带来很多麻烦,也就是上面说到的异常,下面举例说明。
表头分别是学生id,学生姓名,学生具体的专业方向,hod(Head of Department) 学院的领导,办公电话。
插入异常
假如来了个新生,他还没细分具体专业方向,于是乎在后三栏我们就没办法添了,只能用NULL来补充了,这样就很不方便了;相反,假如软件工程专业有50个学生,那么这50个学生的后三栏就会重复,但我们不得不重复地插入。
更新异常
好,假如某天Mr. X不当领导了,然后换了个领导Mr. Y,那么每个学生都需要将他的hod改成Mr. Y了。万一数据库管理员不小心漏了几个同学的没改,那这些学生的学籍就有错误了。
也许你会说:哎呀,那你管理员细心一点不就好了?
那我会说:你为什么不可以换一种设计数据表的方式呢?
删除异常
再假设,某个branch只有一个学生(好像不太可能),有一天,这个学生真的太孤单了,他读不下去了,转去学管理了,很显然就要把他的信息删掉,问题就来了。因为我们的学生信息和专业的信息是绑在一起的,你删了这个唯一的同学,那这个专业、专业领导也被你删掉了,这样就有问题了。
正规化的规则
主要分为以下几种(越往后,要求越严格):
- First Normal Form
- Second Normal Form
- Third Normal Form
- BCNF(Boyce-Codd Normal Form)
- Fourth Normal Form
First Normal Form (1NF) 详细介绍1NF
如果一个表是满足一范式的,那么它需要满足以下条件:
- 每个属性的取值必须是原子的
atomic
- 每一列的
domain
必须是一样的 - 不存在相同的列名
- 列的排列顺序,以及每个tuple间的排列顺序可以交换。
Second Normal Form (2NF) 详细介绍2NF
如果一个表是满足二范式的,那么它需要满足以下条件:
- 它必须是满足一范式的
- 它不含有部分依赖(Partial Dependency)
Third Normal Form (3NF) 详细介绍3NF
如果一个表是满足三范式的,那么它需要满足以下条件:
- 它必须是满足二范式的
- 它不含有传递依赖(TransitiveDependency)
Boyce and Codd Normal Form (BCNF) 详细介绍BCNF
BCNF其实是第三范式的更高约束版本,它可以处理一些3NF处理不了的异常
如果一个表是满足BCNF的,那么它需要满足以下条件:
- 它必须是满足三范式的
- 对任意一个FD ( X → Y ), X应该是个
超键(superkey)
.
Fourth Normal Form (4NF) 详细介绍4NF
如果一个表是满足三范式的,那么它需要满足以下条件:
- 它必须是满足BCNF的
- 它不含有多值依赖( Multi-Valued Dependency.)
后面会持续更新。