范式
ps:关系数据库中的关系是要瞒住一定要求的,满足不同程度要求的为不同范式。
一个低一级范式的关系模式通过模式分解(schema decomposition)可以转换为若干`个高一级范式的关系模式的集合,这种过程就叫*规范性*
2NF
简单来说,在第一范式的基础上,且每一个非主属性完全函数依赖于任何一个候选码,则此时为第二范式。
举个栗子:
具体意思可以不用搞懂,可以先只分析一下函数依赖
S-L-C(sno,sdept,sloc,cno,grade),码为(sno,cno)
有函数依赖:
(sno,cno)—F—>grade
sno->sdept,(sno,cno)—p—>sdept
sno->sloc ,(sno,cno)–p–>sloc
sdept->sloc
sdept和sloc并不是完全函数依赖于码,是部分函数依赖于码,而grade是完全函数依赖于码
而第二范式需要的就是要每一个非主属性完全函数依赖于任何一个候选码,
这里就可以看出区别啦,只需要使用投影分解把关系模型分解为两个关系模型,
sc(sno,cno,grade)和s-l(sno,sdept,sloc)
3NF
同样的,在2NF的基础上,每一个非主属性不传递依赖于码,就是3NF。
ps:即第三范式,每一个非主属性即不传递依赖于码,也不部分依赖于码,也就是说,可以证明如果关系属于3NF,则必属于2NF.
举个栗子:
拿上面的栗子来说,
sc没有传递依赖,即属于3NF
s-l,中sno->sdept,sdept->sloc,即sno–传递–>sloc,此时有非主属性对码的传递依赖。
解决的方法同样是将S-L分解
s-d(sno,sdept)和d-l(sdept,sloc)
BCNF
可以理解为升级版的第三范式,即若在关系模式中,若每一个决定属性集都包含候选码,则为BCNF。
举个栗子
若有关系模型stj(s,t,j)
有函数依赖:
(s,j)–>t
(s,t)–>j
t–>j
(s,j),(s,t)都是候选码
很明显,此时t是决定因素,但是t不包含码
所以此时stj只是属于3NF,但是不属于BCNF哦
提一点:一个关系模式中的关系模式如果都属于BCNF,那么在函数依赖范畴内它已经实现了彻底的分离。