跳转至

数据库第6章 第7章 重学

学了一遍,但是理解的不是很透彻,原神的课前梳理没能很好听懂,所以重学一遍

学习资料:

【【数据库速成】画E-R图&转关系模式 期末大题 必考15分】

以及把ppt每页过一遍

E-R 模型

  • 实体集
  • 属性
  • 关系集

E-R模型的可视化:E-R图

E-R 图画法

实体集

矩形,顶部写实体集的名字,实体的所有属性列在框内下面,主键下划线

联系集

菱形,默认使用两个实体集的主码将他们配对起来

联系集也可以有自己的属性

不止可以联系两个实体集,还可以多元联系

基数约束

有箭头:表示“一”的约束,无箭头表示“多”的约束 万箭归一

三元联系中最多只能出现一个箭头,不然会有歧义,三元联系推荐使用 min..max表示法

全部参与/部分参与

用双线表示,表示该实体集内所有实体完全参与这个联系

单线则是可以不全部参与

复杂约束

0..*

  • 0代表最小基数是0,可以不参与这个联系,对应部分参与
  • *代表最大计数无限制,可以和对面实体集任意个实体产生联系

怎么找关系集的主键

  • 多对多:取两端实体的主键的并集作为关系的主键
  • 一对多/多对一:直接拿多的一段的实体主键(多方的主码是最小的超码)
  • 一对一:随便挑其中一端的主键就可以

弱实体集

依附于另一个强实体集

用双边框矩形,链接强弱实体的菱形关系也是双边框

弱实体集自己没有完整的主键,没法独立区分所有实例,必须依赖一个强实体集

弱实体集只有自己的分辨符,和所属强实体集的主键结合可以作为弱实体集的完整主键

第七章 规范化

  • 为什么要规范化
  • 函数依赖和闭包(会计算)
  • BCNF 3NF(怎么拆表)
  • 正则覆盖 4NF
  • 1NF

无损分解

拆开的几个小表,通过自然连接拼回去后,必须不多不少

\[ \Pi_{R_{1}}(r) \bowtie \Pi_{R_{2}}(r)=r \]

函数依赖

函数依赖\(\alpha \rightarrow \beta\)

其中一种特殊的:平凡依赖(废话\(AB \rightarrow A\)

可以把定义函数依赖的作用理解为:能够利用数学规则严谨定义主键

主键

  • 超键:属性\(K\)能决定表\(R\)里的其他所有属性\((K \rightarrow R)\)\(K\)就是超键
  • 候选码:首先要是个超码,并且他是最精简的,对任何\(K\)的真子集\(\alpha\)\(\alpha \rightarrow R\)都不成立

Armstrong's Axioms 推理3大定律

  • 自反律:\(\beta \subseteq \alpha\)),那么 \(\alpha \rightarrow \beta\),就是平凡依赖
  • 增广律:\(\alpha \rightarrow \beta\),那么\(\alpha \gamma \rightarrow \alpha \gamma\)
  • 传递率:如果 \(\alpha \rightarrow \beta\),并且 \(\beta \rightarrow \gamma\),那么 \(\alpha \rightarrow \gamma\)

推论

  • Union rule: \(\alpha \rightarrow \beta and \alpha \rightarrow \gamma, then \alpha \rightarrow \beta \gamma\)
  • Decomposition rule分解规则: \(\alpha \rightarrow \beta \gamma, then \alpha \rightarrow \beta and \alpha \rightarrow \gamma\)
  • Pseudotransitivity rule伪传递率: \(\alpha \rightarrow \beta and \gamma \beta \rightarrow \delta, then \alpha \gamma \rightarrow \delta\)

闭包算法

  • 函数集的闭包
  • 属性集的闭包

范式

  • 有非主属性对码的部分依赖:1NF
  • 有非主属性对码的传递依赖:2NF
  • 有主属性对非超码的函数依赖:3NF
  • 否则就是BCNF

再理一遍,妈的!

[属性原子性]-->1NF

