MySQL进阶系列:数据库设计中的范式究竟该如何使用

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战mysql

 这篇文章主要为了说明规矩要遵照,可是也别这么死板,要知道因场景不一样而变化。了解各自的优缺点,在不一样业务中根据需求选择使用。 sql

范式-反范式000657@2x.png

咱们在项目上进行数据库设计的时候要求遵照三范式,为何会约束三范式呢:为了减小数据冗余。数据库

回忆下是哪三范式:缓存

  1. 全部属性具备原子性,列不可分割。markdown

    例如家庭地址(xx省xx市xx地址),家庭地址做为字段就是非原子的,能够拆分红字段省份,城市,地址。数据库设计

  2. 在第一范式的基础上,要求全部非主键字段彻底依赖主键,不能产生部分依赖。post

    一个数据库表中,一个表中只能保存一种数据,不能够把多种数据保存在同一张数据库表中。网站

  3. 在第二范式的基础上,保证每列都和主键直接相关,不存在传递依赖spa

    表中的字段和主键直接对应不依靠其余中间字段。传递依赖:A--->B--->C。设计

范式

优势:

  1. 范式化的更新一般比反范式更快。
  2. 当数据较好的范式化后,就只有不多或者没有重复数据。
  3. 范式化的表一般更小,能够更好的放进内存了,因此执行操做也会更快。
  4. 不多有多余的数据意味着检索列表数据时更少须要distinct和group by语句。

缺点:

  1. 一般须要表关联,复杂一点的查询语句可能至少须要一次关联,也可能会使得索引失效。

阿里开发手册中规定表join关联不能超过3个,主要缘由就是数据量大的时候join查询很是慢,可是也不必定不能关联多个,具体问题具体分析,数据量少的时候多张表关联也没影响的。

反范式

优势:

  1. 数据都在一张表中,能够很好的避免关联。

    若是不须要关联,则对大部分查询最差的状况---即便表没有使用索引,是全表扫描。当数据比内存大时,可能比关联要快得多,由于这样避免了随机I/O(全表扫描基本上是顺序I/O,但不是100%的和引擎有关).

  2. 单表能够更有效的使用索引策略。

缺点:

  1. 表中的冗余较多,删除数据的时候容易形成部分有用数据丢失。

混用范式和反范式

实际上彻底范式或者彻底反范式都是理论上的。在实际的项目开发中,基本都是混用的,没有严格的规定。

案例分析:

例A: 假设有一个网站,容许用户发送消息,并且其中一些用户是VIP,如今想查看VIP用户的近10条信息。

  1. 彻底范式化  表设计:user(user_id,user_type)表和message(message_id,user_id,message_text,published)表,published构建索引

查询sql:

SELECT  message.message_text FROM  message  INNER JOIN USER ON message.user_id = USER.user_id WHERE  USER.user_type = 'VIP' ORDER BY  message.published DESC   LIMIT 10;
复制代码

上面sql须要表关联,mysql须要扫描message 表的日期published的索引,对于每一行找到的数据都要到user表检索是否是VIP用户,若是VIP只是很小的一部分,这个效率就很低下了。另外一种执行计划是先从user表开始,找全部VIP用户获取并排序,这种可能更糟糕。

  1. 彻底的反范式,须要在message表中存储user数据,就会存在message数据操做影响user数据的问题。

  2. 混用范式和反范式:修改message表结构增长用户类型字段user_type, 如:message(message_id,user_id,message_text,published,user_type),这种设计能够避免彻底范式化带来的表关联查询,也避免了彻底反范式的插入删除问题(即便没有消息用户的信息也不会丢失)。

例B: 若是部分需求是查询的结果须要排序,从父表中冗余一些数据到子表更方便设计索引,提升查询效率。

例C: 对于缓存衍生值也是有效的,若是须要显示每一个用户发了多少消息(论坛发帖),每次须要执行一个统计的自查询计算,其实能够在user表中增长消息数量的字段,当用户发送消息的时候更新这个值(须要平衡更新和查询哪一个更好)。

以上只是为了说明范式和反范式以及混用范式而举的例子,可是实际开发中仍是要根据业务来选择怎么使用。

在表设计中,使用范式也好,反范式也好,不该该有严格的限制,该用哪一种就使用哪一种或者二者结合使用。

mysql进阶系列持续更新中

相关文章
相关标签/搜索