一、数据关系
关系数据库可能存在的问题
1.数据冗余(必然存在,但应该尽量少)
2.更新冗余
3.插入冗余
4.删除冗余
数据依赖(属性之间以值是否相等体现出来的一种约束关系)
1)函数依赖(给定元组中的一些属性,可确定另外的属性必然的取值--一个)
--非平凡的函数依赖:Y依赖于X,Y不包含于X
--平凡函数依赖:Y依赖于X,且Y包含于X
--互相函数依赖:X依赖于Y,Y依赖于X
--完全函数依赖:Y依赖于X,但Y不依赖与X的任意真子集
--部分函数依赖:Y依赖于X,且Y不完全依赖于X
--传递函数依赖:Y非平凡依赖于X,且Y与X不是互相函数依赖,Z非平方依赖于Y,则Z对X传递依赖
2)多值依赖(给定元组中的一些属性,可确定另外的属性可能的取值--一组)
--含义:X, Y, Z三个属性集之和是属性集U,多值依赖X->->Y成立当且仅当对R(U)的任一个关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅决定于X值而与Z值无关。
--平凡的多值依赖(集合属性中分为两个真子集):Z=空集
--非平凡的多值依赖:Z≠空集
--对称性:若Y多值依赖于X,则Z也多值依赖于X
--传递性:若Y多值依赖于X,Z多值依赖于Y,则X多值依赖于Z-Y
--若Y依赖于X,则Y也多值依赖于X
码(一码定一组)
--候选码:属性集合完全函数依赖于候选码(候选码是不可分割的主属性集合,分了就不是候选码了),主码是候选码,候选码不一定是主码
--超码:属性集合部分函数依赖于超码
--主属性:包含在候选码中的属性
--非主属性:不包含在任何候选码中的属性
--全码:整个属性组都是主码或者候选码
--外码:本关系模式中某个属性或属性组是非码,但这个属性或者属性组是另一个关系模式的码
二、范式(低一级范式关系模式可以通过模式分解转换成多个高一级的关系模式的集合)
第一范式(1NF):每个分量都是不可分的基本数据项
--意义:关系数据库的基本要求,防止出现表中表的情况,当然某些时候这也是可以做出让步的,比如个人表的家庭住址╮(╯▽╰)╭
--设计:每列都是基本数据项,原子数据
第二范式(2NF):若R∈1NF,且每个非主属性完全函数依赖于任何一个候选码
--意义:在第一范式的基础上消除了非主属性对码的部分函数依赖,从而减少了数据冗余、更新异常、插入异常和删除异常
--设计:码的真子集不是码
第三范式(3NF):若R∈2NF,且R中不存在非主属性对码的传递依赖(一般走到这)
--意义:在第二范式的基础上消除了非主属性对码的传递依赖,从而减少了数据冗余、更新异常、插入异常和删除异常
--设计:表中主键是唯一码(或者本表仅仅有两个码,且两码互为补集)、若外码存在,则外码应是其原表的主键
BCNF(扩充的第三范式):若R∈1NF,当Y非平凡函数依赖于X时,X必有码
--意义:第三范式的基础上消除主属性对于码的部分依赖与传递函数依赖,减少了删除异常、插入异常和更新异常
--设计:不同主属性相互无依赖关系
第四范式(4NF):若R∈1NF,当Y非平凡多值依赖于X时,X必有码
--意义:属性之间不允许有非平凡且非函数依赖的多值依赖,减少维护数据一致性的工作
--设计:两个互补的属性集合,且都是码,即全码,才允许有多对多的关系出现,否则本表只允许一对一的函数依赖关系
第五范式(5NF):将表切割成尽量小的块,排除所有的冗余(一般不会走到这步)
三、数据依赖的公理系统(Armstrong公理系统)
设U为属性集总体,F是U上的一组函数依赖,于是有关系模式R<U,F>,对R<U,F>有以下推理规则:
自反律
若Y⊆X⊆U,则X→Y为F所蕴含
增广律
若X→Y为F所蕴含,且Z⊆U,则X∪Z→Y∪Z为F所蕴含
传递律
若X→Y为F所蕴含,且Y→Z为F所蕴含,则X→Z为F所蕴含
合并规则
若X→Y,X→Z,则 X→Y∪Z
分解规则
若X→Y, 且Z⊆Y,则X→Z
伪传递规则
若X→Y,WY→Z,则WX→Z
函数依赖集等价
--若F的函数依赖集闭包=G的函数依赖集闭包,则说F覆盖G,反之亦可,也可以说F与G等价
闭包(函数依赖集,属性集)
--函数依赖集的闭包:在关系模式<R,F>中为F所逻辑蕴含的函数依赖的全体称为F的闭包
--属性集的闭包:在关系模式<R,F>中,能由F根据Armstrong公理导出的对X函数依赖的所有属性集的并集称为X关于函数依赖集F的闭包
Armstrong公理是有效的,完备的:
--有效性:由F出发,根据Armstrong公理推导出来的每一个函数依赖一定在F的闭包中
--完备性:F的函数依赖集的闭包的每个函数依赖,必定可以由F出发根据Armstrong公理推导出来
极小依赖集
--F中任一函数依赖表达式的箭头右边只有一个属性,即是说F中的每个函数依赖都只能决定一个属性,没有冗余的被决定属性
--F中不存在函数依赖X→A使F等价F-{X→A},即是说F中的函数依赖都是不可缺少的,换句话说F中没有冗余的函数依赖
--F中不存在函数依赖X→A,Z⊆X,使F-{X→A}∪{Z→A}与F等价,即是说函数依赖表达式的决定因素应该尽可能简,没有真子集与其等价,决定因素中无冗余属性
--总结:对F而言,没有冗余的函数依赖项,对函数依赖表达式而言,决定因素尽量精简(有时候决定因素必须为多个属性,所以只能尽量精简),被决定因素只有一个属性。
最小覆盖(最小函数依赖集)
每个函数依赖集均等价于一个极小函数依赖集F',称F'为F的最小依赖集
模式分解(属性是分配的基本单位)
分解后函数关系讲不明白,就跳过了,只讲判定方法和分解方法
模式分解的意义:
--因为现有的模式可能会存在一些数据增删改的弊端,需要寻找一种等价的关系模式,使得以上弊端得以解决
无损分解:
--对关系模式分解时,原关系模型下任一合法的关系值在分解之后应能通过自然联接运算恢复起来,即未丢失信息的分解即无损分解。反之,则称为有损分解
判定公式:对于R<U,F>的一个分解ρ={R[1]<U[1],F[1]>,R[2]<U[2],F[2]>},如果U[1]∩U[2]→U[1]-U[2]∈F的闭包
建议:对着实例调试一次就都知道了,官方说法太玄了
分解的限制:
1.要求保留函数依赖(数据间关系),一定可以达到3NF,但是不一定能达到BCNF,此时可以还做到无损连接
2.只要求分解具有无损连接性,则一定可以达到4NF
分解算法
(1)得到保留函数依赖的3NF(合成法):
--将R<U,F>中的F极小化处理,得到F"
--找出所有不在F"中出现的属性,记为U",把这些属性构成一个关系模式R"<U"',F"'>,把这些属性从U中去掉,得到U"
①--若有X→A∈F",且XA=U",则ρ={R},结束
②--或者,对F按具有相同左部(决定因素)的原则分k组,每组函数依赖集涉及的全部属性形成一个属性集U[i]分别组成对应的R[i]关系模式,算法结束。此时的ρ={R[1]<U[1],F[1]>,...R[k]<U[k],F[k]>∪R"<U"',F"'>}是R<U,F>的保留函数依赖的一个分解,且对于每个R[i]都属于3NF
(2)保留函数依赖和无损连接的3NF
--设X是R<U,F>的码,R已由合成法分解为ρ,令t=ρ∪{R*<X,F[x]>(R*中只有码)}
--若有某个U[i],X⊆U[i],将R*<X,F[x]>从t中去掉,或者U[i]⊆X,将R<X,F[x]>从t中去掉。这步得到t'
--t'就是所求的分解
--即是说:合成法的计算结果ρ与由原表的主属性组成新表r取并,且用r与ρ中的子表U[i]进行对比,去除冗余的表(包含r时r冗余,被r包含时U[i]冗余)
(3)转化为BCNF的无损连接分解(仅①适用)
--将分解ρ的子表中可以起决定因素作用的主属性集(无法构成码)与其被决定因素单独提取成一个新表,原R[i]中删除掉对应的被决定属性
(4)U=X+Y+Z如果R<U,D>中X→→Y成立,则R的分解ρ={R[1]<X,Y>,R[2]<X,Z>}具有无损连接性
--即是说:将多值依赖的不符合4NF的表分解为多个函数依赖的表