范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。而在说明什么是范式之前,必须要弄懂什么是函数依赖。
一、函数依赖
1.函数依赖
设R(U)是一个属性集U上的关系模式, X和Y是U的子集。若对于R(U)的任意一个可能的关系r, r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等则称“ X函数确定Y”或“ Y函数依赖于X”,记作X→Y。
X称为这个函数依赖的决定属性组,也称为决定因素。
例:S(学号,姓名,性别,年龄,身高)
F={学号→姓名,学号→性别,学号 →年龄,学号→身高 }而同时年龄和身高不依赖于性别
(表中前提条件为不允许重名)
函数依赖不是指关系模式R的某个或某些关系实例r满足的约束条件,而是指R的所有关系实例r均要满足的约束条件。
2.平凡函数依赖与非平凡函数依赖
X→Y, Y⊈X,则称X→Y是非平凡的函数依赖。 X→Y,但Y⊆X ,则称X→Y是平凡的函数依赖。
构建一个关系SC(Sid,Cid,Grade),Sid:学号、Cid:课程号、Grade:成绩。
非平凡函数依赖:(Sid, Cid) → Grade
平凡函数依赖: (Sid, Cid) → Sno
(Sid, Cid) → Cno
3.完全函数依赖与部分函数依赖
在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X`,都有Y不依赖于X`, 则称Y完全函数依赖于X。若X→Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X 。
例 在关系STUDENT( Sid ,Sname,Sage,Cid,Grade) 中,
(Sid, Cid) → Grade 是完全函数依赖
(Sid, Cid) → Sage 是部分函数依赖,因为Sid → Sage,
4.传递函数依赖
在R( U)中,如果X→Y,( Y⊈X),X不依赖于Y, Y→Z,则称Z对X传递函数依赖。
例:在关系STUDENT( Sid ,Sname,Sage,Cid,Grade) 中,
Sid→Sname,Sname→Sage,则Sid→(传递)→Sage
二、范式
1.第一范式(1NF)
1NF是所有关系型数据库的最基本要求,1NF的定义为:符合1NF的关系中的每个属性都不可再分,简单说就是没有重复的列,不能表中有表。
下图就不符合第一范式:
2.第二范式(2NF)
符合1NF,每一个非主属性完全依赖于码,不能存在部分依赖,有主键,非主键字段依赖主键;据有唯一性,一个表只说明一个事物。
例:
STD(Sid, Cid, Sdept,Sloc,Grade) 符合1NF
STD(Sid, Cid, Sdept,Sloc,Grade) 不符合2NF
非主属性Sdept,Sloc 部分函数依赖于码(Sid,Cid)
一个关系模式R不属于2NF,就会产生问题:
(1) 插入异常(2) 删除异常(3) 数据冗余度大(4) 修改复杂
解决方法:
采用投影分解法,把关系分解为两个关系模式,消除这些部分函数依赖。
函数依赖图:
关系模式SC的码为( Sid, Cid),关系模式S的码为Sid。
非主属性对码都是完全函数依赖了。他们都是2NF。
3.第三范式
投影分解法,把关系分解为两个关系模式: SC和S,消除了关系中非主属性对码的部分函数依赖。但是还不能完全消除关系模式中的各种异常情况和数据冗余。
如:
Sloc传递函数依赖于Sid,即S中存在非主属性
对码的
传递函数依赖
Sid→传递→Sloc。
解决方法:
采用投影分解法,把S分解为两个关系模式,以消除传递函数依赖:
S-D( Sno, Sdept)
D-L( Sdept, Sloc)
S-D的码为Sno, D-L的码为Sdept
第三范式(3NF)的定义:关系模式R<U, F>∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z,使得X→Y, Y→Z, X不依赖于Y,成立,则称R<U, F> ∈ 3NF。
3NF的一些性质:
·若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。
·如果R∈3NF,则 R∈2NF。
·采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
·将一个2NF关系分解为多个3NF的关系后, 并不能完全消除关系模式中的各种异常情况和数据冗余。
关系模式规范化的基本步骤
一般而言,做到3NF已经满足大部分的数据库需要。