一些基本概念:
函数依赖
①平凡函数依赖与非平凡函数依赖
在关系模式R(U)中, 对于U的子集X和Y,,如果X→Y,但Y不属于X,则称X→Y是非平凡的函数依赖 若X→Y,但Y属于X, 则称X→Y是平凡的函数依赖
若不特别声明, 后续所有依赖都是在非平凡函数依赖基础上的。
也就是说,不考虑(sno,cno)→ sno
②完全函数依赖与部分函数依赖
在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X’,都有 X’不依赖Y, 则称Y完全函数依赖于X。
若X→Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X。
③传递函数依赖与直接依赖
⭐⭐⭐在关系模式R(U)中,如果X→Y(Y不属于X:非平凡函数依赖),Y→Z,且Y不属于X,Y!→X,则称Z传递函数依赖于X。 注: 如果Y→X, 即X←→Y,则Z直接依赖于X。
码:
候选码:能唯一标识一个元组的没有冗余属性的属性(组) 当一个关系有多个候选码时,选定其中一个作为主码,简称码
主属性:包含在任何一个候选码中的属性都是主属性。不包含在任何一个候选码中的属性是非主属性。
一个关系如果有多个候选码,那么所有候选码中的属性都是主属性。
范式
第一范式1NF:
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
第二范式2NF:
若关系模式R∈1NF,并且每一个非主属性都完全函 数依赖于R的任意一个候选码,则R∈2NF。
如果候选码是CD,F中存在C→A,则A部分函数依赖于候选码,所以不满足第二范式。
第三范式3NF:
关系模式R 中若不存在这样的主属性X、属性组Y及非主属性Z(Z 不属于Y), 使得X→Y,Y!→X,Y→Z,成立,则称R∈3NF。
3NF的定义中中蕴含了2NF,满足3NF一定也满足2NF。
PS:个人理解为什么3NF一定是2NF
X→Y, Y!→X 有两种情况 一种是Y是X的子集:不存在X→Y,Y属于X,Y→Z。即不存在非主属性Z对码的部分函数依赖于X。 另一种是Y是非主属性或者Y是没有被选为主码的候选码,此时表示不存在非主属性对码的传递函数依赖。(BCNF对于3NF做了改进,不存在了非主属性中的依赖关系,也不存在了非主属性对非码候选码的依赖关系)
综上,R满足3NF,说明R的每一个非主属性既不部份依赖于候选码又不传递依赖于候选码。
没有非主属性的关系一定属于第三范式3nf。
BCNF
bcnf:设关系模式R∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。
即:每一个决定因素都包含码。所有非主属性对码都是完全函数依赖,所有的主属性对于不包含它的码也是完全函数依赖,没有任何属性完全依赖于非主属性。
⭐⭐⭐⭐⭐
常见大题
①求闭包(so easy)
不用写过程,直接(AB)+=ABCD
②求候选码
③求最小函数依赖集
定义:如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集。亦称为最小依赖集或最小覆盖。 (1) F中任一函数依赖的右部仅含有一个属性。
(2) F中不存在这样的函数依赖X→A,使得F与F-{X→A}等价。 (3) F中不存在这样的函数依赖X→A, X有真子集Z使得F-{X→A}∪{Z→A}与F等价。 右边单属性+没有冗余依赖+左边 不包含多余属性(没有不分函数依赖)
立即删去!!!!!
④判断具有无损链接
⑤判断是否保持函数依赖
⑥分解满足3NF并具有无损链接保持函数依赖
先合并
①对Fm进行处理,左边属性相同的函数依赖进行合并
②每一个关系构成一个关系
③看一下是否有在函数依赖中没有出现的属性,有的话单独构成一个关系
④看一下候选码(任意一个)是否被包含在分解出的关系中,若没有,单独作为一个关系
⑤观察看是否有哪个模式是另一个模式的子集,有的话,舍弃
先求出最小函数依赖集和候选码, 按照最小函数依赖集中的依赖关系分解模式,然后看分解出的模式集中是否包含一个候选码中的属性,若不包含,把候选码作为一个模式加入模式集,最后看是否有一个模式是另一个模式的子集,若有则删去。
因为最小函数函数依赖集不包含平凡函数依赖,所以如果一个没有任何的依赖关系的属性,一定会把它加到候选码属性组中,所以说如果只按照最小函数依赖集来分解可能会遗漏这种没有依赖关系的属性,如果在考虑下候选码,就会具有无损链接。按照依赖集分解也不会失去函数依赖性。
⑦分解为BCNF并具有无损链接
bcnf(每个依赖关系的左部分都包含码)
①先求出R的候选码 ②观察F中的每一个函数依赖,看依赖关系的左边是否包含任意一个候选码,如果不包含,就将该依赖关系分解出去Ri,并将R-Ri,分解出Ri后的F也要改变 ③转①,直到最后存在的依赖关系中左边包含候选码。
分解为bcnf只能保证无损链接,但不能保证函数依赖
⑧判断最高规范化程度
掌握了各个范式的判定条件后就可以做出来了。