模式分解与模式设计
1.模式的分解
一个十分抽象的定义:
但我们分解的一个目的,就是
既要保持函数依赖,又要保持无损连接性
如果一个分解具有无损连接性,则它能够保证不丢失信息。
如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况。
1.1 无损连接(Lossless join)
又一个抽象的定义,注意表示符号为
ρ
\rho
ρ
通俗点说,就是分解之后的几个关系进行自然连接,要和分解之前的关系模式相同。
具有无损连接性的分解保证不丢失信息
无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题
定理:注意“或”“其中一个”
该定理的一个例题:
在这个例题当中,R1和R2两个模式的公共属性为A,而A可以推出B,函数确定了模式R1
1.2 保持依赖(Preserve dependency)
保持关系模式分解等价的另一个重要条件是关系模式的函数依赖集在分解后仍在数据库模式中保持不变。可以用于减轻和解决各种异常情况
定义:
即函数依赖集在分解前后不变
严格定义:
若F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖Fi所逻辑蕴含,则称关系模式R的这个分解是保持函数依赖的(Preserve dependency)。
投影的定义:通俗点说,就是分解后还存在的函数依赖集
保持函数依赖的分解定义:分解前的函数依赖的闭包与分解后的各模式函数依赖的闭包的并集相等
判断保持依赖的例题:
综合判断分解是否恰当的例题:先判断无损,然后判断保持函数依赖(求分解后的各模式函数依赖的闭包的并集)
2.模式设计
2.1 明确概念
2.1.1 范式
范式是对关系的不同数据依赖程度的要求
2.1.2 主属性与非主属性
主属性:候选码中的属性
非主属性:不包含在任何一个候选码中的属性称为非主属性
2.2 1NF 第一范式
定义:关系中每一分量不可再分(原子性,不可以有多值属性)。即不能以集合、序列等作为属性值
2.3 2NF 第二范式
定义:若R∈1NF,且每个非主属性完全依赖于R的每一个候选关键字,则称R∈2NF。重点是消除非主属性对码的部分依赖(即消除只依赖候选码中的一部分的那些)
分解为2NF方法
采用投影运算消除部分依赖,例
R可以通过R1和R2自然连接恢复
更为系统化的方法:
①找出基本函数依赖
②找出主码
③找出函数依赖集的正则覆盖
④找出正则覆盖中为部分函数依赖的进行分解
例题:
解答:
不良特性分析:
- 插入异常:如果系中没有学生,则有关系的信息就无法插入
- 删除异常:如果学生全部毕业了,则在删除学生信息的同时有关系的信息也随之删除了
- 更新异常:如果学生转系,不但要修改SD,还要修改DEAN,如果换系主任,则该系每个学生元组都要做相应修改
- 数据冗余:每个学生都存储所在系的系主任的信息
2.4 3NF 第三范式
定义:如果R的任何一个非主属性都不传递依赖于它的任何一个侯选关键字,则称R是第三范式,简记为3NF。重点是消除非主属性对码的传递依赖。
另外的定义:下面三项至少一项成立
1,a—>b是平凡的函数依赖,即b属于a。
2,a—>b,其中a是关系模式R的一个超码。
3,b - a中的每个属性A都包含于R的一个候选码。(这一项成立不是BCNF)
分解为3NF方法
①求出最小正则覆盖Fc
②对于Fc中每个函数依赖
α
\alpha
α→
β
\beta
β:
构建模式Ri=
α
+
β
\alpha+\beta
α+β(即两个集合的并集)
③如果Ri中都不包含候选码,再构造出一个Ri+1等于R的任意候选码
④去除包含于其他模式的Ri,剩余Ri即为所求
例题:
解:
注意:如果是求正则覆盖,则第一个函数依赖要跟第三个函数依赖合并
但这里题目是说要基本函数依赖
不良特性分析:
- 插入异常:如果没有学生选修某位老师的任课,则该老师担任课程的信息就无法插入
- 删除异常:删除学生选课信息,会删除掉老师的任课信息
- 更新异常:如果老师所教授的课程有所改动,则所有选修该老师课程的学生元组都要做改动
- 数据冗余:每位学生都存储了有关老师所教授的课程的信息
症由:TNO→CNO,BCNF会消除
2.5 BCNF
即:BC范式要求所有非平凡函数依赖都形如X→Y,其中X是一个超码
归根结底是在3NF基础上消去主属性的传递函数依赖。
另外的定义:以下两项至少一项成立
a—>b是平凡的函数依赖,即b属于a。
a—>b,其中a是关系模式R的一个超码。
算法伪代码:
例子:
缺陷:BCNF不一定能保持依赖(可能会丢掉多个主码推出另外一个主码的函数依赖)
丢掉函数依赖实例:
3.总结
分解为3NF,BCNF的过程所涉及的概念(正则覆盖等)可以参考BCNF和第三范式的分解算法