关系数据理论
6.1 规范化
6.1.1 函数依赖
(R(U)是属性集U上的关系模式,X,Y是U的子集)X函数确定Y或Y函数依赖于X,记作 X → Y X\to Y X→Y
只能根据语义来确定一个函数依赖,例如:姓名->年龄这个函数依赖只有在该部门没有同名人的条件下成立,如果允许有同名人,则年龄就不再函数依赖于姓名
一些术语和记号:
-
X
→
Y
X\to Y
X→Y,但
Y
⊈
X
Y\nsubseteq X
Y⊈X,则称
X
→
Y
X\to Y
X→Y是非平凡的函数依赖,反之称为平凡的函数依赖
-
平凡依赖是必然成立的,我们总是讨论非平凡的函数依赖
-
- 若 X → Y X \to Y X→Y,则称X是决定因素
- 若 X → Y X \to Y X→Y, Y → X Y \to X Y→X,则记作 X ← → Y X \leftarrow \to Y X←→Y
- 若Y不函数依赖于X,记作 X ↛ Y X \nrightarrow Y X↛Y
- 完全函数依赖: Y依赖于X但是不依赖于X的任何一个真子集,记作 X → F Y X \to^F Y X→FY
- 部分函数依赖: Y对X的子集依赖,记作 X → P Y X\to ^PY X→PY
- 传递函数依赖:
X
→
Y
(
Y
⊈
X
)
,
Y
↛
X
,
Y
→
Z
,
Z
⊈
Y
X \to Y(Y \nsubseteq X), Y\nrightarrow X, Y \to Z,Z \nsubseteq Y
X→Y(Y⊈X),Y↛X,Y→Z,Z⊈Y
-
这里加上条件 Y ↛ X Y \nrightarrow X Y↛X,因为如果 Y → X Y\to X Y→X,则 X ← → Y X\leftarrow \to Y X←→Y,实际上就是 X → 直接 Y X \to ^{直接} Y X→直接Y,是直接函数依赖而不是传递函数依赖
-
6.1.2 码
- 候选码: 设K为R(U,F)中的属性或属性集合,若U对K完全函数依赖,则K为R的候选码
- 超码: U部分依赖于K。候选码是最小的超码
- 主码:若候选码多余一个,则选定其中的一个为主码
- 主属性: 包含在任何一个候选码中的属性
- 全码:整个属性组是码
- 外码:关系模式R中属性或属性组X并非R的码,但X是另外一个关系模式的码,则称X是R的外码
6.1.3 范式
6.1.3.1 2NF
每一个非主属性完全函数依赖于(不部分依赖于)任何一个候选码
6.1.3.2 3NF
每一个非主属性既不不传递依赖于码,也不部分依赖于码
6.1.3.3 BCNF
每一个决定因素都包含码
若3NF只有唯一候选吗,则一定为BCNF
全主属性一定可达3NF,全码一定可达BCNF
6.1.3.4 多值依赖
R(U)是属性集U上的一个关系模式,X,Y,Z是U的子集,并且U=X+Y+Z,如果一个X的值决定一组Y的值,则多值依赖 X → → Y X\to\to Y X→→Y成立
- 平凡多值依赖: Z为空集,即U=X+Y,且多值依赖 X → → Y X\to\to Y X→→Y成立
- 非平凡多值依赖: Z非空
函数依赖可以看作是多值依赖的特殊情况
多值依赖 X → → Y X\to\to Y X→→Y若在R(U)上成立,不能断言对于任何 Y ′ ⊂ Y Y'\subset Y Y′⊂Y有 X → → Y ′ X\to\to Y' X→→Y′成立
6.1.3.5 4NF
不允许有非平凡且非函数依赖的多值依赖
4NF所允许的非平凡的多值依赖实际上就是函数依赖
若一个关系模式为4NF,则必为BCNF
4NF中:
- 非平凡的多值依赖
- x含码 -> 多值依赖也是函数依赖
- 平凡的多值依赖
- x含码 -> 是函数依赖
- x不含码 -> 不是函数依赖
6.1.3.6 例题:判断范式
6.2 数据依赖的公理系统armstrong公理系统
F逻辑蕴涵 X → Y X \to Y X→Y:关系模式R<U, F>中,函数依赖 X → Y X\to Y X→Y成立
- 有效性:由F出发依据公理推出的每个函数依赖一定在 F + F^+ F+中
- 完备性: F + F^+ F+中每个函数依赖一定可以由F出发根据公理推导出来
6.2.1 推理规则
对R<U, F>有以下推理规则:
- 自反律:
- 若 Y ⊆ X ⊆ U Y \subseteq X \subseteq U Y⊆X⊆U,则 X → Y X \to Y X→Y为 F F F 所蕴涵
- 子集对全集一定有平凡函数依赖
- 自反律得到的函数依赖均是平凡的函数依赖,自反律的使用并不依赖于F
- 增广律:
- 若 X → Y X \to Y X→Y为 F F F 所蕴涵,且 Z ⊆ U Z \subseteq U Z⊆U,则 X Z → Y Z XZ \to YZ XZ→YZ 为 F F F 所蕴涵
- 左右各加了一个属性
- 传递律:
- 若 X → Y X \to Y X→Y及 Y → X Y \to X Y→X 为 F F F 所蕴涵,则 X → Z X \to Z X→Z为F所蕴涵
- 如果 Y → X , X → Y Y \to X, X\to Y Y→X,X→Y,则符合传递律但不符合传递函数依赖
- 合并规则
- 由 X → Y X\to Y X→Y, X → Z X \to Z X→Z,有 X → Y Z X \to YZ X→YZ
- 伪传递规则
- 由 X → Y X \to Y X→Y, W Y → Z WY \to Z WY→Z,有 X W → Z XW \to Z XW→Z
- 分解规则
- 由 X → Y X \to Y X→Y, Z ⊆ Y Z \subseteq Y Z⊆Y,有 X → Z X \to Z X→Z
6.2.2 闭包
F + F^+ F+:F的闭包,F所逻辑蕴含的函数依赖的全体
6.2.2.1 求闭包的步骤
- 所有空集依赖
- 自身依赖,然后增广律扩充
- 原本关系增光扩充
X F + X^+_F XF+:属性集X关于函数依赖集F的闭包(左边全是X的函数依赖)
求候选码:一组属性集的闭包是全集
6.2.2.2 求属性集X闭包的算法
- 令 X 0 = X X^0 = X X0=X, i = 0 i=0 i=0
- 求B,此时B为函数依赖中左边为 X i X^i Xi的函数依赖的右边部分的集合
- X i + 1 = B ∪ X i X^{i+1} = B \cup X^i Xi+1=B∪Xi
- 判断 X i + 1 = X i X^{i+1} = X^i Xi+1=Xi
- 如果相等或等于U,则 X i X^i Xi就是 X F + X^+_F XF+,算法终止
- 若否,则 i = i + 1 i = i+1 i=i+1,返回第二步(就是把B合并进去了)
不在函数依赖右边出现的属性一定是候选码组成部分
6.2.2.3 等价与最小覆盖
- 函数依赖集等价
- 如果 G + = F + G^+ = F^+ G+=F+,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价
- 最小依赖集/最小覆盖
F
m
F_m
Fm
- F中任一函数依赖的右部仅含有一个属性
- 不存在冗余的函数依赖
- 函数依赖左部要尽可能简(不能再用子集替代)
6.2.2.4 求最小依赖集的方法
- 判断右边,分解右端
- 去冗余函数依赖
- 判断左边,左边如果有多属性值,用子集代替之后判断是否保持函数依赖
F m 不一定是唯一的 F_m不一定是唯一的 Fm不一定是唯一的
例:
6.3 模式分解
投影: 函数依赖集合 X → Y ∣ X → Y ∈ F + ∧ X Y ⊆ U i \\{ X \to Y|X\to Y\in F^+ \wedge XY\subseteq U_i\\} X→Y∣X→Y∈F+∧XY⊆Ui 的一个覆盖 F i F_i Fi 叫做 F F F 在属性 U i U_i Ui 上的投影
- 无损连接性
保证不丢失信息 - 保持函数依赖性
减轻或解决各种异常情况
题型1:判断是否保持函数依赖和无损连接性
例一
例二 (有隐藏的函数依赖,注意判断)
题型2:模式分解
判断是否需要分解的理由(一般是分解到3NF)
范式太低,会存在插入、修改、删除数据的异常
1:分解为3NF
2:分解为BCNF
例一
例二 (损失了函数依赖)
3:分解为4NF
例一
例二 (损失函数依赖)
6.3.1 总结
- 若要求分解具有无损连接性,模式分解一定可达4NF(函数依赖范畴一定可达BCNF)
- 若要求分解保持函数依赖,模式分解一定可达3NF,不一定可达BCNF
- 若要求分解既保持函数依赖又具有无损连接性,模式分解一定可达3NF,不一定可达BCNF