数据库设计规范之三大范式
数据库设计规范之三大范式
1、什么是数据库范式
设计出符合业务需求、高性能的程序对数据库的一种设计规范,称为数据库范式,遵循数据库范式能设计出逻辑清晰,且可扩展性高的程序系统
2、三大范式定义
- 1NF:符合1NF的关系中每个属性不可再细分了,有相似的或相近的字段可以合并成一个字段
- 2NF:一行数据应该只与一列相关,不应该存在冗余
- 3NF:非主属性间不应该存在传递关系
3、三大范式详解
1NF:属性不可再细分为更小粒度的字段,有相似或者相近含义的字段可以合并为一个字段。
假设有这样一个业务场景,我需要一批用户的基础信息(包括姓名,年龄,电话,详细地址等,并按地址分类用户)
表A:
表B:
对比A、B两张表,很明显A表不足以满足业务需求,正确的表结构应该是表B。
2NF:一行数据应该只与一列相关,不应该存在冗余的数据。
假设有这样的业务场景,记录客户下单的酒店信息。
这里用一张表就来存储,可以见到每一行的数据都是对于“张”这个用户来言的,这个name列值就非常冗余,我们可以根据2NF重新设计三张表来维护数据关系。(一张表用来存放用户信息,一张表用来存放酒店房间信息,第三张表用来关联用户与酒店房间信息)
3NF:非主属性间不应该存在传递关系
假如我设计了如下这张表
这是张学生信息表,school代表学校名称,school_tel代表学校电话,但是从场景中分析可知,school_tel与school之间存在着传递关系,而且school_tel与id没有依赖关系,所以表结构设计不合理,正确的做法应该是设计3张表,另外一张存放学校信息,还有一张表用来关联学生与学校的关系。
三大范式只是对设计数据库的建议,并不一定要完全遵循,主要还是要依赖于业务需求,良好的数据库结构不仅可以降低开发人员的工作量和难度也可以增加程序的弹性,为后面的维护打下基础