mysql_三大范式
介绍
数据库的三大范式就是数据库的表应该如何设计,应该注意什么。
第一范式
要求每一张表都有一个主键,每一个字段都不可再分。
举例:
id | username | address |
---|---|---|
1 | 张三 | 中国,北京 |
2 | 李四 | 美国,洛杉矶 |
1 | 王五 | 日本,东京 |
问题:上面的这张表没有主键,因为第一条记录和第三条记录id重复,address可以再分,不是原子性。
修正如下:
id | username | country | city |
---|---|---|---|
1 | 张三 | 中国 | 北京 |
2 | 李四 | 美国 | 洛杉矶 |
3 | 王五 | 日本 | 东京 |
注意:第一范式需要设计每张表时都要满足的,即要有主键,每个字段都具有原子性。
第二范式
在满足第一范式的基础上,非主键列要完全依赖于主键。有点抽象,看下面的例子。
酒店编号 | 房间类型编号 | 评价分数 | 房间类型 |
---|---|---|---|
1 | 01 | 80 | 单人间 |
1 | 02 | 90 | 双人间 |
2 | 01 | 70 | 单人间 |
这张表中酒店编号和房间类型编号联合做主键,评价分数完全依赖于酒店编号和房间类型编号,可是房间类型只依赖于房间类型编号,这是部分依赖,不满足第二范式。
修正:
酒店房间类型评价分数表
酒店编号 | 房间类型编号 | 评价分数 |
---|---|---|
1 | 01 | 80 |
1 | 02 | 90 |
2 | 01 | 70 |
房间类型表
房间类型编号 | 房间类型 |
---|---|
01 | 单人间 |
02 | 双人间 |
第三范式
第三范式是建立在第二范式的基础上的,要求所有的非主键字段直接依赖主键,不要产生传递依赖。
举例:
id | 入住人姓名 | 房间类型编号 | 房间类型描述 |
---|---|---|---|
01 | 张三 | 001 | 单人间 |
02 | 李四 | 002 | 双人间 |
03 | 王五 | 001 | 单人间 |
上面这张表中房间类型描述不直接依赖于id,而是通过依赖于房间类型编号这个非主键列而依赖于主键,属于传递依赖,不符合第三范式。
(房间类型描述->房间类型编号->id)
修正:
将一张表拆分为两张表
id | 入住人姓名 | 房间类型编号 |
---|---|---|
01 | 张三 | 001 |
02 | 李四 | 002 |
03 | 王五 | 001 |
房间类型编号 | 房间类型描述 |
---|---|
001 | 单人间 |
002 | 双人间 |
如果这篇博客写得有问题,欢迎在评论区留言。