关系数据理论
一、概述
1.1 问题的提出
关系数据库逻辑设计的核心问题:针对一个具体问题,如何构造一个适合于它的数据库模式。
数据库逻辑设计的工具:关系数据库的规范化理论。
1.2 关系模式的形式化定义
关系模式由五部分组成,是一个五元组:
| 符号 | 含义 |
|---|---|
| 关系名 | |
| 组成该关系的属性名集合 | |
| 属性组 | |
| 属性向域的映象集合 | |
| 属性间数据的依赖关系集合 |
简化表示:通常简化为三元组
1.3 数据依赖
数据依赖是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系。它是:
- 现实世界属性间相互联系的抽象
- 数据内在的性质
- 语义的体现
数据依赖的类型:
- 函数依赖(Functional Dependency, FD)
- 多值依赖(Multivalued Dependency, MVD)
- 其他
1.4 数据依赖对关系模式的影响(引例)
学校数据库示例:
关系模式:
语义:
- 一个系有若干学生,一个学生只属于一个系
- 一个系只有一名主任
- 一个学生可以选修多门课程,每门课程有若干学生选修
- 每个学生所学的每门课程都有一个成绩
函数依赖 F:
存在的问题:
| 问题类型 | 说明 | 举例 |
|---|---|---|
| ① 数据冗余太大 | 浪费大量存储空间 | 每个系主任姓名重复出现 |
| ② 更新异常 | 维护数据完整性代价大 | 某系更换主任需修改所有相关元组 |
| ③ 插入异常 | 该插的数据插不进去 | 新系无学生时无法存入系和主任信息 |
| ④ 删除异常 | 不该删的数据被删除 | 学生全部毕业时连带删除系和主任信息 |
结论:Student 不是一个好的关系模式。好的模式应满足:不发生插入/删除/更新异常,数据冗余尽可能少。
解决方法:通过分解关系模式来消除不合适的数据依赖。
二、规范化(Normalization)
规范化理论用来改造关系模式,通过分解关系模式来消除不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
2.1 函数依赖
2.1.1 函数依赖的定义
定义 6.1:设
说明:
- 函数依赖不是指某个或某些关系实例,而是指 R 的所有关系实例均要满足的约束条件
- 函数依赖是语义范畴的概念,只能根据数据语义来确定
- 数据库设计者可对现实世界作强制规定
示例:
, , - 若不允许重名,则
, , , (性别不决定年龄)
记法:
且 ,记作 不函数依赖于 ,记作
2.1.2 平凡函数依赖与非平凡函数依赖
| 类型 | 条件 | 说明 |
|---|---|---|
| 非平凡 | 反映新语义,通常讨论此类 | |
| 平凡 | 必然成立,不反映新语义 |
例:关系
- 非平凡:
- 平凡:
,
2.1.3 完全函数依赖与部分函数依赖
定义 6.2:在关系模式
若
【例题】:在关系
- 由于
, - 因此
( 完全函数依赖于 )
2.1.4 传递函数依赖
定义 6.3:在关系模式
注:如果
【例题】:关系
, 传递函数依赖于
2.2 码(Key)
2.2.1 候选码与主码
定义 6.4:设
- 主属性:包含在任何一个候选码中的属性
- 非主属性:不包含在任何候选码中的属性
- 全码(ALL KEY):所有属性共同构成候选码
2.2.2 外部码(Foreign Key)
定义 6.5:关系模式 R 中属性或属性组 X 并非 R 的码,但 X 是另一个关系模式的码,则称 X 是 R 的外部码(外码)。
主码和外部码一起提供了表示关系间联系的手段。
2.3 范式(Normal Form)
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。
范式种类(从低到高):
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BC 范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
包含关系:
2.4 第二范式(2NF)
2.4.1 第一范式(1NF)
定义:如果一个关系模式
第一范式是对关系模式的最起码要求,不满足
2.4.2 2NF 的定义
定义 6.6:若关系模式
2.4.3 2NF 示例分析
关系模式:
Sloc 为学生住处,假设每个系的学生住在同一个地方。
函数依赖:
码:
问题:
SLC 存在的问题:
| 问题 | 说明 |
|---|---|
| 插入异常 | 未选课的学生信息无法插入(课程号是主属性) |
| 删除异常 | 学生退选最后一门课导致整个元组被删除 |
| 数据冗余 | 学生选修 10 门课,Sdept 和 Sloc 重复存储 10 次 |
| 修改复杂 | 转系需修改该学生所有元组的 Sdept 和 Sloc |
解决方法:将 SLC 分解为两个关系模式,消除部分函数依赖。
分解:
— 码为 — 码为
分解后:
注意:将一个 1NF 分解为多个 2NF 只能减轻问题,不能完全消除异常和数据冗余。
2.5 第三范式(3NF)
2.5.1 3NF 的定义
定义 6.7:关系模式
通俗理解:若
如果
2.5.2 3NF 示例分析
关系模式:
函数依赖:
(传递依赖)
问题:
解决方法:将 SL 分解为两个关系模式,消除传递函数依赖。
分解:
— 码为 — 码为
分解后:
注意:将一个 2NF 分解为多个 3NF 也只能在一定程度上解决问题,不能完全消除异常和数据冗余。
2.6 BC 范式(BCNF)
2.6.1 BCNF 的定义
定义 6.8:设关系模式
BCNF 的性质:
- 每一个决定属性集(因素)都包含(候选)码
- R 中的所有属性(主属性和非主属性)都完全函数依赖于码
- 若
,则 - 若
,则 不一定
2.6.2 BCNF 示例分析
关系模式:
- S:学生,T:教师,J:课程
- 每一教师只教一门课
- 每门课由若干教师教
- 某一学生选定某门课,就确定了一个固定的教师
- 某个学生选修某个教师的课就确定了所选课的名称
函数依赖:
分析:
( 、 、 都是主属性, 和 都是候选码) : , 是决定属性集,但 不是候选码
解决方法:将 STJ 分解为两个关系模式
2.6.3 3NF 与 BCNF 的关系
- 如果
,必定有 - 如果
,且 只有一个候选码,则 必属于
2.6.4 BCNF 关系模式的性质
- 所有非主属性都完全函数依赖于每个候选码
- 所有主属性都完全函数依赖于每个不包含它的候选码
- 没有任何属性完全函数依赖于非码的任何一组属性
2.7 多值依赖与第四范式(4NF)
2.7.1 问题的提出
关系模式:
:课程, :教师, :参考书 - 某一门课程由多个教师讲授,他们使用相同的一套参考书
Teaching 的码:
存在的问题(
| 问题 | 说明 |
|---|---|
| 数据冗余大 | 有多少名任课教师,参考书就要存储多少次 |
| 插入复杂 | 增加一名教师时,需为每本参考书插入一个元组 |
| 删除复杂 | 去掉一本参考书时,需删除每个教师的对应元组 |
| 修改复杂 | 修改一本参考书时,需修改所有教师的对应元组 |
产生原因:存在多值依赖。
2.7.2 多值依赖的定义
定义 6.9:设
等价的元组定义:在
示例:
2.7.3 多值依赖的性质
- 对称性:若
,则 ,其中 - 传递性:若
, ,则 - 函数依赖是特殊情况:若
,则 - 并规则:若
, ,则 - 交规则:若
, ,则 - 差规则:若
, ,则 ,
2.7.4 多值依赖与函数依赖的区别
| 区别 | 函数依赖 | 多值依赖 |
|---|---|---|
| 有效性 | 与属性集范围无关,在 | 与属性集范围有关;在 |
| 子集性质 | 若 | 若 |
2.7.5 第四范式(4NF)
定义 6.10:关系模式
- 如果
,则 - 4NF 不允许有非平凡且非函数依赖的多值依赖
- 4NF 允许的是函数依赖(本身也是非平凡多值依赖)
【例题】:
- 存在非平凡多值依赖
,且 不是候选码
解决方法:将 Teaching 分解为
— 是平凡多值依赖 — 是平凡多值依赖
2.8 规范化小结
关系模式规范化基本步骤:
1NF
↓ 消除非主属性对码的部分函数依赖
2NF
↓ 消除非主属性对码的传递函数依赖
3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF规范化的基本思想:
- 消除不合适的数据依赖
- 使各关系模式达到某种程度的"分离"
- 采用"一事一地"的模式设计原则:让一个关系描述一个概念、一个实体或者实体间的一种联系
- 规范化实质上是概念的单一化
重要提示:不能说规范化程度越高的关系模式就越好。在设计数据库模式结构时,必须结合现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。
三、数据依赖的公理系统
3.1 逻辑蕴涵与闭包
定义 6.11:关系模式
定义 6.12:被
示例:
3.2 Armstrong 公理系统
设
三条基本公理
| 公理 | 符号 | 含义 |
|---|---|---|
| 自反律(Reflexivity) | 若 | 平凡函数依赖必然成立 |
| 增广律(Augmentation) | 若 | 两边加相同属性仍成立 |
| 传递律(Transitivity) | 若 | 函数依赖具有传递性 |
导出推理规则
| 规则 | 内容 | 说明 |
|---|---|---|
| 合并律 | 若 | 右边可合并 |
| 分解律 | 若 | 右边可分解 |
| 伪传递律 | 若 | 带条件的传递 |
有效性与完备性
- 有效性:用 Armstrong 公理从
中导出的函数依赖一定在 中 - 完备性:
中的每一个函数依赖,必定可由 根据 Armstrong 公理推出
引理 6.1:
3.3 属性集的闭包
定义 6.13:设
称为属性集
引理 6.2:
核心思想:判定
算法 6.1:求属性集闭包
输入:属性集
- 令
。 - 对
中每个函数依赖 ,当 发生变化时重复检查。 - 若
,则令 。 - 输出
。
最多需要
闭包计算例题
【例 1】:
求
| 步骤 | 所用依赖 | result |
|---|---|---|
| 初始 | — | AG |
| 1 | ||
| 2 | ||
| 3 | ||
| 4 |
结果:
思考:AG 是码吗? 若且唯若
【例 2】:
求
| 步骤 | 所用依赖 | result |
|---|---|---|
| 初始 | — | AB |
| 1 | ||
| 2 | ||
| 3 |
结果:
【例 3】:
求
| 步骤 | 所用依赖 | result |
|---|---|---|
| 初始 | — | AB |
| 1 | ||
| 2 | ||
| 3 |
结果:
判定函数依赖是否蕴含于 F
步骤:
- 计算闭包:根据
计算 - 判断:若
,则 蕴含于 中,否则不蕴含
【例 4】:
判断
解:
,所以 蕴含于 。 ,所以 不蕴含于 。
3.4 函数依赖集的等价与覆盖
3.4.1 等价性
定义 6.14:
- 函数依赖集
,若 ,则称 与 等价
3.4.2 最小覆盖(正则覆盖)
定义 6.15:满足下列条件的函数依赖集
- 单属性化:
中任一函数依赖 , 必是单属性 - 无冗余化:
中不存在这样的函数依赖 ,使得 与 等价 - 既约化:
中不存在这样的函数依赖 ,在 中有真子集 ,使得 与 等价
算法 6.2:求解最小覆盖
步骤:
① 单属性化:逐个检查
② 无冗余化:逐个检查
③ 既约化:逐个检查
最小覆盖例题
【例 5】:
解:
- 已为单属性,无需单属性化
- 先检查无冗余化:
- 检查
: , , ,不能删除 - 检查
: , , ,可以删除 - 检查
: , , ,不能删除 - 检查
: , , ,不能删除
- 检查
- 已为既约化形式
所以
【例 6】:
解:
- 单属性化:已完成
- 无冗余化:依次检查各函数依赖
- 既约化(关键步骤):检查
- 先用
代替 : , ,不能用 代替 - 先用
代替 : , ,可以用 代替 - 所以
被 替代
- 先用
最终:
四、模式的分解
4.1 分解的定义
定义 6.16:关系模式
满足:
- 不存在
为 在 上的投影
定义 6.17:函数依赖集合
4.2 分解的等价标准
三种模式分解的等价定义:
- 分解具有无损连接性
- 分解保持函数依赖
- 分解既要保持函数依赖,又具有无损连接性
4.3 分解示例
关系模式:
第一种分解(错误)
分解:
问题:丢失大量信息,例如无法查询 95001 学生所在系或所在宿舍。
结论:既不具有无损连接性,也未保持函数依赖,不是等价分解。
第二种分解(有损)
分解:
问题:
结论:保持了函数依赖,但不具有无损连接性。
第三种分解(无损但未保持依赖)
分解:
结果:
结论:具有无损连接性,但未保持函数依赖(
第四种分解(既无损又保持依赖,最优)
分解:
结论:既具有无损连接性,又保持了函数依赖。
4.4 具有无损连接性的模式分解
定义:关系模式
注意:具有无损连接性的分解保证不丢失信息,但不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题。
4.5 保持函数依赖的模式分解
定义:设关系模式
4.6 分解标准之间的关系
| 分解性质 | 能达到的最高范式 |
|---|---|
| 仅要求无损连接 | 一定能达到 4NF |
| 仅要求保持函数依赖 | 一定能达到 3NF,但不一定达到 BCNF |
| 既无损连接又保持函数依赖 | 一定能达到 3NF,但不一定达到 BCNF |
两个独立的标准:
- 具有无损连接性的分解不一定能够保持函数依赖
- 保持函数依赖的分解也不一定具有无损连接性
本章小结
本章围绕关系数据理论展开,重点掌握函数依赖、码、范式、Armstrong 公理系统和模式分解。
关键内容
- 数据依赖:函数依赖和多值依赖是关系模式中属性间语义联系的形式化表示。
- 码与范式:通过候选码、主码、主属性等概念判断关系模式满足 1NF、2NF、3NF、BCNF 和 4NF 的程度。
- 规范化过程:从 1NF 到 4NF 逐步消除部分函数依赖、传递函数依赖、主属性相关依赖以及非平凡多值依赖。
- Armstrong 公理系统:用于函数依赖的推理,属性集闭包可用于判断某个函数依赖是否由依赖集逻辑蕴涵。
- 最小覆盖与模式分解:通过最小覆盖简化依赖集,通过模式分解改善关系模式,并关注无损连接和保持函数依赖。
核心要点
- 规范化理论是数据库设计的指南和工具,不是机械追求越高范式越好。
- 好的模式分解应尽量同时满足无损连接和保持函数依赖。
- 实际设计需要在规范化程度、查询效率和应用需求之间取得平衡。
关键术语
函数依赖, 多值依赖, 候选码, 主码, 主属性, 1NF, 2NF, 3NF, BCNF, 4NF, Armstrong 公理, 属性集闭包, 最小覆盖, 无损连接, 保持函数依赖。