数据库 4:函数依赖与模式分解
函数依赖 #
定义 #
设 $R(U)$ 是属性集合 $U={A_1, A_2, \cdots, A_n}$ 上的一个关系模式,$X$ 和 $Y$ 是 $U$ 的两个子集,若对 $R(U)$ 的任何一个关系 $r$ 都没有两个这样的元组,它们在 $X$ 中的属性值相等而在 $Y$ 中的属性值不等,则称 $X$ 函数决定 $Y$,或 $Y$ 函数依赖 $X$。记作 $X\to Y$。
例如:$U={学号, 姓名, 年龄, 班号, 班长, 课号, 成绩}$,则
- $学号\to{姓名, 年龄}$
- $班号\to 班长$
- ${学号, 课号}\to 成绩$
如果 $X\to Y$,但 $Y\not\subset X$,称 $X\to Y$ 是非平凡的函数依赖。
部分与完全函数依赖 #
若 $X\to Y$,且对 $X$ 的任何真子集 $X’$ 都有 $X’\not\to Y$,称 $Y$ 完全函数依赖于 $X$,记作 $X\xrightarrow{f} Y$;否则称 $Y$ 部分依赖于 $X$,记作 $X\xrightarrow{p} Y$。
传递函数依赖 #
在 $R(U)$ 中,若 $X\to Y$,$Y\to Z$ 且 $Y\not\subset X$,$Z\not\subset Y$,$Z\not\subset X$,$Y\not\to X$,则 $X\to Z$,称 $Z$ 传递依赖于 $X$。
候选键 #
对于 $R(U)$ 中的属性或属性组合,若 $K\xrightarrow{f}U$,称 $K$ 为 $R(U)$ 上的候选键。
任一候选键都可以作为 $R$ 的主键。包含在任一候选键中的属性称为主属性,其他属性称为非主属性。
逻辑蕴涵 #
设 $F$ 是 $R(U)$ 上的一个函数依赖集合,$X$ 和 $Y$ 是 $R$ 的属性子集。如果从 $F$ 中的函数依赖能推导出 $X\to Y$,称 $F$ 逻辑蕴涵 $X\to Y$,记作 $F\vDash X\to Y$。
闭包 #
被 $F$ 逻辑蕴涵的所有函数依赖集合称为 $F$ 的闭包,记作 $F^+$。如果 $F=F^+$,则 $F$ 是一个全函数依赖族,或称函数依赖完备集。
Armstrong’s Axioms #
设有关系模式 $R(U)$,$F$ 为 $R(U)$ 的一组函数依赖,有:
- A1 自反律:若 $Y\subseteq X\subseteq U$,则 $X\to Y$ 被 $F$ 逻辑蕴涵。
- A2 增广律:若 $X\to Y\in F$,$Z\subseteq U$,则 $XZ\to YZ$ 被 $F$ 逻辑蕴涵。
- A3 传递律:若 $X\to Y\in F$,$Y\to Z$,则 $X\to Z$ 被 $F$ 逻辑蕴涵。
可以由它们推出这些次要结论:
- 合并律:如果 $X\to Y$,且 $X\to Z$,则 $X\to YZ$。
- 伪传递律:如果 $X\to Y$,且 $WY\to Z$,则 $XW\to Z$。
- 分解律:若 $X\to Y$,且 $Z\subseteq Y$,则 $X\to Z$。
最小覆盖 #
如果函数依赖集合 $F$ 满足下面的条件,称 $F$ 为最小覆盖或最小依赖集:
- $F$ 中每个函数依赖,右部都是单个属性。
- $\forall X\to A\in F$,有 $F-{X\to A}$ 不等价于 $F$——即,$F$ 是最小的,去掉 $F$ 中的任何一个函数依赖都不行。
- $\forall X\to A\in F$,$Z\subset X$,有 $(F-{X\to A})\cup{Z\to A}$ 不等价于 $F$——即,$F$ 中的任何一个函数依赖都是最小的,不可以把它们的左部缩小。
构造最小依赖的方法:
- 分解——将 $X\to AB$ 分解成 $X\to A$ 和 $X\to B$,即所有依赖的右部都是单一属性。
- 去除左部多余的属性——逐一检查所有的依赖项的左部。对于左部不是单一属性的依赖项,例如 $XY\to A$,判断 $Y$ 是否多余。计算 $X^+$,如果 $X^+$ 包含 $Y$,那么 $Y$ 就是多余的,可以去掉。
- 去掉多余的依赖——对于每一个依赖项 $X\to Y$,先去掉它,然后在其他项里求 $X^+$,如果 $X^+$ 包含 $Y$,那么确实可以去掉它,否则就不能去掉。
关系范式 #
第一范式(1NF) #
若关系模式 $R(U)$ 中每个关系都不可分,则 $R(U)$ 满足第一范式,记为 $R(U)\in \text{1NF}$。即,不存在复合属性的关系模式满足 1NF。
将含有复合属性的关系中的复合属性拆分,就可以得到满足 1NF 的关系。
第二范式(2NF) #
如果满足 1NF 的关系模式 $R(U)$,每一个非主属性完全函数依赖于候选键,则 $R(U)$ 满足 2NF。
例如:
$$ R(S\#, SN, SD, CN,G) $$分别对应学号、姓名、班级、课程、成绩。候选键有 $S#$ 和 $CN$,但是因为 $S#\xrightarrow{f}{SN, SD}$,故 ${S#, CN}\xrightarrow{p}{SN, SD}$,所以不满足 2NF。
将原关系拆分成两个子关系 $R_1(S#, SN, SD)$ 和 $R_2(S#, CN, G)$,这两个子关系都满足 2NF。
第三范式(3NF) #
如果满足 2NF 的关系模式 $R(U)$ 不存在这样的情况:对于候选键 $X$,属性组 $Y$ 和非主属性 $A$,$A\not\in X$,$A\not\in Y$,$Y\not\subset X$,$Y\not\to X$,但有 $X\to Y$,$Y\to A$ 成立,则 $R(U)$ 满足 3NF。
即,某些属性依赖一些非主属性,构成传递依赖。例如:学号 $\to$ 系号 $\to$ 系主任。这样的关系就不满足 3NF。
同样,通过拆分可以构造满足 3NF 的关系。
Boyce-Codd 范式(BCNF) #
满足 1NF 的关系模式 $R(U)$,对于任何 $X\to Y$,当 $Y\not\subset X$ 时,$X$ 必含有候选键,则 $R(U)$ 满足 BCNF。
即,有不依赖于候选键的函数依赖,就不满足 BCNF。
分解规则:将左侧不含候选键的函数依赖单独组成一个关系,将含有的组成另一关系。
模式分解 #
关系模式 $R(U)$ 的分解指用 $R$ 的一组子集 $\rho={R_1(U_1), R_2(U_2), \cdots, R_k(U_k)}$ 代替它。其中 $U=U_1\cup U_2\cup\cdots\cup U_k$,并且任意两个子关系 $U_i$ 和 $U_j$ 不同。
- 无损连接性:$R$ 与 $\rho$ 在数据内容方面是否等价。
- 保持依赖性:$R$ 与 $\rho$ 在数据依赖方面是否等价。