第一范式(1NF):原子性
核心要求:表中的每个字段都必须是不可再分的原子值。
违反示例:
| 用户ID | 姓名 | 联系方式 |
|---|---|---|
| 1 | 张三 | 手机:13800138000, 邮箱:zs@example.com |
问题分析:"联系方式"字段包含多个信息,不具备原子性。
符合 1NF 的写法:
| 用户ID | 姓名 | 手机号 | 邮箱 |
|---|---|---|---|
| 1 | 张三 | 13800138000 | zs@example.com |
第二范式(2NF):消除部分函数依赖
前提条件:
- 已满足 1NF
- 表必须有主键(通常是复合主键)
核心要求:所有非主属性必须完全依赖于整个主键,而不能只依赖主键的一部分。
违反示例(订单明细表):
| 订单ID | 商品ID | 商品名称 | 数量 | 单价 |
|---|---|---|---|---|
| 1001 | P001 | 鼠标 | 2 | 50 |
问题分析:主键为(订单ID, 商品ID),但"商品名称""单价"只依赖于"商品ID",存在部分依赖。
符合 2NF 的写法:
表1:订单明细表
| 订单ID | 商品ID | 数量 |
|---|---|---|
| 1001 | P001 | 2 |
| 1001 | P002 | 1 |
| 1002 | P001 | 5 |
- 主键:(订单ID, 商品ID)
- 依赖说明:"数量"完全依赖于整个复合主键(必须同时知道是哪个订单和哪个商品,才能确定购买数量)。
表2:商品表
| 商品ID | 商品名称 | 单价 |
|---|---|---|
| P001 | 鼠标 | 50 |
| P002 | 键盘 | 80 |
- 主键:商品ID
- 依赖说明:"商品名称"和"单价"完全依赖于单一主键"商品ID"。
第三范式(3NF):消除传递函数依赖
前提条件:已满足 2NF。
核心要求:非主属性之间不能存在依赖关系,即非主属性必须直接依赖于主键,不能通过其他非主属性间接依赖。
违反示例(员工表):
| 员工ID | 姓名 | 部门ID | 部门名称 | 部门地点 |
|---|---|---|---|---|
| E001 | 李四 | D10 | 技术部 | 北京 |
问题分析:依赖关系为 员工ID → 部门ID → 部门名称、部门地点,存在传递依赖。
符合 3NF 的写法:
表1:员工表
| 员工ID | 姓名 | 部门ID |
|---|---|---|
| E001 | 李四 | D10 |
| E002 | 王五 | D20 |
- 主键:员工ID
- 依赖说明:"姓名"直接依赖于"员工ID";"部门ID"仅作为外键关联部门信息,员工表中不再存储部门的具体属性。
表2:部门表
| 部门ID | 部门名称 | 部门地点 |
|---|---|---|
| D10 | 技术部 | 北京 |
| D20 | 市场部 | 上海 |
- 主键:部门ID
- 依赖说明:"部门名称"和"部门地点"直接依赖于"部门ID",与员工信息彻底解耦。