# 1. MySQL 三大范式说说?

# 标准答案

MySQL 的三大范式是数据库设计的基本原则,分别为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)

  1. 第一范式(1NF):确保每一列都是不可再分的原子数据。
  2. 第二范式(2NF):在满足 1NF 的基础上,确保每个非主键列完全依赖于主键,而不是部分依赖。
  3. 第三范式(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。

优化方案: 拆分为两张表:

  1. 订单表(Order)

    订单 ID(主键)
    1
  2. 产品表(Product)

    产品 ID(主键) 产品名称
    A 手机
    B 电脑
  3. 订单-产品关系表(Order_Product)

    订单 ID(主键) 产品 ID(主键)
    1 A
    1 B

作用:2NF 主要是为了消除冗余数据,避免部分依赖导致数据更新异常

# 3️⃣ 第三范式(3NF):消除传递依赖

定义:在满足 2NF 的基础上,要求非主键列不能依赖于其他非主键列,即消除传递依赖。

示例(不符合 3NF 的表):

学号(主键) 姓名 班级 ID 班级名称
1 张三 101 三年二班

这里 班级名称 依赖 班级 ID,但 班级 ID 不是主键,而是 学号 的一个属性,因此违反 3NF。

优化方案: 拆分为两张表:

  1. 学生表(Student)

    学号(主键) 姓名 班级 ID
    1 张三 101
  2. 班级表(Class)

    班级 ID(主键) 班级名称
    101 三年二班

作用:3NF 主要是减少数据冗余,消除传递依赖,提高数据一致性

# 总结

范式 主要目标 主要规则
1NF 确保数据的原子性 字段值必须是不可再分的最小数据单元
2NF 消除部分依赖 非主键列必须完全依赖主键,不能只依赖部分主键
3NF 消除传递依赖 非主键列只能依赖主键,不能依赖于其他非主键列