在数据库设计规范中,范式和反范式经常被提到。了解范式的概念和原则对我们设计数据表很有帮助,然而,范式并不是完美的,在实际开发中,经常是依据范式设计,再根据实际业务情况加入反范式设计,形成混合模式。也就是实际上很少会有完全的范式设计或完全的反范式设计。
范式和反范式的区别
关于范式的概念,大家可以自行上网搜索,大部分情况下是讲前面的三大范式:
- 第一范式:每列都具有原子性,意即每一列的含义是不可再拆分的,不具备二义性。实际这个概念会依据也不同而不同,举个例子而言,姓名这个字段本身包含了姓和名,如果需要把二者当做不同的实体,那就需要拆分为两个字段;如果不需要那单独成一个字段也没问题。
- 第二范式:数据表每一列都都和主键相关。这意味着每个数据表不能保存多种实体数据,只保存与本实体相关的数据。这里的关键是是否需要冗余其他实体属性的字段。
- 第三范式:数据表每一列只和主键直接相关而不是间接相关。也就是数据表的列要与数据表主键代表实体的直接属性,而不是关联属性。
对于反范式而言,则允许信息冗余或者存放在多个不同的数据表。以经典的人员、部门和主管为例。最简单的设计是将三者直接放入同一张数据表(很多传统的 Excel 就是按这种方式记录数据)。
CREATE TABLE t_employees (
employee VARCHAR(32),
department VARCHAR(32),
head