1、前言
数据库设计中的范式是确保数据库结构合理、减少数据冗余和提高数据完整性的重要概念。范式越高,数据冗余越少,但查询效率可能会降低。以下是数据库设计中的前六种范式,以及它们之间的区别和应用场景。
1. 第一范式(1NF)
定义
第一范式要求数据库表中的每一列都是不可分割的基本数据项,即每个字段都包含原子值,不允许有重复的列。
下面是数据库中键和属性的定义
示例
假设有一个员工信息表,包含以下字段:
- 员工ID
- 员工姓名
- 员工联系方式(包含多个电话号码)
-
非1NF表
员工ID 员工姓名 员工联系方式 001 张三 123456789, 987654321 002 李四 111222333
1NF规范化
将联系方式拆分为单个电话号码:
员工表
员工ID | 员工姓名 |
---|---|
001 | 张三 |
002 | 李四 |
联系方式表
员工ID | 电话号码 |
---|---|
001 | 123456789 |
001 | 987654321 |
002 | 111222333 |
2. 第二范式(2NF)
定义
在满足1NF的基础上,第二范式要求非主键列必须完全依赖于主键,而不是部分依赖。
示例
假设有一个订单表,包含以下字段:
- 订单ID(主键)
- 产品ID
- 产品名称
- 产品价格
非2NF表
订单ID | 产品ID | 产品名称 | 产品价格 |
---|---|---|---|
001 | A01 | 笔记本 | 5000 |
002 | A02 | 手机 | 3000 |
2NF规范化
将产品信息拆分到单独的产品表中:
订单表
订单ID | 产品ID |
---|---|
001 | A01 |
002 | A02 |
产品表
产品ID | 产品名称 | 产品价格 |
---|---|---|
A01 | 笔记本 | 5000 |
A02 | 手机 | 3000 |
3. 第三范式(3NF)
定义
在满足2NF的基础上,第三范式要求非主键列之间不存在传递依赖。即非主键列不能依赖于其他非主键列。
示例
假设有一个学生表,包含以下字段:
- 学生ID(主键)
- 学生姓名
- 班级ID
- 班级名称
非3NF表
学生ID | 学生姓名 | 班级ID | 班级名称 |
---|---|---|---|
001 | 张三 | C01 | 一班 |
002 | 李四 | C02 | 二班 |
3NF规范化
将班级信息拆分到单独的班级表中:
学生表
学生ID | 学生姓名 | 班级ID |
---|---|---|
001 | 张三 | C01 |
002 | 李四 | C02 |
班级表
班级ID | 班级名称 |
---|---|
C01 | 一班 |
C02 | 二班 |
4. 巴斯-科德范式(BCNF)
定义
在满足3NF的基础上,BCNF进一步要求所有非平凡且非函数依赖的多值依赖都必须是超键。即每个决定因素都必须是一个候选键。
示例
假设有一个课程表,包含以下字段:
- 课程ID(主键)
- 教师ID
- 教室ID
非BCNF表
课程ID | 教师ID | 教室ID |
---|---|---|
K01 | T01 | R01 |
K02 | T02 | R02 |
BCNF规范化
将课程和教师/教室关系拆分到单独的表中:
课程表
课程ID |
---|
K01 |
K02 |
教师表
教师ID | 课程ID |
---|---|
T01 | K01 |
T02 | K02 |
教室表
教室ID | 课程ID |
---|---|
R01 | K01 |
R02 | K02 |
5. 第四范式(4NF)
定义
在满足BCNF的基础上,4NF要求不允许有多值依赖关系存在。即表中的每个非平凡的多值依赖都必须依赖于整个主键。
示例
假设有一个学生选课表,包含以下字段:
- 学生ID(主键)
- 课程ID
- 教师ID
非4NF表
学生ID | 课程ID | 教师ID |
---|---|---|
S01 | K01 | T01 |
S01 | K01 | T02 |
S02 | K02 | T02 |
4NF规范化
将学生和课程/教师关系拆分到单独的表中:
学生表
学生ID |
---|
S01 |
S02 |
选课表
学生ID | 课程ID |
---|---|
S01 | K01 |
S02 | K02 |
教师表
教师ID | 课程ID |
---|---|
T01 | K01 |
T02 | K01 |
T02 | K02 |
6. 第五范式(5NF)
定义
在满足4NF的基础上,5NF要求表中的每个连接依赖都必须表示一个有效关系。即表中的每个连接依赖都必须依赖于整个主键。
示例
假设有一个订单表,包含以下字段:
- 订单ID(主键)
- 产品ID
- 客户ID
非5NF表
订单ID | 产品ID | 客户ID |
---|---|---|
O01 | P01 | C01 |
O02 | P02 | C02 |
5NF规范化
将订单、产品和客户关系拆分到单独的表中:
订单表
订单ID |
---|
O01 |
O02 |
产品表
产品ID | 订单ID |
---|---|
P01 | O01 |
P02 | O02 |
客户表
客户ID | 订单ID |
---|---|
C01 | 001 |
C02 | 002 |