MYSQL数据库设计三大范式:
第一范式(1NF):
当关系模式R的所有属性都不能再分解为更基本的数据单位时,这个时候称R是满足第一范式的简称1NF
就是说表中的每列属性不可再分
例如:
| Id | 姓名 | 身高体重 | 年龄 | 。。。。。 |
|---|---|---|---|---|
| 1 | 小博 | 185/140 | 22 | 。。。。。 |
身高体重是两个属性,违反第一范式,不能划分为同一个列
符合第一范式的设计:
| Id | 姓名 | 身高 | 体重 | 年龄 | 。。。。。 |
|---|---|---|---|---|---|
| 1 | 小博 | 185 | 140 | 22 | 。。。。。 |
第二范式(2NF):
第二范式首先要满足第一范式并且表中非主键列不存在对主键不依赖或者部分依赖,确保每个列都和主键相关。一般因为是存在多个主键,或者存在复合主键,因此需要拆表
例如:
| 学号 | 学科 | 成绩 | 学科学分 | 。。。。。 |
|---|---|---|---|---|
| 1 | 数学 | 100 | 10 | 。。。。。 |
存在复合主键(学号,学科),而学科学分却只依赖分部主键-学科,不符合第二范式
符合第二范式的设计:
| 学号 | 学科 | 成绩 |
|---|---|---|
| 1 | 数学 | 100 |
| 学科 | 学科学分 |
|---|---|
| 数学 | 10 |
第三范式(3NF):
第三范式首先满足第二范式,并且表中的列不存在对非主键列的传递依赖,每列都和主键列直接相关,而不是间接相关
简单理解:在第二范式的基础上,表中的非主属性不可以存在依赖关系
例如:
| 学号(主键) | 姓名 | 性别 | 年级 | 专业 | 班主任姓名 | 班主任性别 | 班主任年龄 |
|---|---|---|---|---|---|---|---|
| 202001 | 张三 | 男 | 大一 | 计算机科学与技术 | 老张 | 男 | 33 |
| 202002 | 李四 | 男 | 大二 | 网络工程 | 老李 | 男 | 34 |
| 202003 | 王舞 | 女 | 大三 | 软件工程 | 老王 | 男 | 35 |
\
上表中,我们可以看到表中的非主属性都依赖于(学号),满足了第二范式。 但是,(班主任性别、年龄)这两个属性是直接依赖于(班主任姓名)这一属性的,与(学号)属于间接依赖。 这就导致了表中的非主属性存在着依赖关系,不符合第三范式。
符合第三范式的设计:
| 学号(主键) | 姓名 | 性别 | 年级 | 专业 |
|---|---|---|---|---|
| 202001 | 张三 | 男 | 大一 | 计算机科学与技术 |
| 202002 | 李四 | 男 | 大二 | 网络工程 |
| 202003 | 王舞 | 女 | 大三 | 软件工程 |
| 班主任姓名(主键) | 班主任性别 | 班主任年龄 |
|---|---|---|
| 老张 | 男 | 33 |
| 老李 | 男 | 34 |
| 老王 | 男 | 35 |
将原表拆分为两张表:学生表与班主任表,在满足第二范式的同时,表中的非主属性都不存在着依赖关系,故符合第三范式
注意: 在设计过程中,三大范式不是需要严格遵守的,只是提供了一种设计规范
详细的参考文章: