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 双人间

如果这篇博客写得有问题,欢迎在评论区留言。

posted @ 2023-06-11 15:58  蜀道,难  阅读(53)  评论(0编辑  收藏  举报