MySQL 范式化和反范式化 优缺点

puqutogether | | 访问(82)

  范式化模型

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

  1、每个字段只包含最小的信息属性。如果某个字段名称为name-age,value为zhangsan-23,则这个模型不满足第一范式,需要将name-age分为两个属性name和age后才满足第一范式。

  2、(在满足第一范式基础上)模型含有主键,非主键字段依赖主键。比如订单这个模型,它的主键是订单ID,那么订单模型其它字段都应该依赖于订单ID,如商品ID和订单没有直接关系,则这个属性不应该放到订单模型而应该放到"订单-商品"中间表。

  3、(在满足第二范式基础上)模型非主键字段不能相互依赖。订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。

  反范式化模型

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

  范式的优点:

  1)范式化的数据库更新起来更加快;

  2)范式化之后,只有很少的重复数据,只需要修改更少的数据;

  3)范式化的表更小,可以在内存中执行;

  4)很少的冗余数据,在查询的时候需要更少的distinct或者group by语句。

  范式的缺点:

  5)范式化的表,在查询的时候经常需要很多的关联,因为单独一个表内不存在冗余和重复数据。这导致,稍微复杂一些的查询语句在查询范式的schema上都可能需要较多次的关联。这会增加让查询的代价,也可能使一些索引策略无效。因为范式化将列存放在不同的表中,而这些列在一个表中本可以属于同一个索引。

  反范式的优点:

  1)可以避免关联,因为所有的数据几乎都可以在一张表上显示;

  2)可以设计有效的索引;

  反范式的缺点:

  3)表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失。

  所以在设计数据库时,要注意混用范式化和反范式化