数据库设计三范式

范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

三范式

第一范式(1NF):列不可再分

1NF是对属性的原子性,要求属性具有原子性,即列不可再分解;

比如:多个联系方式(邮箱、电话、座机)不应该放一个字段,应该设计为多个联系方式。

第二范式(2NF)属性完全依赖于主键

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)

比如有如下学生选修课程表,一个学生可以选修多门课程,所以要将学生id和课程id作为数据库表的联合主键:

学生id 课程id 选修时间 课程名称 学生姓名 学生联系方式
001 1 2022-05-04 数学 张三 13356xxx
001 2 2022-05-04 英语 张三 13356xxx
002 3 2022-05-08 化学 李四 898xxx

分析后发现,学生姓名,学生联系方式只和 学生id有关,和课程id无关
课程名称只和课程id有关,和学生id无关。
这就违反了第二范式,需要将表拆分成三张表。

学生选修表:

学生id 课程id 选修时间
001 1 2022-05-04
001 2 2022-05-04
002 3 2022-05-08

学生表:

学生id 学生姓名 学生联系方式
001 张三 13356xxx
002 李四 898xxx

课程表:

课程id 课程名称
1 数学
2 英语
3 化学

第三范式(3NF)属性不依赖于其它非主属性

3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;

即每个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。

比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

这样一个表结构,就存在上述关系。 学号–> 所在院校 –> (院校地址,院校电话)

这样的表结构,我们应该拆开来,如下。
学生表:(学号,姓名,年龄,性别,所在院校)
院校表:(所在院校,院校地址,院校电话)

第二范式和第三范式的区别

第二范式与第三范式的本质区别:在于有没有分出两张表。

第二范式是说一张表中包含了多种不同实体的属性,那么必须要分成多张表

第三范式是要求已经分好了多张表的话,一张表中只能有另一张标的ID,而不能有其他任何信息,(其他任何信息,一律用主键在另一张表中查询)。

必须先满足第一范式才能满足第二范式,必须同时满足第一第二范式才能满足第三范式。

总结

三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。