数据依赖的公理系统
- 公理系统是模式分解的基础
- Armstrong公理系统(找到推出结果的感觉就ok,没必要死记)
- 自反律:X确定他自己的一部分
- 增广律
- 传递律
- 合并规则
- 伪传递规则
- 分解规则
- 闭包(不可求):在关系模式R<U,F>中,F所蕴含的函数依赖全体,记作F+
- 属性集闭包(可求):在给定F+的情况下,去求X可以确定哪些属性
- 关于闭包的引理:
- 求属性集闭包的算法
- 最小依赖集(Fm)
- 为模式分解做准备
- 右部为单属性
- 没有多余的函数依赖
- 决定因素没有多余的属性(XB->Y,X->Y;B就是多余的)
- 极小化过程:求最小依赖集
- 逐一检查右部是否为单属性,若不是,则拆开
- 逐一检查各个函数依赖,若该依赖可以由其他推出,若有,去除该函数依赖
- 去掉多余属性
模式的分解
- 模式分解理论基础
- 希望分解后能继续携带完整信息
- 希望函数依赖集合依赖数量比较少
- 希望获得一个可以反映所有需求的最小函数依赖集合
- 三种模式分解等价的定义
- 无损连接性
- 关系模式R<U,F>被分解为若干模式,R与R1,R2,R3,......,Rn自然连接结果相等,则称具有无损连接性
- 不一定能解决数据操作异常问题
- 保持函数依赖
- 关系模式R<U,F>被分解为若干模式,F所逻辑蕴含的函数依赖一定可以由分解得到的某个关系模式中的函数依赖Fi所逻辑蕴含,则称保持函数依赖
- 无损连接性和保持函数依赖
- 无损连接性
- 举例:
- 分解算法
- 算法6.2
- 判断分解的无损连接性
- 举例:判断分解ρ={AB,AE,EC,DBC,AC}是否具有无损连接性?
- 算法6.2
-
-
- 第一步:构建一张表,N行为模式分解之后变成了多少关系就有多少行,K列为原关系的所有属性;接着将表中元素填满。比如对于第一行AB来说,用到了第一列和第二列属性,所以就填a1,a2,没用到就填b13等(1,3表示行和列)
- 第二步:根据函数依赖关系改变表中元素的值。比如对于第一个函数依赖A->D,找到A列中元素一样的行(至少两个才有意义),由于依赖关系,我们需要修改D列上的元素,如果元素全为b,将其下标行号修改为最小行号;如果元素中有a,将所有行全改为a
-
-
-
- 第三步:遍历完所有的函数依赖,判断假如有一行全为a,则说明分解保持无损连接性,否则再遍历
- 快速方法:完全不考虑b和下标,对于每个行来说,哪一个属性被使用,就在该行填a;再根据函数依赖在其他列填a,比如A确定D,就在D列填a
-
-
- 算法6.3(※)
- 转化为3NF的保持函数依赖的分解
- 第一步:求最小函数依赖集Fm
- 第二步:将没有在函数依赖集中出现的属性去掉,其余的不变组成U0
- 第三步:按照完全相同的左部,对函数依赖集进行分组,判断一下分完组的属性有没有重复的情况,比如:BCD包含BD,去掉重复的部分,算法结束
- 算法6.4(※)
- 转换为3NF既有无损连接性又保持函数依赖的分解
- 第一步:按照算法6.3分解之后的关系并上原来关系的码,比如ρUR*
- 第二步:判断合并之后的关系里面有没有重复或者包含的属性,有的话就去掉,和算法6.3去重相似
- 算法6.3(※)