3.1 范式和反范式

设计关系数据库,需要遵从不同的规范要求,才能设计出合理的关系数据库,这些不同的规范要求被称为不同的范式,越高的范式数据库冗余越小。但是有些时候追求范式减少冗余,反而会降低数据读写的效率,这个时候就要使用反范式,利用空间来交换时间。

3.1.1 范式

范式是关系数据库的理论基础,也是在设计数据库结构的过程中所要遵循的规则和指导方法。范式是数据库设计所需要满足的规范,只有理解数据库的设计范式,才能设计出高效率的数据库。

关系数据库中的范式分为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

其中满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)就可以了。各范式及满足各范式的条件如表3-1所示。

表3-1 各范式及满足各范式的条件

范式优点:

(1)范式的更新操作通常比反范式快。

(2)范式的表比较小,可以更好地放在内存中,所以执行操作会更快。

范式缺点:

(1)范式使查询变得非常复杂。

(2)在查询时需要更多的连接。

(3)一些复合索引的列由于范式的需要被分割到不同的表中,导致索引策略不佳。

3.1.2 反范式

反范式是指不满足范式的模型。反范式和范式正好相反,在反范式的设计模式中,可以允许适当的数据冗余,以缩短取数据的操作时间。本质上就是用空间来换取时间,把数据冗余在多个表中,当查询时可以减少或避免表之间的关联。

反范式的schema由于所有数据都在一张表中,因此可以很好地避免关联。反范式的缺点是UPDATE操作的代价比较高,需要更新多个表,因此需要考虑更新的频率以及更新的时长并和执行SELECT查询的更新频率和时长进行比较。

范式与反范式的比较:

(1)查询记录时,范式模式往往要进行多表的连接,而反范式只需在同一张表中查询,当数据量很大时,反范式的效率会更好。

(2)反范式有很多重复的数据,会占用更多的内存,查询时可能会较多地使用GROUP BY或DISTINCT等耗时、耗性能的查询语句。

(3)当要修改或更新数据时,范式更灵活,而反范式要修改或更新全部的数据,并且容易出错。