数据库设计中的反范式化介绍

目录

简介

规范化VS性能

应用举例

举例1

举例2

 举例3

 反范式的新问题

反范式的使用场景

增加冗余字段的建议

历史快照、历史数据的需要


简介

上一篇文章我们讲了数据设计时候需要遵循的三个范式的介绍,有的时候不能简单按照规范要求设计数据表,因为有的数据看似冗余,其实对业务来说十分重要。这个时候,我们就要遵循业务有限原则,首先满足业务需求,再尽量较少冗余。

如果数据库中的数据量比较大,系统的UV和PV访问频次比较高,则完全按照mysql的三大范式设计数据表读取数据时会产生大大量的关联查询,在一定成都上会影响数据库的读性能。如果我们想要对查询效率进行优化,反范式优化也是一种优化思路。此时,可以通过在数据表中增加冗余字段来提高数据库读性能。

规范化VS性能

  1. 为满足某种商业目标,数据库性能比规范化数据库更重要。
  2. 在数据规范化的同时,要综合考虑数据库性能。
  3. 通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间。
  4. 通过在给定的表中插入计算列,以方便查询。

应用举例

举例1

员工的信息存储在employees表中,部门信息存储在departments表中。通过employees表中的department_id字段与departments表建立关联关系。如果要查询一个员工的部门名称则需要进行join。

如果经常需要进行这个操作,连接查询就会浪费很多时间。可以在employees表中增加一个冗余字段department_name,这样就不用每次都进行连接操作了。

举例2

反范式话的goods商品信息表(在上篇我们讲过这个表),设计如下

 举例3

我们有2个表,分别是商品流水表和商品信息表。商品流水表里有400万条记录,商品信息表里有2000条记录。

 两个表是符合三范式要求的。但是,在我们项目的实施过程中,对流水的查询频率很高,而且为了获取商品名称,基本都会用到与商品信息表连接查询。

为了减少连接,我们可以直接把商品名称字段追加到流水表里。这样一来,我们可以直接从流水表里获取商品的名称了。虽然增加了冗余但是避免了关联查询,提升了查询的效率。

新的商品流水表如下

 反范式的新问题

反范式可以通过空间换时间,提升查询效率,但是反范式也会带来一些新问题:

  • 存储空间变大了
  • 一个表中字段做了修改,另一个表中冗余字段就得同步修改,否则数据会不一致
  • 若采用存储过程来支持数据的更新、删除等额外操作,如果更新频繁,会非常消耗系统资源
  • 在数据量小的情况下,反范式不能提现性能的优势,可能还会让数据库的设计更加复杂

反范式的使用场景

当冗余信息有键值或者能大幅度提高查询效率。

增加冗余字段的建议

增加冗余字段一定要符合下面两个条件。

①这个冗余字段不需要经常修改

②这个冗余字段查询的时候不可或缺

历史快照、历史数据的需要

在现实生活中我们经常需要一些冗余的信息,比如订单中收货人的信息,包括姓名,电话,和地址等。每次发生的订单收货信息都属于历史快照,需要进行保存,但用户可以随时修改自己的信息,这时保存这些冗余信息是非常有必要的。

反范式优化也常常用在数据仓库的设计中,因为数据仓库通常存储历史数据,对增删改的实时性要求不强,对历史数据的分析需求强。这时适当允许数据的冗余度,更方便进行数据分析。

简单总结下数据仓库和数据库在使用上的区别

  1. 数据库设计目的在于捕获数据,而数据仓目的在于分析数据
  2. 数据库对数据的增删改实时性要求强,需要存储在线的用户数据,而数据仓库存储的一般是历史数据
  3. 数据库设计需要尽量避免冗余,但为了提高查询效率也允许一定的冗余,而数据仓库在设计上更偏向采用历史数据。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢编程的夏先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值