数据库第6章 第7章 重学
学了一遍,但是理解的不是很透彻,原神的课前梳理没能很好听懂,所以重学一遍
学习资料:
【【数据库速成】画E-R图&转关系模式 期末大题 必考15分】
以及把ppt每页过一遍
E-R 模型
- 实体集
- 属性
- 关系集
E-R模型的可视化:E-R图
E-R 图画法
实体集
矩形,顶部写实体集的名字,实体的所有属性列在框内下面,主键下划线
联系集
菱形,默认使用两个实体集的主码将他们配对起来
联系集也可以有自己的属性
不止可以联系两个实体集,还可以多元联系
基数约束
有箭头:表示“一”的约束,无箭头表示“多”的约束 万箭归一
三元联系中最多只能出现一个箭头,不然会有歧义,三元联系推荐使用 min..max表示法
全部参与/部分参与
用双线表示,表示该实体集内所有实体完全参与这个联系
单线则是可以不全部参与
复杂约束
0..*
0代表最小基数是0,可以不参与这个联系,对应部分参与*代表最大计数无限制,可以和对面实体集任意个实体产生联系
怎么找关系集的主键
- 多对多:取两端实体的主键的并集作为关系的主键
- 一对多/多对一:直接拿多的一段的实体主键(多方的主码是最小的超码)
- 一对一:随便挑其中一端的主键就可以
弱实体集
依附于另一个强实体集
用双边框矩形,链接强弱实体的菱形关系也是双边框
弱实体集自己没有完整的主键,没法独立区分所有实例,必须依赖一个强实体集
弱实体集只有自己的分辨符,和所属强实体集的主键结合可以作为弱实体集的完整主键
第七章 规范化
- 为什么要规范化
- 函数依赖和闭包(会计算)
- BCNF 3NF(怎么拆表)
- 正则覆盖 4NF
- 1NF
无损分解
拆开的几个小表,通过自然连接拼回去后,必须不多不少
函数依赖
函数依赖\(\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
7.13 如何判断一个分解是否依赖保留
原关系上的函数依赖,分解后能不能只靠各个子表自己的约束检查出来,而不需要把子表连接起来
找 L 在一个表,R 在另一个表里的
7.16
7.17 BCNF
找每个关系里不满足BCNF的函数依赖去拆,很好玩
7.28 求属性集闭包
result = ...
result = .... (x->x)
...