数据库三范式

数据库的三范式(3NF)是数据库设计中用来规范和优化数据表结构的一系列规则。这些规则有助于减少数据冗余、消除数据异常,并提高数据库的效率和一致性。以下是对三范式的详细解释:

1. 第一范式(1NF)

定义:第一范式要求数据库表中的每一列都必须是原子性的(即不可再分),并且表中的每个字段只能包含一个值。

要求

  • 表中的每一列必须是不可再分割的独立数据项。
  • 每一行必须有唯一的标识(通常为主键)。

例子: 假设有一个包含学生信息的表:

| 学生ID | 姓名         | 电话号码            |
|--------|--------------|---------------------|
| 1      | 张三         | 123456, 789012      |
| 2      | 李四         | 345678              |

不符合 1NF电话号码 列包含多个电话号码。

转换为 1NF

| 学生ID | 姓名         | 电话号码  |
|--------|--------------|-----------|
| 1      | 张三         | 123456    |
| 1      | 张三         | 789012    |
| 2      | 李四         | 345678    |

2. 第二范式(2NF)

定义:在满足第一范式的基础上,第二范式要求每个非主属性必须完全依赖于主键,不能有部分依赖关系。

要求

  • 表必须首先满足第一范式。
  • 表中的非主属性必须完全依赖于整个主键,而不能依赖于主键的一部分。

例子: 假设有一个包含课程成绩的表:

| 学生ID | 课程ID | 成绩 | 学生姓名 |
|--------|--------|------|----------|
| 1      | 101    | 85   | 张三     |
| 2      | 102    | 90   | 李四     |

不符合 2NF学生姓名 只依赖于 学生ID,而不是整个主键 (学生ID, 课程ID)。

转换为 2NF: 拆分为两个表:

  • 学生表:
    | 学生ID | 学生姓名 |
    |--------|----------|
    | 1      | 张三     |
    | 2      | 李四     |
    
  • 成绩表:
    | 学生ID | 课程ID | 成绩 |
    |--------|--------|------|
    | 1      | 101    | 85   |
    | 2      | 102    | 90   |
    

3. 第三范式(3NF)

定义:在满足第二范式的基础上,第三范式要求表中的非主属性必须直接依赖于主键,而不能依赖于其他非主属性(即不存在传递依赖)。

要求

  • 表必须首先满足第二范式。
  • 非主属性之间不能有传递依赖。

例子: 假设有一个包含学生信息的表:

| 学生ID | 班级ID | 班级名 | 学生姓名 |
|--------|--------|--------|----------|
| 1      | 1001   | 计算机 | 张三     |
| 2      | 1002   | 数学   | 李四     |

不符合 3NF班级名 依赖于 班级ID,而 班级ID 依赖于 学生ID(传递依赖)。

转换为 3NF: 拆分为两个表:

  • 学生表:
    | 学生ID | 班级ID | 学生姓名 |
    |--------|--------|----------|
    | 1      | 1001   | 张三     |
    | 2      | 1002   | 李四     |
    
  • 班级表:
    | 班级ID | 班级名  |
    |--------|---------|
    | 1001   | 计算机  |
    | 1002   | 数学    |
    

总结

  • 第一范式 (1NF):确保每列都是原子性的,且每列数据不可分割。
  • 第二范式 (2NF):在满足 1NF 的基础上,确保每个非主属性完全依赖于主键。
  • 第三范式 (3NF):在满足 2NF 的基础上,确保非主属性不依赖于其他非主属性,消除传递依赖。

通过应用这些范式,可以帮助设计出更具逻辑性、更加规范的数据库结构,减少数据冗余和维护复杂性。