# 规范化
# 1NF(第一范式)
定义:若关系模式 的每一个分量是不可再分的数据项,则关系模式 属于第一范式。记为 。
例:学生 (学号,姓名,学院编号,学院名称,课程号,成绩)
F = {学号 → 姓名,学号 → 学院编号,学院编号 → 学院名称,(学号,课程号) → 成绩}
存在的问题:
- 数据冗余。
- 更新异常 (修改操作后数据不一致)。
- 插入异常。
- 删除异常。
学号 | 姓名 | 学院编号 | 学院名称 | 课程号 | 成绩 |
---|---|---|---|---|---|
1001 | 王芳 | D20 | 经济学院 | C001 | 76 |
1001 | 王芳 | D20 | 经济学院 | C002 | 85 |
1001 | 王芳 | D20 | 经济学院 | C003 | 63 |
1002 | 李明 | D12 | 计算机学院 | C001 | 92 |
1002 | 李明 | D12 | 计算机学院 | C002 | 89 |
1003 | 赵晗 | D12 | 计算机学院 | C002 | 78 |
1003 | 赵晗 | D12 | 计算机学院 | C003 | 86 |
1004 | 刘晓 | D25 | 管理学院 | C002 | 90 |
# 2NF(第二范式)
定义:若关系模式 ,且每一个非主属性完全依赖于码,则关系模式 。
换句话说:当 消除了非主属性对码的部分函数依赖,则称为 。
例:学生 (学号,姓名,学院编号,学院名称,课程号,成绩)
F ={学号 → 姓名,学号 → 学院编号,学院编号 → 学院名称,(学号,课程号) → 成绩}
将学生关系分解为:
学生 1 (学号,姓名,学院编号,学院名称)
学号 | 姓名 | 学院编号 | 学院名称 |
---|---|---|---|
1001 | 王芳 | D20 | 经济学院 |
1002 | 李明 | D12 | 计算机学院 |
1003 | 赵晗 | D12 | 计算机学院 |
1004 | 刘晓 | D25 | 管理学院 |
学生 2 (学号,课程号,成绩)
学号 | 课程号 | 成绩 |
---|---|---|
1001 | C001 | 76 |
1001 | C002 | 85 |
1001 | C003 | 63 |
1002 | C001 | 92 |
1002 | C002 | 89 |
1003 | C002 | 78 |
1003 | C003 | 86 |
1004 | C002 | 90 |
# 3NF(第三范式)
定义:若关系模式 中不存在这样的码 ,属性组 及非主属性 使得 成立,则关系模式 。
即:当 消除了非主属性对码的传递函数依赖,则称为 。
例:学生 1 (学号,姓名,学院编号,学院名称),但 。
将学生 1 分解为:
学生 11 (学号,姓名,学院编号)
学号 | 姓名 | 学院编号 |
---|---|---|
1001 | 王芳 | D20 |
1002 | 李明 | D12 |
1003 | 赵晗 | D12 |
1004 | 刘晓 | D25 |
学生 12 (学院编号,学院名称)
学院编号 | 学院名称 |
---|---|
D20 | 经济学院 |
D12 | 计算机学院 |
D25 | 管理学院 |
# BCNF(巴克斯范式)
定义:关系模式 ,若 且 时, 必含有码,则关系模式 。
也就是说,当 消除了主属性对码的部分函数依赖和传递函数依赖,则称为 。
结论:一个满足 的关系模式,应有如下性质:
-
所有非主属性对每一个码都是完全函数依赖;
-
所有主属性对每一个不包含它的码,也是完全函数依赖;
-
没有任何属性完全函数依赖于非码的任何一组属性。
例: 的属性表示零件号、零件名和厂商名,如果约定,每种零件号只有一个零 件名,但不同的零件号可以有相同的零件名;每种零件可以有多个厂商生产,但每家厂商生产的零 件应有不同的零件名。函数依赖集如下:
候选码为 或
分解为:
# 4NF(第四范式)
定义:关系模式 ,若对于 的每个非平凡多值依赖 且 时, 必含有码,则关系模式 。
是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。
注意:如果只考虑函数依赖,关系模式最高的规范化程度是 ,如果考虑多值依赖,关系模式最高的规范化程度是 。
例:学生 (学号,选修课程,兴趣爱好)
学生 1 (学号,选修课程)
学生 2 (学号,兴趣爱好)
书目 (,书名,作者,排名,出版社)
学号 选修课程 兴趣爱好
书目 1 (,作者,排名)
书目 2 (,书名,出版社)
# 总结
通过分解,可以将一个低一级范式的关系模式转换成若干个高一级范式的关系模式,这种过程叫做规范化
# Armstrong 公理系统
Armstrong 公理系统(函数依赖的公理系统):设关系模式 ,其中 为属性集, 是 上的一 组函数依赖,那么有如下推理规则:
- 自反律:若 ,则 为 所蕴涵。
- 增广律:若 为 所蕴涵,且 ,则 为 所蕴涵。
- 传递律:若 为 所蕴涵,则 为 所蕴涵。
根据上述三条推理规则又可推出下述三条推理规则:
- 合并规则:若 ,则 为 所蕴涵。
- 伪传递律:若 ,则 为 所蕴涵。
- 分解规则:若 ,则 为 所蕴涵。
# 函数依赖的闭包 及属性的闭包
# 函数依赖的闭包
定义:关系模式 中为 所逻辑蕴含的函数依赖的全体称为 F 的闭包,记为:。
例:
# 属性的闭包
定义:设 为属性集 U 上的一组函数依赖,,,则称 为属性集 X 关于函数依赖集 F 的闭包。
即:属性集 的闭包 是指所有能由 决定的属性集合。
# 候选码的求解方法
给定一个关系模式 , 是 的函数依赖集,那么,可以将属性分为如下四类:
- :仅出现在函数依赖集 F 左部的属性
- :仅出现在函数依赖集 F 右部的属性
- :在函数依赖集 F 左右部都出现的属性
- :在函数依赖集 F 左右部都未出现的属性
根据候选码的特性,对于给定一个关系模式 ,可以得出如下结论:
- 结论 1:若 是 L 类属性,则 必为 的任一候选码的成员。若 ,则 必为 的唯一候选码。
- 结论 2:若 是 R 类属性,则 不是 的任一候选码的成员。
- 结论 3:是 是 NLR 类属性,则 必为 的任一候选码的成员
- 结论 4:若 是 L 类和 NLR 类属性组成的属性集,若 ,则 必为 的唯一候选码
第 1 步,根据题意,将所有的属性分类:
- :只在左边出现,一定是
- :只在右边出现,一定不是
- :左右都出现,有可能是,也有可能不是
- :左右都没出现,一定是
第 2 步,将所有的 类和 类属性组合起来,设为 ,求其闭包 ,如果是全集 ,那么它就是候选码。
第 3 步,如果 不是全集 ,则依次将 LR 类属性跟 组合起来求闭包,只要其闭包是全集 ,就是候选码。
# 最小函数依赖集
如果函数依赖集 满足下列条件,则称 为一个最小函数依赖集,或称极小函数依赖集或最小覆盖。
- 中的任一函数依赖的右部仅有一个属性,即无多余的属性;
- 中不存在这样的函数依赖 ,使得 与 等价,即无多余的函数依赖;
- 中不存在这样的函数依赖 , 有真子集 使得 与 等价,即去掉各函数依赖左边的多余属性。 即:
- 所有函数依赖的右侧只有一个属性。
- 没有冗余的函数依赖。
- 所有函数依赖的左侧没有冗余的属性。
例:关系模式 ,
# 无损连接
分解及无损连接的定义:略,见教材 P288
无损连接是指将一个关系模式分解成若干个关系模式后,通过自然连接和投影等运算仍能还原到 原来的关系模式,则称这种分解为无损连接分解。
定理:关系模式 的一个分解 ,具有无损连接的充分必要的条件是: 或 。
注意:这个定理只适用于分解为两个子模式的情况,分解为多个子模式的时候不适用。
例:对给定的关系模式,,,有两个分解: 和 。请判断这两 个分解是否无损。
# 保持函数依赖
定义:设关系模式 的一个分解 ,如果 ,则称分解 保持函数依赖。
即: