3DRX

// post

Relational Theory

关系数据理论

Updated

问题提出

数据冗余 + 增删改异常

合适 vs 不合适(斜体)

解决方式:形式化地表述数据之间的依赖关系

  • 多值依赖: x=f(y)x = f(y)
  • 函数依赖: y=f(x)y = f(x)
    • 完全依赖 vs 部分依赖
    • 传递依赖
    • 平凡 vs 非平凡

关系模式

一个五元组 R(U,D,DOM,F)R(U, D, DOM, F)

  • RR 关系名
  • UU 一组属性
  • DD 属性组 UU 中的属性所来自的域
  • DOMDOM 为属性到域的映射
  • FF 为属性组 UU 上的一组数据依赖

当且仅当 UU 上的一个关系 rr 满足 FF 时,称 rr 为关系模式 RR 上的一个关系。

函数依赖*

对属性集 R(U)R(U) 中任意一个可能的关系 rr,不可能存在两个原组 在 XX 上的属性相等,而在 YY 上的属性不等 (即对给定的 XX,有唯一确定的 YY),则称“XX 函数确定 YY” 或“YY 函数依赖于 XX”,记作 XYX \rightarrow Y

平凡与非平凡

  • XYX \rightarrow Y,但 YXY \subsetneq X非平凡的函数依赖
  • XYX \rightarrow Y,但 YXY \subseteq X平凡的函数依赖 (显然成立)

完全与部分

  • 若对 XX 的任意一个真子集 XX^{'},都有 XYX^{'} \nrightarrow Y, 则称 YYXX 完全函数依赖,记作 XFYX \stackrel{F}{\rightarrow} Y
  • YY 不完全函数依赖于 XX,则称 YYXX 部分依赖,记作 XPYX \stackrel{P}{\rightarrow} Y

传递函数依赖:满足

  1. XY  (YX)X \rightarrow Y \; (Y \subsetneq X)
  2. YXY \nrightarrow X
  3. YZY \rightarrow Z
  4. ZYZ \subsetneq Y

则称 ZZXX 传递函数依赖(transitive functional dependency), 记为 X传递ZX \stackrel{传递}{\rightarrow} Z

函数依赖集闭包

F+F^+(一个关系的集合)是关系集合 FFR(U,F)R(U, F) 上的闭包, 当且仅当 F+F^+ 中的所有关系都可由 FF 中的关系推出。

例子:

givenR=(A,B,C,G,H,I)F={  AB,  AC,  CGH,  CGI,  BH,}thenF+{  AH,  AGI,  CGHI,}\begin{aligned} given \\ R &= (A, B, C, G, H, I) \\ F &= \{ \\ & \; A \rightarrow B, \\ & \; A \rightarrow C, \\ & \; CG \rightarrow H, \\ & \; CG \rightarrow I, \\ & \; B \rightarrow H, \\ \} \\ then \\ F^+ &\supseteq \{ \\ & \; A \rightarrow H, \\ & \; AG \rightarrow I, \\ & \; CG \rightarrow HI, \\ \} \end{aligned}

属性集闭包

根据函数依赖能够推出的所有属性的集合,例子:

givenR=(A,B,C,G,H,I)F={  AB,  AC,  CGH,  CGI,  BH,}then(AG)+={A,B,C,G,H,I}\begin{aligned} given \\ R &= (A, B, C, G, H, I) \\ F &= \{ \\ & \; A \rightarrow B, \\ & \; A \rightarrow C, \\ & \; CG \rightarrow H, \\ & \; CG \rightarrow I, \\ & \; B \rightarrow H, \\ \} \\ then \\ (AG)^+ &= \{A, B, C, G, H, I\} \end{aligned}

最小覆盖 Minimal Cover

也称最小函数依赖,可能不唯一。求解方式:

  1. 右侧化为单属性(多属性的拆开写)
  2. 去掉左侧冗余属性
  3. 去掉冗余函数依赖

正则覆盖 Canonical Cover

FcF_cFF 的正则覆盖,需要满足下列条件:

  1. FF 逻辑蕴含所有 FcF_c 中的依赖
  2. FcF_c 逻辑蕴含所有 FF 中的依赖
  3. FcF_c 中不包含无关的函数依赖
  4. FcF_c 中所有函数依赖左侧是不重复的

