数据库三范式

Database Normal Forms — 1NF / 2NF / 3NF

1

第一范式(1NF)— 原子性

First Normal Form · Atomicity

核心规则

表中每一列的值必须是不可再分的原子值,不允许列中存储集合、数组或重复组。

判断要点

✅ 每个字段只存一件事
✅ 没有"多值列"(逗号分隔的多个值)
✅ 没有重复列组(phone1, phone2, phone3...)
❌ 违反:一列塞多个值

❌ 违反 1NF 的表

学生ID姓名课程
001张三数学, 语文, 英语
002李四物理, 化学

"课程"列包含多个值,违反原子性 违反

✅ 符合 1NF 的表

学生ID姓名课程
001张三数学
001张三语文
001张三英语
002李四物理

每行只存一个课程,满足原子性 符合

2

第二范式(2NF)— 完全依赖

Second Normal Form · Full Functional Dependency

核心规则

在满足 1NF 的基础上,非主属性必须完全依赖于主键,不能只依赖主键的一部分(消除部分依赖)。

判断要点

🔑 主键是复合主键时才容易出现问题
✅ 每个非主列都"需要整个主键"才能确定
❌ 违反:非主列只由主键的一部分决定
📌 单列主键自动满足 2NF

❌ 违反 2NF 的表

📦 订单ID
(PK)
🏷 商品ID
(PK)
数量 商品名称 商品单价
O001P01 2 苹果手机 5999
O002P01 1 苹果手机 5999

商品名称/单价只依赖于商品ID,而非(订单ID+商品ID) 部分依赖

✅ 拆分为符合 2NF 的两张表

订单明细表

订单ID PK商品ID PK数量
O001P012
O002P011

商品表

商品ID PK商品名称单价
P01苹果手机5999
3

第三范式(3NF)— 消除传递依赖

Third Normal Form · No Transitive Dependency

核心规则

在满足 2NF 的基础上,非主属性不能依赖于另一个非主属性(消除传递依赖)。即 A→B→C 不允许存在。

判断要点

🔗 传递链:主键 → 非主A → 非主B
✅ 非主列应该直接依赖主键
❌ 违反:非主列通过另一个非主列间接依赖主键
📌 常见于"冗余信息"嵌套在同一张表

❌ 违反 3NF 的表

学生ID PK 姓名 系别ID 系别名称 系主任
S01张三D01计算机系王教授
S02李四D01计算机系王教授
S03王五D02数学系李教授

学生ID → 系别ID → 系别名称、系主任(传递依赖) 传递依赖

✅ 拆分为符合 3NF 的两张表

学生表

学生ID PK姓名系别ID FK
S01张三D01
S02李四D01
S03王五D02

系别表

系别ID PK系别名称系主任
D01计算机系王教授
D02数学系李教授

▲ 范式的包含关系(层层递进)

1NF 原子性:每列不可再分
2NF 在 1NF 基础上,消除部分依赖
3NF 在 2NF 基础上,消除传递依赖

满足更高范式必然满足低范式  ·  3NF ⊂ 2NF ⊂ 1NF

🔬

1NF — 原子性

每列存储单一、不可再分的原子值。
消除:重复组 & 多值列

🔗

2NF — 完全依赖

非主属性完全依赖于整个主键。
消除:部分函数依赖

⛓️

3NF — 无传递

非主属性直接依赖主键,不通过其他非主列。
消除:传递函数依赖

Database Normal Forms Visualization · Dark Theme