引言
数据库表结构设计有一套规范。设计出的表结构应尽量避免不必要地冗余,同时要确证灵活性。只需要遵守公认的范式,就可以达到较合理地设计效果。同时,这些范式也是评价一个数据库表结构设计是否合理的标准。
范式:
1NF、2NF、3NF、BCNF,它们是一级包含一级的关系,即必须先满足第一范式,再判断是否满足第二范式。如果已经满足第二范式,再判断是否满足第三范式。1NF、2NF、3NF、BCNF是逐级递进的。只有符合范式要求的表结构设计才能说是合理的设计。
下面以学生成绩管理数据库来讲解这些范式:
1NF
表示属性值是不可分割
比如学生信息表t_student:
student |
---|
201501Mike |
student字段不满足第一范式。因为该属性值可以再分割变为:
id | name |
---|---|
201501 | Mike |
2NF
非主要的属性,必须完全依赖主要的属性,不能部分依赖
比如选课信息表:
选课人 | 课程 | 上课老师 | 教材 | 老师职称 |
---|---|---|---|---|
Mike | 数据库 | Jack | 《数据库原理》 | 副教授 |
(选课人、课程)才能确定这张表的唯一行。所以它是主属性。但是教材只与课程有关。教材并不依赖选课人。
那么问题来了,假设1万个选课行,那么教材发生修改就需要修改这1万行。而且如果某一门课,没人选,那如何插入呢?
所以这不符合2NF。解决方案是拆分成过个表。
扫描二维码关注公众号,回复:
2183323 查看本文章
3NF
表示非主属性不要依赖于其他非主属性
还以上述选课表为例。
选课人 | 课程 | 上课老师 | 老师职称 |
---|---|---|---|
Mike | 数据库 | Jack | 副教授 |
同样,主属性是(选课人,课程),但是老师职称跟选课人没关系。只和上课老师相关。所以这就是非主属性依赖其他非主属性。不满足第三范式。