天天看点

【数据库】范式与反范式

一、第一范式

第一范式主要是确保数据表中每个字段的值必须具有原子性,也就是说数据表中每个字段的值为不可再次拆分的最小数据单元。
【数据库】范式与反范式

上图为反例

【数据库】范式与反范式

符合MySQL的第一范式

二、第二范式

第二范式是指在第一范式的基础上,确保数据表中除了主键之外的每个字段都必须依赖主键。

如下图不符合第二范式

【数据库】范式与反范式

由于商品的名称和价格字段不依赖于商品类别的主键id,所以不符合第二范式。

【数据库】范式与反范式

三、第三范式

第三范式是在第二范式的基础上,确保数据表中的每一列都和主键字段直接相关,也就是说,要求数据表中的所有非主键字段不能依赖于其他非主键字段。

符合第三范式的t_goods商品信息表

【数据库】范式与反范式

符合第三范式的t_goods_join_category关联表

【数据库】范式与反范式

四、反范式化

如果数据库中的数据量比较大,系统的UV和PV访问频次比较高,则完全按照MySQL的三大范式设计数据表,读数据时会产生大量的关联查询,在一定程度上会影响数据库的读性能。此时,可以通过在数据表中增加冗余字段来提高数据库的读性能。
五、范式优缺点

1、优点

  • 范式化的更新操作通常比反范式化要快。
  • 当数据较好的范式化时,就只有很少或者没有重复数据,所有只需要修改更少的数据。
  • 范式化的表通常更小,可以更好的放到内存中,所有执行操作更快。
  • 很少有多余的数据意味着检索列表数据时更少需要

    DISTINCT

    或者

    GROUP BY

    语句。

2、缺点

范式化的缺点就是需要更多的关联,不但代价昂贵,而且优化复杂。

六、反范式化优缺点

反范式化的设计,将所有字段放到一张表中,可以很好地避免关联。如果不使用关联表,则对大部分查询最差情况——即使表没有使用索引——是全表扫描。当数据比内存大时,这也可能比关联要块很多,因为这样可以避免随机I/O。

  • 由于同一个字段,可能冗余到多个表,更新复杂。
  • 反范式化的表通常比较大,字段多,涉及多个索引,更新插入性能差。

好学若饥,谦卑若愚

继续阅读