数据库第六章内容梳理
关系规范化的需求和背景
数据依赖分类:函数依赖,多值依赖,连接依赖
函数依赖
对于函数Y=f(x)
可以说成X函数决定Y,也可以说成Y函数依赖于X
举个例子:在关系数据库中讨论函数或函数依赖注重的是语义上的关系,如省=f(城市) ,只要给出一个具体的城市值,就会有唯一的省值与之对应,这里“城市”是自变量X,“省”是因变量或函数值Y。并且把X函数决定Y或Y函数依赖于X表示为:
X→Y
。
非平凡依赖
如果X→Y,但是Y不包含于X,则称X->Y是非平凡的函数依赖。一般讨论非平凡依赖才有意义。X称为决定因子
完全依赖和非完全依赖
如果X→Y,对于任意的真子集X’都有X’无法推出Y,则称Y完全函数依赖于X,记作
如果可以推出X’→Y,则说明Y部分函数依赖于X,记作
举例
传递函数依赖
如果X→Y(非平凡依赖,并且Y不依赖于X),Y→Z,则称Z传递依赖于X,即X→Z
等价
如果X → Y且 Y → X,则X与Y一一对应,即X与Y等价,记为Y↔X。
一般是1:1的关系才是等价依赖
关系规范中的函数依赖理论
对于这个题,我一开始很疑惑,为什么候选键不能是(Sid,Cid,Tid),这种想法就犯了一个错误,对于候选键的定义还是不清楚
候选键:不含有多余属性的超键称为候选键
主键就是从候选键中随机选出一个来作为主键的,所以他们一定是最小属性的集合
在这里由于Cid可以决定Tid,所以候选键就不能是(Sid,Cid,Tid)。
最小函数依赖
定义:
如果F满足下列条件,则称F是最小的函数依赖集
- ①F中每个函数的右边都只有一个属性
- ②对F中的任何函数依赖A→B,都不存在A的一个真子集C,使函数依赖C →B代替函数依赖 A→B后得到和原来的F等价的一组依赖。
- ③从F中移出任何一个函数依赖都无法再得到和原来的F等价的一组函数依赖。
条件:①确保每个函数依赖都符合标准的形式,条件②、 ③确保这些函数依赖中没有冗余。
计算最小函数依赖集的方法
(1)用分解的法则:使F中的任何一个函数依赖的右部仅含一个属性
(2)去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭包X+,看X+是否包含Y,若是,则去掉X→Y;否则不能,依次下去,直到找不到冗余的函数依赖
闭包的定义:X+ 可以理解为X+表示所有X可以决定的属性
闭包的求法:
属性集闭包的步骤:
- 设要求的闭包属性集是Y,把Y初始化为X.
- 检查函数依赖集F中的每个函数依赖A->B,如果属性集A中的所有属性都在Y中,而B中有属性不在Y中,则将其加入到Y中。
- 重复第二步,直到没有属性可以添加到Y中为止。最后得出的Y就是X+。
(3)去掉依赖左部多余的属性:一个一个地检查函数依赖左部非单个属性的依赖,例如XY→A,若要判断Y为多余的,则以X→A代替XY→A是否等价,若A(X)+,则Y为多余属性,可以去掉
来一道例题:
(1)首先分解属性,
F={AD→E,AC→E,BC→F,BCD→A,BCD→F,BD→A,AB→F,A→C}
(2)去掉多余的函数依赖
AD→E (AD)+ ={ADCE},包含E,故AD→E可以去除
求法:按照上面的步骤
- 首先把闭包Y初始化为AD
- 由于A→C所以Y=ADC
- 由于AD→E所以Y=ADCE
- 没有属性可以添加,结束
AC→E (AC)+={AC} E不属于AC 所以保留
BC→F (BC)+={BC} F不属于BC,所以保留
BCD→A (BCD)+={BCD A E F} A属于BCDAEF去除
BCD→F 同上,去除
BD→A (BD)+={BD}A不属于BD,保留
AB→F (AB)+={AB C E F} F属于ABCEF 去除
A→C A+={A} C不属于A,保留
则 保留了 AC→E BC→F BD→A A→C
(3)去掉依赖左部多余的属性
由于A+=AC,所以AC→E 可以变成A→E
综上:F的最小函数依赖集为{A→E , BC→F , BD→A , A→C}
Armstrong公理
- 自反性:如果B是A的子集,则A→B。
- 增广性:如果A→B,则A,C→B,C。
- 传递性:如果A→B并且B→C,则A→C。
关系规范化
关系模式:设U表示关系模式R的属性全集U={A1,A2,…,An},F表示关系模式R上的函数依赖集,则关系模式R可以表示为:R(U,F)。
候选键:完全依赖:
设K为R(U,F)中的属性或属性组,若,则K为R的候选键。(K为决定R中全部属性值的最小属性组。)
主键:关系R(U,F)中可能有多个候选键,则选其中一个作为主键;
全键:候选键为整个属性组
主属性和非主属性:在R(U,F)中,包含在任一候选键中的属性称为主属性,不包含在任一候选键中的属性称为非主属性。
外键:若R(U,F)的属性(组)X(X属于U)是另一个关系S的主键,则称X为R的外键。(X必须先被定义为S的主键)。