数据库第八章
问题
数据冗余度大 插入异常 删除异常
规范化理论
规范化途径
竖向规范化:分界为若干关系模式。
水平规范化:分解为若干子集。
函数依赖
怎么找?:
看表,判断A是否决定B
如果A全都不同,A一定有可能决定B
如果B全都相同,A一定有可能决定B
如果存在不同的B,且对应的A相同,则A一定不决定B。
如果存在相同的A,对应不同的B,则A也一定不决定B。
如何找到所有函数依赖?
先考虑决定因素和依赖因素都是单个属性的情况:
假如有n个属性,那么就有
A
n
2
A_n^2
An2个需要考虑的函数依赖。
PPT27页是不是打错了?
函数依赖反映同一个关系中两个属性子集之间的依存关系。这也是一种数据完整性约束。
因此我们可以通过对数据完整性约束条件的分析来寻找属性之间的函数依赖关系。
非平凡的函数依赖 X->Y且Y不包含于X
完全函数依赖X决定Y且X真子集均不决定Y,反之叫部分函数依赖
Armstrong公理系统
基本规则:自反、增广、传递
扩充规则:分解、合并、伪传递
FD的逻辑蕴涵
函数依赖集F的闭包:F+
自反:Y是X子集,则X决定Y。证明:若t1[X]=t2[X],显然t1[Y]=t2[Y]。
增广:X决定Y,则XZ决定YZ。证明:t1[X]=t2[X],则t1[Y]=t2[Y],则若t1[XZ]=t2[XZ],则t1[X]=t2[X],t1[Z]=t2[Z],且t1[Y]=t2[Y],故t1[YZ]=t2[YZ]。
传递:X决定Y,Y决定Z,则X决定Z。
分解:X决定YZ,则X决定Y。自反加传递即可证明。
合并:X决定Y且X决定Z,则X决定YZ。
伪传递规则:X决定Y,WY决定Z,则WX决定Z。
FD逻辑蕴涵 通过已有的函数依赖能推出的函数依赖,逻辑蕴涵于已有的函数依赖集F。
函数依赖集F的闭包 就是把所有没写出来但能推出来的全写出来。
关键字
主属性集、非主属性集
属性集的闭包:所有函数依赖于X的属性所构成的集合被称为属性集X在函数依赖集F上的闭包。就是所有X能决定的属性集合就是X的闭包。
- 算法1,计算闭包:闭包初始化为X。每一次循环,都循环遍历所有未使得闭包变换的函数依赖Y决定Z,每次循环中如果Y决定Z且Y属于当前闭包,则闭包加入Z。
关键字K,函数依赖集F,则 K F + = U K_F^+=U KF+=U。体现关键字的“最小属性集”特性,因此对任何一个K的真子集Z,都有 Z F + ≠ U Z_F^+\neq U ZF+=U - 算法2,计算关系的关键字K:首先初始化结果K为U(全属性集)。然后循环遍历所有属性,每次循环中,去掉当前循环到的属性,计算闭包,如果计算出的闭包是全属性集,则真正的去掉这个属性,否则不能去掉。
范式
第一范式:每个属性不可分,比如不能搞个属性叫销售,然后分为销售额和销量。
第二范式:前提是满足1NF,且每个非主属性都完全函数依赖于关键字,则满足第二范式。判断方法:找出所有关键字,然后确定主属性集非主属性集,然后找部分依赖,找不到就满足2NF。
如何分解到满足2NF?一般的模式分解方法:
找出所有不满足的函数依赖关系,比如找到了一个某个非主属性对关键字的部分依赖,其中决定因素的子集X完全决定Y;
XY单独构成一张表,原来的表去除Y。
第三范式:前提是满足2NF,且每个非主属性都不传递依赖于关键字。
BCNF范式:前提是满足1NF,且若X决定Y则X必含有关键字。
函数依赖理论
最小函数依赖集
条件:
- 依赖因素是单个属性(非必须)
- 不存在部分依赖
- 不存在冗余依赖
计算最小函数依赖集算法
简而言之,先去除部分依赖,然后去除冗余依赖。就是说,先对所有依赖分解,然后看左边部分,对每个左边部分不止一个属性的,依次去除每个属性,计算剩余的左边的闭包,如果闭包等于去除前左边的闭包,那么就可以去除。然后遍历每个函数依赖,并试着删除这个函数依赖,然后算决定因素在F上的闭包,如果闭包包含原依赖因素,则删除这个函数依赖。
无损联接性充要条件:
R
1
∩
R
2
→
(
R
1
−
R
2
)
(
或
(
R
2
−
R
1
)
)
R1\cap R2\rightarrow (R1-R2)(或(R2-R1))
R1∩R2→(R1−R2)(或(R2−R1))。
依赖保持性:不丢失依赖
保证以上两个特性,分解到3NF:
- 计算最小函数依赖集
- 初始化S为空集
- 对S每个子关系模式Z,X并Y不属于Z,则加入XY。
- 如果关系R每个候选关键字K都没出现在最终结果,则每个关键字K单独构成一张表。