《高性能MySQL》读书笔记—数据库的范式与反范式

   众所周知Mysql数据库有建表的三大范式,分别是:


   1、第一范式:保证列具有原子性,一张表中的每一个字段,都应不可再分,例如:总金额=单价×数量,此时这个总金额就可以分成单价和数量两字段。

   2、第二范式:属性完全依赖于主键,也就是表中除了主键以外的其他字段都必须依赖主键。

   3、第三范式属性不依赖于其它非主属性,也就是除了主键以外的其他字段应没有任何关系。

   在范式化的数据库中,每个数据会出现并且只出现一次。与之相反,在反范式化的数据库中,信息是冗余的,可能会存储在多个地方。
   
   一般来说,现在的公司建表大多数都是要根据三大范式来创建的,尤其是写操作密集的业务场景。在写操作进行比较多的时候范式化能够带来好处有:
   

   范式化的优缺点

   
   1.范式化的更新操作通常比反范式化要快。
   
   2.当数据较好地范式化时,就只有很少或者没有重复数据,所以只需要修改更少的数据。
   
    3.范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快。
   
   1.范式化后的表很少有多余的数据,这意味着检索列表数据时使用去重(DISTINCT)或者分组(GROUP BY)语句的次数会更少。
   
    范式化设计的缺点是查询语句通常需要关联。稍微复杂一些的查询语句在符合范式的schema上都可能需要至少一次关联(比如上面的总价、单价、和数量,根据范式吧总价分成金额和树数量,但是每次想要获得总价就得用单价×数量来获得),也许更多。这不但代价昂贵,也可能使一些索引策略无效。
   

   反范式化的优缺点

   
    反范式化的表因为所有数据都在一张表中,可以很好地避免关联查询。
   
    如果不需要关联表,则对大部分查询最差的情况,即使表没有使用索引,是全表扫描。当数据比内存大时这可能比关联要快得多,因为这样避免了随机IO(全表扫描基本是顺序IO,但也有不是的,主要看存储引擎是如何实现的)。
   
   但是,正如上面所说,反范式是将数据进行冗余,以此来提升查询的效率,但是数据冗余首先会造成一张表所占空间变大,其次对于表进行除查询以外的操作所需要的开销会变得更大。
   

   总结

   
   我个人对此的理解是,建表并不是必须要按照三范式来设计的,好的数据库设计一定不是一成不变按图索骥的,而是根据实际的业务情况来进行对应的灵活处理。例如:在查询请求非常多,其他的删除,修改,插入情况很少的时候,也是可以使用反范式来进行优化的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值