设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,而这些不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
在理解数据库范式之间,先理解几个概念更能帮助我们掌握和区分数据库的几个范式。
基础概念
函数依赖:设R(U)是属性集U上的关系模式,X,Y是U的子集。若对R(U)的任何一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称为X函数决定Y,也可以称作Y函数依赖于X,记作X—>Y。
一句话解释:在Y上任何一个属性值,在X上对应一个唯一的值。即称作X—>Y。
完全函数依赖:在R(U)中,如果X—>Y,并且对于X的任何一个真子集X’都有X’不能决定Y,则称为Y对于X完成函数依赖,记为X—>Y。
解释:用X中全部的值才能决定Y。
传递依赖:在R(U,F)中,如果X—>Y,Y⊈X,Y—>Z,则Z对X传递依赖。
非键属性:不是构成主键的属性。
候选码:关系中的一个属性或者一组属性可以唯一的标识一个元组。
非主属性:不包含在各个候选键中。
范式
第一范式(1NF):所有的属性不可再分;
第二范式(2NF):非键属性完全依赖于主键;
第三范式(3NF):非主性属性没有传递依赖;
BCNF:任何一个函数依赖中决定因素都是候选码;
实例分析
先讲解1NF
关系中包含的属性不能再分,例如R(姓名,性别,年龄,家庭情况)其中家庭情况又包含(父亲,母亲)对于关系R来说,就不满足1NF,因为家庭情况这个属性可以继续分解,整理成符合1NF的关系R(姓名,性别,年龄,父亲,母亲)
分析2NF和3NF
关系FIRST:(Sno,Sname,Status,City,Pno,Qty)
F={Sno—>Sname,Sno—>Status,Status—>City,(Sno,Pno)—>Qty}
先判断是否符合2NF?
2NF定义非键属性完全依赖于主键
主键有:Sno,Pno;
非键属性:Sname,Status,City,Qty
假如符合2NF,则(Sno,Pno)—>Sname,(Sno,Pno)—>Status,(Sno,Pno)—>city,(Sno,Pno)—>Qty根据题意显然前三个关系仅需要Sno就可以得到,不满足2NF。
转换为符合2NF的关系
FIRST1{Sno,Sname,Status,City};
FIRST2{Sno,Pno,Qty}
判断是否符合3NF?
3NF定义非主属性对主键不存在传递依赖
非主属性:Sname,Status,City
看FIRST1中City是因为Sno—>Status,Status—>City,故City对Sno传递依赖,不符合三范式。
拆分成符合三范式的关系
F1(Sno,Sname,Status)
F3(Status,City)
则符合3NF的FIRST被拆分为
F1(Sno,Sname,Status)
F2(Sno,Pro,Qty)
F3(Status,City)
根据BCNF的定义来看,上述分解已经符合BCNF范式了。
【总结】
通过这次软考复习,感觉自己终于弄懂这几个范式的关系,感觉自己萌萌哒!其实自己有反思一下为什么之前不能理解,得过且过的心态害死人啊。其中多重复几遍,对其中涉及到的基础概念耐心理解一下,这几个范式也就那么一回事!
如有理解偏颇之处,请各位大神不惜赐教,不胜感激!