【转载】数据模型的范式化和反范式化简述

原文在这里

---------------------

范式化模型

 范式化模型要求满足下面三大范式:

  1. 每个字段只包含最小的信息属性。如果某个字段名称为name-age,value为zhangsan-23,则这个模型不满足第一范式,需要将name-age分为两个属性name和age后才满足第一范式。
  2. (在满足第一范式基础上)模型含有主键,非主键字段依赖主键。比如订单这个模型,它的主键是订单ID,那么订单模型其它字段都应该依赖于订单ID,如商品ID和订单没有直接关系,则这个属性不应该放到订单模型而应该放到"订单-商品"中间表。
  3. (在满足第二范式基础上)模型非主键字段不能相互依赖。订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。

反范式化模型

不满足范式的模型,就是反范式模型

总结

RDBMS模型设计过程中,常常使用范式约束我们的模型,但在NOSQL模型中则大量采用反范式。

  优点 缺点
范式化模型 因为数据没有冗余,更新容易 当查询设计很多关联模型(join)时,会导致查询性能低下
反范式化模型 数据冗余将带来很好的读取性能(因为不需要join很多表,而且通常反范式模型很少做更新操作) 需要维护冗余数据(但磁盘并不贵,对吗?)

P.S. 为了提升数据库性能,我们可以考虑索引、物化视图、缓存等技术,但反范式设计的确是很重要的一种手段。

参考文章:

用实例讲SQL三大范式

SQL三大范式

数据库 三范式最简单最易记的解释

数据库的反范式化(Denormalization)设计

原文地址:https://www.cnblogs.com/tlz888/p/12162790.html