先了解以下几个概念:
完全函数依赖:X->Y,并且对于X的任何一个真子集X`,都有X`不能推出Y
部分函数依赖:X->Y,并且存在X的一个真子集X`,有X`->Y
码:能够确定出其他属性 的 属性或者属性组合
主属性:码中的属性
非主属性:不存在于任何码中的属性
范式分为四种:
- 第一范式 (1NF)
- 第二范式 (2NF)
- 第三范式 (3NF)
- BCNF (通常认为是第三范式的修正)
范式判断:
- 第一范式
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。简单的说,就是每一个列(属性),不能再分割成多个列(属性)。 - 第二范式
在满足第一范式的基础上,非主属性完全函数依赖于任何一个候选码,则为第二范式
举例:有一个关系模式S-L-C(Sno,Dept,Sloc,Cno,Grade),其中Sno 是学号,Dept是学院,Sloc是住所,Cno是班级,Grade是成绩
其中的函数依赖有
(Sno,Cno)->Grade (此关系是完全函数依赖)
Sno->Sdept,(Sno,Cno)->Sdept(此关系是部分函数依赖)
Sno->Sloc,(Sno,Cno)->Sloc,
Sdept->Sloc
以上的函数依赖关系中,存在部分函数依赖,所以此关系模式不是第二范式 - 在满足第二范式的基础上,每一个非主属性既不传递依赖于码,也不部分依赖于码
举例:有一个关系模式S-L(Sno,Sdept,Sloc)
其中的函数依赖有:
Sno->Sdept,
Sdept->Sloc,
Sno->Sloc,
以上的函数依赖关系可以看出,Sdept完全依赖于Sno,Sloc完全依赖于Sdept,Sloc完全依赖于Sno,而Sno不依赖于Sdept,从而判断出Sno和Sloc存在传递依赖关系.所以此关系模式不是第三范式 - 在满足第三范式的基础上
1.所有非主属性对每一个码都是完全函数依赖
2.所有主属性对每一个不包含它的码也是完全函数依赖
3.没有任何属性完全函数依赖于非码的任何一组属性
判断诀窍:
第一步:根据关系模式,写出所有的函数依赖关系,码,主属性,非主属性
第二步:在所有的函数依赖关系中,判断是否存在部分依赖和传递依赖
第三部:所有主属性对每一个不包含它的码也是完全函数依赖
第四步:没有任何属性完全函数依赖于非码的任何一组属性