2NF是要消除部分依赖 消除非主属性对码的部分依赖,就是要让主码全都同时有用

注意不是对主属性的部分函数依赖

如果有主属性不是主码,说明还不满足BCNF

3NF消除传递依赖 消除非主属性对非超码的传递依赖,让每个非主属性都直接依赖主码(既不部分依赖,也不传递依赖)

Warning

中间可以是主属性,但不能是超码

BCNF消除所有非主属性对非超码的依赖 一点非主属性之间的(非平凡)函数依赖都不要

为什么在一个函数依赖的左边还能不是超码

因为只是单独一个关系的左边,不一定是整个关系的超码

4NF 所有非平凡的多值依赖,决定方必须是主码

分解算法

BCNF, 4NF分解算法,一开始是一个完整的大关系模式R,每次找到一个违反范式的依赖,就把R拆成两个更小的模式

3NF是合成算法,先计算最小依赖集\(F_c\),对\(F_c\)里的每个FD\(\alpha \rightarrow \beta\)建一个模式\((\alpha \cup \beta)\)

为什么3NF就是合成算法

3NF在保证无损连接的同时,必须保持所有函数依赖,这时候,拆分容易把一个FD的\(\alpha\)\(\beta\)分到两个模式,导致依赖丢失

3NF分解算法

目标:

  • 保持函数依赖
  • 无损分解
  • 满足3NF(不存在非主属性对候选键的非平凡函数依赖(即传递依赖/部分依赖))
如何求最小依赖集
  • 右部拆成单个属性
  • 对左部有一个以上属性,看看去掉一个有没有可能推出全部,把冗余的删了
  • 一条一条看过去,消除多余的函数依赖

步骤:

  • 求最小依赖集,得到初始分解
  • 把 L 相同的依赖揉到一个表里
  • 去掉冗余子模式
  • 看所有小表里有没有任何一张表包含了原大表的完整候选码,如果没有,新建一张所有候选码的表

前3步保证了保持函数依赖

最后一步保证了无损分解

BCNF分解算法

假设\(R\)\(\alpha \rightarrow \beta\)违背了BCNF(左边不是超码)

\(R\)分解为:

  • \((\alpha \cup \beta)\)
  • \((R - (\beta - \alpha))\)

重复直到所有模式都满足BCNF

4NF分解算法

目标:

  • 消除MVD带来的冗余,把非超键决定的非平凡多值依赖分解成多个4NF模式

思路和BCNF分解算法有点像

找到违反4NF的非平凡的MVD\(\alpha \rightrightarrows \beta\)

分解成

  • \((\alpha \cup \beta)\)
  • \((R - \beta)\)

record

讲每道题要讲一下这道题的题型以及解题思路
题型 代表题
判断无损分解 7.1, 7.10, 7.12, 7.16, 7.29
从实例/约束判断函数依赖 7.2, 7.3, 7.9
Armstrong 公理证明 7.4, 7.5, 7.25, 7.27
求闭包、候选键、规范覆盖 7.6, 7.7, 7.14, 7.15, 7.28, 7.30
BCNF/3NF 分解 7.11, 7.13, 7.17, 7.21, 7.22, 7.30-7.34
范式概念辨析 7.18, 7.19, 7.20, 7.23, 7.24, 7.36-7.41
4NF/多值依赖 7.20, 7.40, 7.41, 7.42

如何判断模式分解是无损分解(lossless decomposition)

\(R \rightarrow [R_1, R_2]\) is 无损分解 when

\[ R_1 \cap R_2 \rightarrow R_1 or R_2 \]
7.13 如何判断一个分解是否依赖保留

原关系上的函数依赖,分解后能不能只靠各个子表自己的约束检查出来,而不需要把子表连接起来

找 L 在一个表,R 在另一个表里的

7.16
7.17 BCNF

找每个关系里不满足BCNF的函数依赖去拆,很好玩

7.28 求属性集闭包

result = ...

result = .... (x->x)

...