数据库设计中的范式

Posted by Charlie Lin on March 2, 2021

什么是范式(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 的设计,依然会存在各种问题,如下图所示的表,就存在不少问题。 表二

  1. 冗余。姓名、系名、系主任多次重复
  2. 插入异常。 如果学校新设了一个系,而暂未招生,则无法将系名与系主任插入到表中。
  3. 删除异常。如果关于一个系的所有记录都删除了,则这个系就「不存在」了。
  4. 修改异常。如果李小明转系了,则需要修改三条记录中的系名、系主任信息。

第二范式(2NF)

一张表必须有一个主键,且所有非主属性必须完全依赖于主键,而不能只依赖于主键中的一部分。 根据第二范式的要求,可以把上述的成绩表,拆分成如下两张表: 表三

加入第二范式后,再来看看之前在第一范式中存在的问题:

  1. 冗余。有改进
  2. 插入异常。无变化
  3. 删除异常。无变化
  4. 修改异常。有改进

第三范式(3NF)

消除了非主属性对于主键的传递依赖。 在根据第二范式拆分出来的表二中,存在 学号 -> 系名,系名 -> 系主任 这样的传递依赖。因而再一次进行拆分。如下图: 表四

再来看看这次拆分之后,是否有改进。

  1. 插入异常。新增系的话,只需在表三添加记录即可。
  2. 删除异常。删除后系的信息依旧存在。