高性能表结构设计:范式与反范式设计

常说的三大范式

第一范式

  • 定义:属于第一范式关系的所有属性都不可再分,即数据项不可分。
  • 简单理解:每个列都不可以再拆分。

第二范式

  • 定义:要求数据库表中的每个实例或行必须可以被惟一地区分。
  • 简单理解:不要有部分依赖。该多对多就去做多对多,不要把多对多关系放在一张表

第三范式

  • 定义:每一个非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主键对主键的传递依赖。
  • 简单理解:表关联有个主键就行,不要放除关联主键之外的其他关联表数据。

反范式设计

  • 为了性能和读取效率的考虑而适当的对数据库设计范式的要求进行违反。
  • 允许存在少量的冗余,换句话来说反范式化就是使用空间来换取时间。

实际工作中的反范式实现

  • 缓存和汇总:在一些表中加一些冗余字段,比如点赞的总数,对应主表的名称。比如讲一些结果提前进行处理汇总到一张表中。
  • 计数器表:网站点击数、用户的朋友数、文件下载、举报、点赞次数等进行记录。
  • 分库分表中的查询:大量的请求一个库扛不住,将数据分散开。一张表的数据量太大分开几个表进行存储。

范式化和反范式对比

范式化设计优缺点

  • 范式化的更新操作通常比反范式化要快。
  • 当数据较好地范式化时,就只有很少或者没有重复数据,所以只需要修改更少的数据。
  • 范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快。
  • 很少有多余的数据意味着检索列表数据时更少需要DISTINCT或者GROUP BY语句。在非范式化的结构中必须使用DISTINCT或者GROUPBY才能获得一份唯一的列表,但是如果是一张单独的表,很可能则只需要简单的查询这张表就行了。
  • 范式化设计的缺点是通常需要关联。稍微复杂一些的查询语句在符合范式的表上都可能需要至少一次关联,也许更多。这不但代价昂贵,也可能使一些索引策略无效。例如,范式化可能将列存放在不同的表中,而这些列如果在一个表中本可以属于同一个索引。

反范式化设计优缺点

  • 反范式设计可以减少表的关联
  • 可以更好的进行索引优化。
  • 反范式设计缺点也很明显,1、存在数据冗余及数据维护异常,2、对数据的修改需要更多的成本。
posted @ 2021-12-21 22:05  程序java圈  阅读(109)  评论(0编辑  收藏  举报