Database Normal Forms — 1NF / 2NF / 3NF
First Normal Form · Atomicity
表中每一列的值必须是不可再分的原子值,不允许列中存储集合、数组或重复组。
✅ 每个字段只存一件事
✅ 没有"多值列"(逗号分隔的多个值)
✅ 没有重复列组(phone1, phone2, phone3...)
❌ 违反:一列塞多个值
| 学生ID | 姓名 | 课程 |
|---|---|---|
| 001 | 张三 | 数学, 语文, 英语 |
| 002 | 李四 | 物理, 化学 |
"课程"列包含多个值,违反原子性 违反
| 学生ID | 姓名 | 课程 |
|---|---|---|
| 001 | 张三 | 数学 |
| 001 | 张三 | 语文 |
| 001 | 张三 | 英语 |
| 002 | 李四 | 物理 |
每行只存一个课程,满足原子性 符合
Second Normal Form · Full Functional Dependency
在满足 1NF 的基础上,非主属性必须完全依赖于主键,不能只依赖主键的一部分(消除部分依赖)。
🔑 主键是复合主键时才容易出现问题
✅ 每个非主列都"需要整个主键"才能确定
❌ 违反:非主列只由主键的一部分决定
📌 单列主键自动满足 2NF
| 📦 订单ID (PK) |
🏷 商品ID (PK) |
数量 | 商品名称 | 商品单价 |
|---|---|---|---|---|
| O001 | P01 | 2 | 苹果手机 | 5999 |
| O002 | P01 | 1 | 苹果手机 | 5999 |
商品名称/单价只依赖于商品ID,而非(订单ID+商品ID) 部分依赖
| 订单ID PK | 商品ID PK | 数量 |
|---|---|---|
| O001 | P01 | 2 |
| O002 | P01 | 1 |
| 商品ID PK | 商品名称 | 单价 |
|---|---|---|
| P01 | 苹果手机 | 5999 |
Third Normal Form · No Transitive Dependency
在满足 2NF 的基础上,非主属性不能依赖于另一个非主属性(消除传递依赖)。即 A→B→C 不允许存在。
🔗 传递链:主键 → 非主A → 非主B
✅ 非主列应该直接依赖主键
❌ 违反:非主列通过另一个非主列间接依赖主键
📌 常见于"冗余信息"嵌套在同一张表
| 学生ID PK | 姓名 | 系别ID | 系别名称 | 系主任 |
|---|---|---|---|---|
| S01 | 张三 | D01 | 计算机系 | 王教授 |
| S02 | 李四 | D01 | 计算机系 | 王教授 |
| S03 | 王五 | D02 | 数学系 | 李教授 |
学生ID → 系别ID → 系别名称、系主任(传递依赖) 传递依赖
| 学生ID PK | 姓名 | 系别ID FK |
|---|---|---|
| S01 | 张三 | D01 |
| S02 | 李四 | D01 |
| S03 | 王五 | D02 |
| 系别ID PK | 系别名称 | 系主任 |
|---|---|---|
| D01 | 计算机系 | 王教授 |
| D02 | 数学系 | 李教授 |
满足更高范式必然满足低范式 · 3NF ⊂ 2NF ⊂ 1NF
每列存储单一、不可再分的原子值。
消除:重复组 & 多值列
非主属性完全依赖于整个主键。
消除:部分函数依赖
非主属性直接依赖主键,不通过其他非主列。
消除:传递函数依赖
Database Normal Forms Visualization · Dark Theme