6.1 问题的提出#

关系模式是一个5元组
R U,D,DOM,F
U 属性
D 域
DOM 属性到域的映射
F 依赖
在本章中将关系模式看作 三元组 R U,D 属性-依赖

1NF 每一个分量是不可分割的数据项

定义:
数据依赖是 一个关系内部属性与属性的一种约束关系
这种关系是通过属性间的相等与否体现出来的数据间相关联系

数据依赖的类型: 函数依赖 functional dependency fd
多值依赖 multi-Valued dependency mvd

最原始的数据模式 会出现以下问题:

数据冗余

更新异常( 某系更换主任后,要修改所有学生的信息)

插入异常(某系刚成立,还没有学生 ,无法插入)

删除异常(学生全部毕业,系主任也没有了)

6.2 规范化#

6.2.1 函数依赖##

X->Y X确定Y

X->Y 但是Y不在X里面 叫做 非平凡的函数依赖
X-> Y 但是Y在X里面 叫做平凡的函数依赖(一般不予考虑)

x->Y X 称为 决定因素 determinant

定义:
x->Y 但是没有任何一个X的子集有 X'->Y Y 对 X 完全函数依赖 X-f->Y

如果存在相应的子集 那么 Y对X 部分函数依赖 X-p->Y
依赖存在传递性

Y 依赖X X不依赖Y
Z 依赖 Y

Z传递依赖X

6.2.2 码##

码是关系模式中一个重要的概念
K-f->U K为R的候选码

如果K-p->U 那么K是超码 Surpkey

候选码是最小的超码

候选码多于一个 选定一个为主码

整个属性组是码 称为全码all-key

6.2.3 范式##

schema decompositon 分解为高一级的范式
过程称为规范化 normalization

6.2.4 2nf##

每一个非主属性完全依赖于一个候选码 (满足2nf)

问题的关键在于 所有非主属性必须对码 完全函数依赖

6.2.5 3nf##

不存在传递依赖的关系模式

6.2.6 bcnf##

每一个决定因素都包括码

一个 学生 教师 课程 S-T-J 满足 3nf 没有传递依赖 但是 T 作为决定因素 T决定J 却不是码 码是 S-T 或者S-J
一个课程对应多个老师多个学生

6.2.7 多值依赖##

R(U)
XYZ 是U的子集

如果 Z= U -X-Y

并且 给定的x,z 有一个Y 并且与z的值无关 那么记为 X->->Y 多值依赖
如果z 为空 称为平凡的多值依赖

1 多值依赖是 对称的 X->->Y 那就就有 X->->Z
2 多值依赖具有传递性 X->->Y Y->->Z X->->Y-Z
3 函数依赖可以看作多值依赖的特殊情况

6.2.8 4nf

对于R中的每个非平凡多值依赖,如果X->->Y 那么X中包含码

不允许有非平凡的多值依赖

只允许平凡的多值依赖

6.2.9 规范化小结

消除非主属性对码的部分函数依赖

消除非主属性对码的传递函数依赖

消除主属性对码的 部分和传递依赖

消除非平凡(且非函数依赖)的多值依赖

6.3 数据依赖的公里系统

Armstrong
自反率
增广率
传递率

合并规则
伪传递规则
分解规则
引理6.1 X->A1A2A3... 的充分必要条件是X->Ai 成立

F所逻辑蕴含的函数依赖的全体称为 F的闭包 closure
证明暂略

6.4 模式的分解

分解具有 无损连结性

分解要保持函数依赖

算法 6.2 判断是否无损连接
每一行对应一个子关系
每一列对应一个属性
列表法

定理 6.5

对于 RUF 的一个分解 R1 U1 F1 R2 U2 F2 如果有 U1交U2 -> U1 -U2 公共属性可推出 一个中的一切

6.4.3 模式分解的几个具体的算法

算法 6.3 保持3NF函数依赖的处理 合成法
1 对于 RUF 中F 的函数依赖做极小化处理
2 找出所有不在 F 中的属性, U0 这些 U0 单独构成一个子关系 U中去掉U0
3 如果X->A 属于 F 并且 AX=U 算法停止
4 否则 将F 按照左边属性 分类 将每一组分类 都构成一个子关系 3NF 不存在对码的传递依赖和部分依赖
这里分组的时候 有可能一个组 被另外一个组 包含 ,就把被包含的组去掉即可

算法6.4 保持无损连接性 的3nf 分解

在6.3 的基础上添加一个子关系 R(XFx) 这里X是一个码

如果 原来分解的子模式中有一个 U 属于X 那么就去掉那个子模式
如果有一个 U包含 X 那就不添加这个子模式

这样就保证了 无损连结性 ( 因为保证了 其中有一个 子模式中 包含 码) 通过这个嘛 我们就可以无损连接整个关系模式了

算法 6.4 转换为 bcnf 的分解方式
分解法
对于每一个不是 bcnf 的 子模式 存在 X->A X不是码
就吧 X->A分解出去
bcnf : 所有的决定因素 都是码

算法 6.6 达到 4nf的分解
先分解到 bcnf ,然后对于每一个非平凡的多值依赖 X->->Y 进行分解 X,Y X,Z Z=U-X-Y