1 概述
1.1 规范化
- 范式建模:关系型数据库设计的方法之一,就是设计满足适当范式的模式。
- 范式级别: 1NF < 2NF < 3NF < BCNF < 4NF < 5NF ,其中满足高级范式的一定满足低级范式,但反之不一定。
- 实际开发中,并非范式级别越高越好,一般满足 3NF 即可,范式程度越高,其优缺点有
- 优点:数据冗余减少,数据完整性维护简单
- 缺点:查询变得复杂,需关联更多的表,可能影响查询效率
1.2 相关名词
中文名 | 英文名 | 解释 |
---|---|---|
属性 | Attribute | 事务的特征。如:学生用学号、姓名、性别等属性来描述 |
域 | Domain | 属性的取值范围。如:性别的域为 {男,女} |
目或度 | Degree | R(D1, D2, …, Dn)。R 表示关系的名字,n 是关系的目的或度 |
码 | key | 能 唯一标识 一个元组的属性或属性组,可以由 候选码 或 主码 构成 |
候选码 | Candiate Key | 能 唯一标识 一个元组的属性或属性组,最少 的属性集合 |
主属性 | Prime Attribute | 包含在 任何候选码 中的属性称为主属性。反之称为非主属性 |
主码 | Primary Key | 或称 主键,若一个关系中有多个候选码,则选定其中一个为主码 |
外码 | Foreign Key | 或称 外键 |
扩展:关于 码、主码、候选码 之间的关系图
1.3 函数依赖
- 在一个关系 R 中,X 和 Y 是关系 R 的两个属性集合
- 部分函数依赖
- 定义:存在 X → Y,若 X 1 X^1 X1 是 X 的真子集,存在 X 1 X^1 X1 → Y,则称 Y 部分函数依赖于 X
- 举例:参考图1,通过 AB 能得到 C,通过 A 也能得到 C
- 完全函数依赖
- 定义:存在 X → Y,若 X 1 X^1 X1 是 X 的真子集,但对每一个 X 1 X^1 X1 都有 X 1 X^1 X1 !→ Y,则称 Y 完全依赖于 X
- 举例:参考图1,通过 AB 能得到 C,但是 A、B 单独得不出 C
- 传递函数依赖
- 定义:存在 X → Y(Y !→ X),Y → Z,则称 Z 传递依赖于 X
- 举例:参考图2,通过 A 能得到 B,通过 B 能得到 C(B 不能得到 A),则可以通过 A 得到 C
2 范式分类
范式类型 | 简称 | 特征 | 特性 |
---|---|---|---|
第一范式 | 1NF | 属性不可再分 (无重复的列) | 原子性 |
第二范式 | 2NF | 1NF + 消除 非主属性 对于 码 的 部分函数依赖 (复合主键) | 唯一性 |
第三范式 | 3NF | 2NF + 消除 非主属性 对于 码 的 传递函数依赖 | 传递性 |
BC 范式 | BCNF | 3NF + 消除 主属性 对于 码 的 部分函数依赖 和 传递函数依赖 (复合主键) | 唯一性 和 传递性 |
2.1 第一范式 1NF
所有的 关系型数据库 都满足 1NF,故不用纠结
反例:“电话” 列重复
姓名 | 电话 | |
---|---|---|
张三 | 15811112222 | |
李四 | 13966669999 | 0755-1234 |
正例:消除重复的列(拆分)
姓名 | 电话 | 座机 |
---|---|---|
张三 | 15811112222 | |
李四 | 13966669999 | 0755-1234 |
2.2 第二范式 2NF
主键列:【学号,课程】,关系模式如下
R1:学号,课程 → 学分
R2:课程 → 学分
反例:存在 “非主属性(学分)” 对于 “码(学号,课程)” 的 “部分函数依赖”
学号 | 课程 | 成绩 | 学分 |
---|---|---|---|
0001 | 英语 | 120 | 3 |
正例:消除 …
学号 | 课程 | 成绩 |
---|---|---|
0001 | 英语 | 120 |
课程 | 学分 |
---|---|
英语 | 3 |
2.3 第三范式 3NF
主键列:【学号】,关系模式如下
R1:学号 → 课程 → 课程名称
反例:存在 “非主属性(课程号、课程名称)” 对于 “码(学号)” 之间的 “传递函数依赖”
学号 | 课程号 | 课程名 |
---|---|---|
0001 | 01 | 语文 |
正例:消除 …
学号 | 课程号 |
---|---|
0001 | 01 |
课程号 | 课程名 |
---|---|
01 | 语文 |