数据库设计范式及数据冗余存储

数据库设计范式及数据冗余存储

文章目录

  • 数据库设计范式及数据冗余存储
    • 数据库三大范式
    • 数据冗余存储
    • 结论

数据库三大范式

  • 第一范式:数据库表中的每一字段都是不可再分的原子值
  • 第二范式:数据库表中的非主键字段必须唯一依赖全部的主键而不是部分的主键
  • 第三范式:数据库表中的非主键必须直接依赖于主键而不是间接依赖于主键

举例来说,比如订单与商品与消费者三者关系建表。订单与商品之间是多对多的关系,一个订单对应多个商品,一个商品对应多个订单。

第一范式,记录信息必须拆分到最细。比如订单信息包含订单id、订单送货地址等,如果两个信息并在一起存,则会出现多个不同id带有同一个订单送货地址。拆开之后,在同一个表格仍然会有,这个情况,于是需要将订单地址再单独建表,组织成多对一的关系进行存储。

第二范式,是基于一个表格中的主键不是单列而是多列的情况。比如订单和商品同时存储在同一张表,订单id和商品id作为共同的主键,则此时,商品名称会只依赖与商品id而不是两个id的组合。结果就是,不同的订单id如果带有相同的商品,其订单id和商品id共同组成了唯一性,但是商品名称则会出现大量冗余的情况。所以应该将订单和商品拆表进行存储。

第三范式,是指非主键列不能依赖于另一个非主键列,而应该直接依赖于主键列。比如订单和消费者信息,订单id为主键,消费者id与订单id直接相关,消费者信息如姓名等,如果同存一张表,则关联于非主键信息消费者id,再关联主键订单id。这样会造成,一张表存储大量冗余消费者信息。所以应该对消费者独立建表。

以上的例子并不是非常的准确贴切,不过基本也可以看出核心的矛盾。即是说,三大范式的目的都是为了去除数据的冗余存储,减少数据库存储大量冗余信息,以提高数据库的性能。

数据冗余存储

关于数据冗余存储,在高可用的存储系统设计过程,频繁的使用了数据冗余来保证其高可用。

参考google file system的设计,数据节点乘三,每个数据都被存储了三次,写入性能必然会受到一定的影响,查找性能由于彼此重复并不会出现过多的性能破坏。数据冗余在其中的设计更多的是为了保证,一个数据节点不可用,还有其他的节点可以用于访问数据。

这也是数据冗余存储设计的一个核心目的,保证数据一直都是可以访问的。

在数据库设计中,数据冗余存储的另一个目的则是为了提高性能,与降低冗余的目的一致。具体来说,减少大量重复的数据存储在一张表中,是为了在对表进行检索的时候,减少访问过多重复而又无用处的数据,增加访问到核心数据的速度。对于需要同时访问的数据,可以使用关联的方式,在A表中访问后,基于A表得到的信息去B表在进行关联查询。这种操作近似于进行哈希搜索。比起存在一起进行顺序搜索自然是有其优势。劣势就是需要关联查询,这也是性能消耗的点。

当存储的数据量不是很大的时候,冗余存储带来的性能消耗,比起关联查询带来的性能消耗要小的多,这时候,是允许降低范式进行冗余存储的。

结论

上述的关于尽可能减少冗余存储,和允许适当的冗余存储,两者本身并没有矛盾。没有实践的理论永远不可信。上述的理论有实践基础,但还不够充分,只是他打开了视角,在做数据冗余存储设计的时候或者数据库设计的时候,可以提供一些设计方向,而不一定需要死磕某一些设计原则。多尝试即可。

你可能感兴趣的:(杂七杂八)