数据库设计范式及数据冗余存储
文章目录
数据库三大范式
- 第一范式:数据库表中的每一字段都是不可再分的原子值
- 第二范式:数据库表中的非主键字段必须唯一依赖全部的主键而不是部分的主键
- 第三范式:数据库表中的非主键必须直接依赖于主键而不是间接依赖于主键
举例来说,比如订单与商品与消费者三者关系建表。订单与商品之间是多对多的关系,一个订单对应多个商品,一个商品对应多个订单。
第一范式,记录信息必须拆分到最细。比如订单信息包含订单id、订单送货地址等,如果两个信息并在一起存,则会出现多个不同id带有同一个订单送货地址。拆开之后,在同一个表格仍然会有,这个情况,于是需要将订单地址再单独建表,组织成多对一的关系进行存储。
第二范式,是基于一个表格中的主键不是单列而是多列的情况。比如订单和商品同时存储在同一张表,订单id和商品id作为共同的主键,则此时,商品名称会只依赖与商品id而不是两个id的组合。结果就是,不同的订单id如果带有相同的商品,其订单id和商品id共同组成了唯一性,但是商品名称则会出现大量冗余的情况。所以应该将订单和商品拆表进行存储。
第三范式,是指非主键列不能依赖于另一个非主键列,而应该直接依赖于主键列。比如订单和消费者信息,订单id为主键,消费者id与订单id直接相关,消费者信息如姓名等,如果同存一张表,则关联于非主键信息消费者id,再关联主键订单id。这样会造成,一张表存储大量冗余消费者信息。所以应该对消费者独立建表。
以上的例子并不是非常的准确贴切,不过基本也可以看出核心的矛盾。即