核心要求:每一项数据都是不可分割的最小单元
❌ 违规设计:
包裹号 | 收件信息 | 寄件信息 |
---|---|---|
001 | 张三,北京朝阳区 | 李四,上海浦东新区 |
问题:收件信息和寄件信息混合在同一个字段
✅ 符合1NF的设计:
包裹号 | 收件人 | 收件地址 | 寄件人 | 寄件地址 |
---|---|---|---|---|
001 | 张三 | 北京朝阳区 | 李四 | 上海浦东新区 |
核心要求:每个非主键字段都要完全依赖整个主键
假设主键:(包裹号, 驿站编号)
❌ 违规设计:
包裹号 | 驿站编号 | 驿站地址 | 包裹重量 | 驿站经理 |
---|---|---|---|---|
001 | Z-01 | 北京朝阳A街 | 2.5kg | 王经理 |
问题:
驿站地址
和驿站经理
只依赖驿站编号
,与包裹号
无关✅ 符合2NF的拆分:
包裹表(主键:包裹号+驿站编号)
| 包裹号 | 驿站编号 | 包裹重量 |
|--------|----------|----------|
| 001 | Z-01 | 2.5kg |
驿站表(主键:驿站编号)
| 驿站编号 | 驿站地址 | 驿站经理 |
|----------|-------------|----------|
| Z-01 | 北京朝阳A街 | 王经理 |
核心要求:非主键字段之间不能有依赖关系
❌ 违规设计:
员工ID | 姓名 | 所属部门 | 部门电话 |
---|---|---|---|
1001 | 张三 | 财务部 | 010-88881234 |
问题:
部门电话
依赖于所属部门
,而不是直接依赖主键员工ID
员工表(主键:员工ID)
| 员工ID | 姓名 | 部门ID |
|--------|--------|--------|
| 1001 | 张三 | D-01 |
部门表(主键:部门ID)
| 部门ID | 部门名称 | 部门电话 |
|--------|----------|--------------|
| D-01 | 财务部 | 010-88881234 |
设计学生成绩表,初始设计如下:
学号 | 学生姓名 | 课程号 | 课程名称 | 学分 | 成绩 | 系主任 |
---|---|---|---|---|---|---|
2023001 | 张三 | C001 | 数据库原理 | 3 | 92 | 李主任 |
2023001 | 张三 | C002 | 软件工程 | 2 | 85 | 李主任 |
2023002 | 李四 | C001 | 数据库原理 | 3 | 78 | 王主任 |
假设主键是(学号 + 课程号)
❌ 部分依赖:
问题表现:
假设已满足2NF的结构:
学生表
学号 | 学生姓名 | 所属院系 | 系主任 |
---|---|---|---|
2023001 | 张三 | 计算机系 | 李主任 |
❌ 传递依赖:
系主任 → 所属院系 → 学号
(系主任不直接依赖主键学号)
问题表现:
学生表(主键:学号)
| 学号 | 学生姓名 | 所属院系 |
|---------|----------|----------|
课程表(主键:课程号)
| 课程号 | 课程名称 | 学分 |
|--------|------------|------|
成绩表(主键:学号+课程号)
| 学号 | 课程号 | 成绩 |
|---------|--------|------|
效果:
院系表(主键:院系名称)
| 院系名称 | 系主任 |
|----------|--------|
新版学生表(主键:学号)
| 学号 | 学生姓名 | 所属院系 |
|---------|----------|----------|
修改课程信息只影响课程表 院系表(主键:院系名称)
| 院系名称 | 系主任 |
|----------|--------|
新版学生表(主键:学号)
| 学号 | 学生姓名 | 所属院系 |
|---------|----------|----------|
维度 | 第二范式(2NF) | 第三范式(3NF) |
---|---|---|
针对问题 | 消除部分依赖(主键的部分决定数据) | 消除传递依赖(非主键字段间接依赖) |
拆分方式 | 拆分复合主键中的冗余数据 | 拆分存在间接关联的属性集合 |
典型场景 | 订单明细含商品描述信息 | 员工表包含部门详细信息 |
错误后果 | 同一商品在不同订单重复存储基础信息 | 修改部门信息需更新大量员工记录 |
日常生活比喻: