内容纲要
数据库设计中的“范式”(Normal Forms),具体是关系型数据库设计的四个阶段,也就是我们常说的第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BC范式(BCNF)。
以下是这几个范式的核心要求,我们详细解释一下:
🧱 一、第一范式(1NF):原子性
要求:
- 所有字段值都是不可再分的原子值。
- 每个字段只包含一个值,不能有重复组或数组。
反面例子:
学号 | 姓名 | 课程 |
---|---|---|
101 | 张三 | 数据库, 操作系统 |
修正为 1NF:
学号 | 姓名 | 课程 |
---|---|---|
101 | 张三 | 数据库 |
101 | 张三 | 操作系统 |
🔗 二、第二范式(2NF):非主键完全依赖主键
前提:必须先满足1NF。
要求:
- 所有非主键字段必须完全依赖于主键,而不是部分依赖。
- 适用于复合主键的情况。
反面例子:
学号+课程号(主键) | 姓名 | 课程名 | 成绩 |
---|---|---|---|
101, C01 | 张三 | 数据库 | 90 |
这里“姓名”只依赖“学号”,不依赖“课程号”,属于部分依赖。
修正为 2NF:
拆分成两个表:
学生表:
学号(主键) | 姓名 |
---|---|
101 | 张三 |
选课表:
学号+课程号(主键) | 课程名 | 成绩 |
---|---|---|
101, C01 | 数据库 | 90 |
🔄 三、第三范式(3NF):消除传递依赖
前提:必须先满足2NF。
要求:
- 非主键字段之间不能有传递依赖,即非主键字段A依赖非主键字段B,而B又依赖主键。
反面例子:
学号(主键) | 姓名 | 系名 | 系主任 |
---|---|---|---|
101 | 张三 | 计科系 | 李老师 |
“系主任”依赖于“系名”,而“系名”又依赖于“学号”,形成传递依赖。
修正为 3NF:
拆分成两个表:
学生表:
学号(主键) | 姓名 | 系ID(外键) |
---|---|---|
101 | 张三 | 1 |
系表:
系ID(主键) | 系名 | 系主任 |
---|---|---|
1 | 计科系 | 李老师 |
🧯 四、BC 范式(BCNF)
前提:比3NF更严格,是3NF的增强版。
要求:
- 每一个决定因素都必须是候选键。
- 消除了主键中的“部分依赖”和“传递依赖”的所有可能。
示例:
如果存在一个字段能决定另一个字段,但它不是候选键,那就不符合BCNF。
✅ 总结表
范式 | 核心要求 | 目标 |
---|---|---|
1NF | 字段原子化,不可再分 | 消除重复组 |
2NF | 非主键完全依赖主键 | 消除部分依赖 |
3NF | 消除非主键间的传递依赖 | 消除传递依赖 |
BCNF | 每个决定因素都是候选键 | 更严格的无冗余结构 |