# 1. MySQL 三大范式说说?
# 标准答案
MySQL 的三大范式是数据库设计的基本原则,分别为第一范式(1NF)、第二范式(2NF)、第三范式(3NF):
- 第一范式(1NF):确保每一列都是不可再分的原子数据。
- 第二范式(2NF):在满足 1NF 的基础上,确保每个非主键列完全依赖于主键,而不是部分依赖。
- 第三范式(3NF):在满足 2NF 的基础上,确保非主键列不依赖于其他非主键列(即消除传递依赖)。
# 答案解析
# 1️⃣ 第一范式(1NF):保证原子性
定义:数据库中的所有字段必须是不可再分割的原子值,即每一列的数据必须是最小单位,不允许存储多个值。
示例(不符合 1NF 的表):
ID | 姓名 | 电话号码 |
---|---|---|
1 | 张三 | 12345, 67890 |
上表不符合 1NF,因为电话号码字段包含多个值,应拆分成单独的行:
ID | 姓名 | 电话号码 |
---|---|---|
1 | 张三 | 12345 |
2 | 张三 | 67890 |
作用:1NF 主要目的是消除重复列,保证列的原子性,提高数据存储的一致性。
# 2️⃣ 第二范式(2NF):消除部分依赖
定义:在满足 1NF 的基础上,要求每个非主键列必须完全依赖于主键,而不能依赖于主键的一部分(适用于联合主键的情况)。
示例(不符合 2NF 的表):
订单 ID(主键) | 产品 ID(主键) | 产品名称 |
---|---|---|
1 | A | 手机 |
1 | B | 电脑 |
这里,产品名称
只依赖 产品 ID
,但 产品 ID
只是联合主键的一部分,因此违反 2NF。
优化方案: 拆分为两张表:
订单表(Order)
订单 ID(主键) 1 产品表(Product)
产品 ID(主键) 产品名称 A 手机 B 电脑 订单-产品关系表(Order_Product)
订单 ID(主键) 产品 ID(主键) 1 A 1 B
作用:2NF 主要是为了消除冗余数据,避免部分依赖导致数据更新异常。
# 3️⃣ 第三范式(3NF):消除传递依赖
定义:在满足 2NF 的基础上,要求非主键列不能依赖于其他非主键列,即消除传递依赖。
示例(不符合 3NF 的表):
学号(主键) | 姓名 | 班级 ID | 班级名称 |
---|---|---|---|
1 | 张三 | 101 | 三年二班 |
这里 班级名称
依赖 班级 ID
,但 班级 ID
不是主键,而是 学号
的一个属性,因此违反 3NF。
优化方案: 拆分为两张表:
学生表(Student)
学号(主键) 姓名 班级 ID 1 张三 101 班级表(Class)
班级 ID(主键) 班级名称 101 三年二班
作用:3NF 主要是减少数据冗余,消除传递依赖,提高数据一致性。
# 总结
范式 | 主要目标 | 主要规则 |
---|---|---|
1NF | 确保数据的原子性 | 字段值必须是不可再分的最小数据单元 |
2NF | 消除部分依赖 | 非主键列必须完全依赖主键,不能只依赖部分主键 |
3NF | 消除传递依赖 | 非主键列只能依赖主键,不能依赖于其他非主键列 |