什么是范式(NF)
课本中的规范定义,范式是「符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度」。而简单来说,它实际上是一张数据库表的表结构所符合的设计标准。就像电器的节能等级分为一级、二级、三级等,范式也分为 1NF,2NF,3NF,BCNF,4NF,5NF 等。
一般我们在考虑关系型数据库的设计时,最多考虑到 BCNF。当一个数据表的设计满足某一范式时,它一定满足更低的范式。
预备知识
关系模式与关系
关系模式表示一张数据表的表结构,而关系表示满足这个表结构的一张表。
函数依赖
若在一张表中,在属性组 X 的值确定的情况下,一定能确定属性 Y 的值,那么就可以说 Y 函数依赖于 X,写作 X -> Y。换句话说,若一张表满足了 X -> Y 的依赖,则不存在任意两条记录,在 X 相同的情况下,具有不同的 Y 值。
完全函数依赖
在一张表中,若 X -> Y,且对于 X 的任意一个真子集 X’,X’ -> Y 都不成立,则称 Y 完全函数依赖于 X,记做:
部分函数依赖
不是完全依赖的函数依赖,成为部分函数依赖,记做:
传递函数依赖
假如 Z 函数依赖于 Y,且 Y 函数依赖于 X,那么 Z 传递依赖于 X,记做:
主键
设 K 为一张数据库表中的一个属性或属性组,若除 K 以外的属性都完全函数依赖于 K,则称 K 为主键。也就是说,在一张数据表中,只要 K 是确定的,那么其他属性的值也是确定的。
第一范式(1NF)
1NF 是所有关系型数据库的最基本要求。例如下图所示的关系模式就不满足 1NF。
但是仅仅满足 1NF 的设计,依然会存在各种问题,如下图所示的表,就存在不少问题。
- 冗余。姓名、系名、系主任多次重复
- 插入异常。 如果学校新设了一个系,而暂未招生,则无法将系名与系主任插入到表中。
- 删除异常。如果关于一个系的所有记录都删除了,则这个系就「不存在」了。
- 修改异常。如果李小明转系了,则需要修改三条记录中的系名、系主任信息。
第二范式(2NF)
一张表必须有一个主键,且所有非主属性必须完全依赖于主键,而不能只依赖于主键中的一部分。
根据第二范式的要求,可以把上述的成绩表,拆分成如下两张表:
加入第二范式后,再来看看之前在第一范式中存在的问题:
- 冗余。有改进。
- 插入异常。无变化。
- 删除异常。无变化。
- 修改异常。有改进。
第三范式(3NF)
消除了非主属性对于主键的传递依赖。
在根据第二范式拆分出来的表二中,存在 学号 -> 系名,系名 -> 系主任 这样的传递依赖。因而再一次进行拆分。如下图:
再来看看这次拆分之后,是否有改进。
- 插入异常。新增系的话,只需在表三添加记录即可。
- 删除异常。删除后系的信息依旧存在。