数据库范式
1. 第一范式(1NF)
定义
- 原子性:表中每个字段不可再分
- 数据类型一致性:同一列数据类型相同
- 主键约束:每行数据有唯一标识
案例
不符合1NF的表:
员工表(员工ID, 姓名, 联系方式[电话,邮箱])
- 问题:联系方式字段包含多个值
符合1NF的表:
员工表(员工ID, 姓名, 电话, 邮箱)
2. 第二范式(2NF)
定义
- 满足1NF
- 消除部分依赖:非主属性必须完全依赖主键
案例
不符合2NF的表:
订单表(订单ID, 产品ID, 产品名称, 数量, 单价)
- 主键:(订单ID, 产品ID)
- 部分依赖:产品名称 → 产品ID(不依赖整个主键)
符合2NF的表:
订单表(订单ID, 产品ID, 数量, 单价)
产品表(产品ID, 产品名称)
3. 第三范式(3NF)
定义
- 满足2NF
- 消除传递依赖:非主属性不能依赖其他非主属性
案例
不符合3NF的表:
学生表(学号, 系别, 系主任)
- 传递依赖:学号 → 系别 → 系主任
符合3NF的表:
学生表(学号, 系别)
系别表(系别, 系主任)
4. BC范式(BCNF)
定义
- 满足3NF
- 每个非平凡函数依赖的左边都是候选键
- 消除主属性对非候选键的依赖
案例
不符合BCNF的表:
课程表(课程ID, 教师ID, 课程名称)
- 函数依赖:
- 课程ID → 课程名称
- 教师ID → 课程ID(一个教师只教一门课)
- 候选键:[课程ID], [教师ID]
- 问题:教师ID → 课程ID的左边不是候选键
符合BCNF的表:
课程表(课程ID, 课程名称)
教师表(教师ID, 课程ID)
范式对比总结
范式 | 核心要求 | 消除的依赖类型 | 案例场景 |
---|---|---|---|
1NF | 字段原子性 | 复合字段 | 拆分联系方式字段 |
2NF | 非主属性完全依赖主键 | 部分依赖 | 订单与产品信息分离 |
3NF | 非主属性无传递依赖 | 传递依赖 | 学生与系别信息分离 |
BCNF | 每个函数依赖左边都是候选键 | 主属性对非候选键的依赖 | 教师与课程关系规范化 |
规范化步骤示例
原表结构:
学生选课表(学号, 课程号, 成绩, 教师, 教师办公室)
函数依赖:
- (学号, 课程号) → 成绩
- 课程号 → 教师
- 教师 → 教师办公室
规范化过程:
- 1NF:确保字段不可再分(已满足)
- 2NF:
- 学生选课表(学号, 课程号, 成绩)
- 课程表(课程号, 教师)
- 3NF:
- 学生选课表(学号, 课程号, 成绩)
- 课程表(课程号, 教师)
- 教师表(教师, 教师办公室)
- BCNF:
- 学生选课表(学号, 课程号, 成绩)
- 课程表(课程号, 课程名称)
- 教师表(教师ID, 课程号)
- 办公室表(教师ID, 办公室)
实际应用建议
- 1NF:所有关系型数据库必须满足
- 2NF/3NF:业务系统最常用的范式级别
- BCNF:适用于数据一致性要求极高的场景(如金融系统)
- 反规范化:为提高查询性能,可适当保留冗余数据(需权衡读写频率)