数据库设计三范式
范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
三范式
第一范式(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,而不能有其他任何信息,(其他任何信息,一律用主键在另一张表中查询)。
必须先满足第一范式才能满足第二范式,必须同时满足第一第二范式才能满足第三范式。
总结
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。