数据库设计中的反范式化介绍
数据库设计中的反范式化介绍
目录
简介
上一篇文章我们讲了数据设计时候需要遵循的三个范式的介绍,有的时候不能简单按照规范要求设计数据表,因为有的数据看似冗余,其实对业务来说十分重要。这个时候,我们就要遵循业务有限原则,首先满足业务需求,再尽量较少冗余。
如果数据库中的数据量比较大,系统的UV和PV访问频次比较高,则完全按照mysql的三大范式设计数据表读取数据时会产生大大量的关联查询,在一定成都上会影响数据库的读性能。如果我们想要对查询效率进行优化,反范式优化也是一种优化思路。此时,可以通过在数据表中增加冗余字段来提高数据库读性能。
规范化VS性能
- 为满足某种商业目标,数据库性能比规范化数据库更重要。
- 在数据规范化的同时,要综合考虑数据库性能。
- 通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间。
- 通过在给定的表中插入计算列,以方便查询。
应用举例
举例1
员工的信息存储在employees表中,部门信息存储在departments表中。通过employees表中的department_id字段与departments表建立关联关系。如果要查询一个员工的部门名称则需要进行join。
如果经常需要进行这个操作,连接查询就会浪费很多时间。可以在employees表中增加一个冗余字段department_name,这样就不用每次都进行连接操作了。
举例2
反范式话的goods商品信息表(在上篇我们讲过这个表),设计如下
举例3
我们有2个表,分别是商品流水表和商品信息表。商品流水表里有400万条记录,商品信息表里有2000条记录。
两个表是符合三范式要求的。但是,在我们项目的实施过程中,对流水的查询频率很高,而且为了获取商品名称,基本都会用到与商品信息表连接查询。
为了减少连接,我们可以直接把商品名称字段追加到流水表里。这样一来,我们可以直接从流水表里获取商品的名称了。虽然增加了冗余但是避免了关联查询,提升了查询的效率。
新的商品流水表如下
反范式的新问题
反范式可以通过空间换时间,提升查询效率,但是反范式也会带来一些新问题:
- 存储空间变大了
- 一个表中字段做了修改,另一个表中冗余字段就得同步修改,否则数据会不一致
- 若采用存储过程来支持数据的更新、删除等额外操作,如果更新频繁,会非常消耗系统资源
- 在数据量小的情况下,反范式不能提现性能的优势,可能还会让数据库的设计更加复杂
反范式的使用场景
当冗余信息有键值或者能大幅度提高查询效率。
增加冗余字段的建议
增加冗余字段一定要符合下面两个条件。
①这个冗余字段不需要经常修改
②这个冗余字段查询的时候不可或缺
历史快照、历史数据的需要
在现实生活中我们经常需要一些冗余的信息,比如订单中收货人的信息,包括姓名,电话,和地址等。每次发生的订单收货信息都属于历史快照,需要进行保存,但用户可以随时修改自己的信息,这时保存这些冗余信息是非常有必要的。
反范式优化也常常用在数据仓库的设计中,因为数据仓库通常存储历史数据,对增删改的实时性要求不强,对历史数据的分析需求强。这时适当允许数据的冗余度,更方便进行数据分析。
简单总结下数据仓库和数据库在使用上的区别
- 数据库设计目的在于捕获数据,而数据仓目的在于分析数据
- 数据库对数据的增删改实时性要求强,需要存储在线的用户数据,而数据仓库存储的一般是历史数据
- 数据库设计需要尽量避免冗余,但为了提高查询效率也允许一定的冗余,而数据仓库在设计上更偏向采用历史数据。
更多推荐
所有评论(0)