求解正则覆盖的方式:

  1. 先求最小函数依赖
  2. 将最小函数依赖合并,如 ABA \rightarrow B, ACA \rightarrow C 合并为 ABCA \rightarrow BC

  • 候选键:可以唯一标志一个原组
  • 主键:从候选键中挑一个
  • 主属性*:包含在任何一个候选键中的属性,称为主属性 primary attribute
  • 非主属性:不包含在任何键中的属性 non-primary / non-key attribute
  • 全键:整个属性组是码,all-key

例子:以下属性中

(A, B, C, D, E)

{A, B}{B, C} 都可以唯一标志一个原组。则:

  • {A, B}{B, C} 都是候选键
  • A, B, C 都是主属性(不管 {A, B}{B, C} 哪个是主键)

基于函数依赖的关系模式范式*

1NF2NF3NFBCNF4NF5NF\begin{aligned} 1NF \supset 2NF &\supset 3NF \supset BCNF \\ &\supset 4NF \supset 5NF \end{aligned}

其中 1 NF, 2 NF, 3 NF, BCNF 是函数依赖,4 NF, 5 NF 是多值依赖。

1 NF

作为二维表,关系要符合一个最基本的条件:每个分量是不可分开的数据项

2 NF

在 1 NF 的基础上,每一个非主属性都完全函数依赖于任何一个候选键。 换言之,2 NF 中没有部分函数依赖。 如果一个关系模式不符合 2 NF,则会出现增删改异常, 因为非主属性存在对候选键的部分依赖。

关系模式不符合 2 NF 的解决方式(1 NF 转 2 NF):模式分解(拆表)

3 NF

因为存在传递函数依赖, 所以只满足 2 NF 仍然存在数据冗余和增删改异常,因此需要更严格的规范化。 因此,3 NF 的定义就是在 2 NF 的基础上,没有非主属性对候选键的传递函数依赖。 从 2 NF 转 3 NF 的方法也是拆表。如果 XYZX \rightarrow Y \rightarrow Z, 则 XX, YY 一个表,YY, ZZ 一个表。

BCNF

两种判断思路

  1. 每一个决定属性集都包含候选键(即所有箭头左边都是候选键)。
  2. 主属性内部不存在部分和传递依赖关系。

多值依赖

一个 XX 可以导出多个 YY,每个 YY 之间可能也存在关系。

定义:设 R(U)R(U) 是属性集 UU 上的一个关系模式。X,Y,ZX, Y, ZUU 的子集, 并且 Z=UXYZ = U - X - Y。关系模式 R(U)R(U) 中多值依赖 XYX \rightarrow \rightarrow Y 成立,当且仅当对 R(U)R(U) 的任一关系 rr,给定的一对 (x,z)(x, z) 值,有一组 YY 的值, 这组值仅仅决定于 xx 值而与 zz 值无关。

4 NF

把多值依赖拆解成函数依赖。

关系模型的分解

无损连接分解

R1R2R1R_1 \cap R_2 \rightarrow R_1R1R2R2R_1 \cap R_2 \rightarrow R_2, 则 R1R_1R2R_2RR 的 lossless-join decomposition 成立。

如:

R=(A,B,C,D,E)F=ABC,CDER1=(A,B,C)R2=(C,D,E)\begin{aligned} R &= (A, B, C, D, E) \\ F &= {AB \rightarrow C, C \rightarrow DE} \\ R_1 &= (A, B, C) \\ R_2 &= (C, D, E) \\ \end{aligned}

R1R_1R2R_2RR 的无损连接分解。

函数依赖保持

(F1F2...Fn)+=F+(F_1 \cup F_2 \cup ... \cup F_n)^+ = F^+

如:

F={AB,BC}F1={AB}F2={AC}\begin{aligned} F &= \{A \rightarrow B, B \rightarrow C\} \\ F_1 &= \{A \rightarrow B\} \\ F_2 &= \{A \rightarrow C\} \end{aligned}

不是函数依赖保持的分解,BCB \rightarrow C 函数依赖丢失了。

3 NF Decomposition Algorithm

将关系模型分解为第三范式,同时保持无损连接和函数依赖。

  1. FF 的 canonical cover FcF_c
  2. FcF_c 中的每一个函数依赖 αβ\alpha \rightarrow \beta, 如果不存在包含 α\alphaβ\beta 的表,拆出一张新表 Rn(α,β)R_n(\alpha, \beta)
  3. 如果拆出的子表中没有任何一个包含候选键,则将候选键作为一个单独的子表