zoukankan      html  css  js  c++  java
  • 【转载】数据模型的范式化和反范式化简述

    原文在这里

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

    范式化模型

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

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

    反范式化模型

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

    总结

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

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

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

    参考文章:

    用实例讲SQL三大范式

    SQL三大范式

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

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

  • 相关阅读:
    [CF845G]Shortest Path Problem?
    [洛谷P4149][IOI2011]Race
    [洛谷P4178]Tree
    [AtCoder AGC27A]Candy Distribution Again
    [洛谷P3806]【模板】点分治1
    [洛谷P2634][国家集训队]聪聪可可
    [CF280C]Game on Tree
    [洛谷P3338][ZJOI2014]力
    [CF438D]The Child and Sequence
    [CF609E]Minimum spanning tree for each edge
  • 原文地址:https://www.cnblogs.com/tlz888/p/12162790.html
Copyright © 2011-2022 走看看