# 数据库设计三大范式-白话版

# 第一范式(1NF)

确保每个字段都是不可再分的原子值

想象一下你的数据库表格,每一个格子(字段)里只能有一个值,不能有一组值或一个列表。比如,你有一个表格记录学生的联系方式,联系方式这一栏里只能有一个电话号码,不能写多个电话号码。

例子:

不符合1NF:

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

符合1NF:

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

# 第二范式(2NF)

消除部分依赖

第二范式在第一范式的基础上,确保每个非主键字段完全依赖于主键。也就是说,不能有字段只依赖于主键的一部分,而必须依赖于整个主键。

例子: 如果我们有一个学生选课的表格,主键是由“学生ID”和“课程ID”共同组成的,那么每个非主键字段(比如成绩)必须依赖于这两个字段的组合,而不能只依赖于其中一个。

不符合2NF:

| 学生ID | 课程ID | 学生姓名 | 课程名 | 成绩 |
|-------|--------|--------|------|-----|
| 1     | 101    | 张三    | 数学  | 90  |

这里的“学生姓名”和“课程名”只依赖于“学生ID”和“课程ID”的一部分,不是组合依赖。

符合2NF: 将表分解为两个表:

    学生表:
    | 学生ID | 学生姓名 |
    |-------|--------|
    | 1     | 张三    |

    课程表:
    | 课程ID | 课程名 |
    |-------|------|
    | 101   | 数学  |

    成绩表:
    | 学生ID | 课程ID | 成绩 |
    |-------|--------|-----|
    | 1     | 101    | 90  |

# 第三范式(3NF)

消除传递依赖

第三范式在第二范式的基础上,确保每个非主键字段只依赖于主键,而不依赖于其他非主键字段。就是说,非主键字段之间不能有依赖关系。

例子: 如果我们有一个表格记录学生信息,包含学号、姓名、系别、系主任,那么系主任信息应该直接依赖于系别,而不是学号。

不符合3NF:

| 学号   | 姓名   | 系别   | 系主任  |
|-------|------|------|-------|
| 1     | 张三   | 计算机 | 王教授  |

这里的“系主任”依赖于“系别”,而“系别”又依赖于“学号”。

符合3NF: 将表分解为两个表:

    学生表:
    | 学号   | 姓名   | 系别   |
    |-------|------|------|
    | 1     | 张三   | 计算机 |

    系别表:
    | 系别   | 系主任  |
    |------|-------|
    | 计算机 | 王教授  |

通过应用这些范式,可以使数据库设计更加合理,减少数据冗余,提高数据一致性和可维护性。