主属性:
在一个关系中,如果一个属性是构成某一个候选关键字的属性集中的一个属性,则称它为主属性。
非主属性:
不包含在任何一个候选码中的属性称为非主属性。 非主属性是相对与主属性来定义的,是指关系中不包含任何一个候选码中的属性。
1NF(第一范式)
关系数据库中的关系要满足一定要求的,满足不同程度要求为不同范式。满足最低要求的叫第一范式。在第一范式中满足进一步要求的为第二范式,其余以此类推。
对于范式,主要是E.FCodd做的工作,他系统地提出了1NF、2 NF、3NF的概念,讨论了规范化的问题。1974年,Codd和Bovce又共同提出BCNF,1976年Fagin又提出了4NF。
一个低一级范式的关系模式,通过模式分解可以转换为若干个高级范式的关系模式的集合,这种过程就叫规范化。
如果一个关系模式R的所有属性都是不可分的基本数据项,则 R属于1NF(第一范式)。第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库;但是满足第一范式的关系模式并不一定是一个好的关系模式。
2NF(第二范式)
定义:
若关系模式R属于1NF(第一范式),并且每一个非主属性都完全函数依赖于R的码,则R属于2NF。
2NF例:
对于关系模式SC(sno,cno,grade),(sno,cno)是码,sno和 cno是主属性(码对应的属性是主属性),grade是非主属性,且有,(sno,cno)→grade(学号,课程号联合确定grade, 这是完全函数依赖,箭头上加个F,),因此,且这里只有一个非主属性grade,它完全函数依赖于码,所以,该关系属于2NF(第二范式)。
同理,
student ( sno(主属性是码),sname(非主属性),ssex(非主属性),sdept(非主属性),sname、ssex、sdept都完全函数依赖于sno(码) ) 属于2NF,也可以由此处的码(sno)是单个属性构成的,直接可以得出这个关系模式一定属于2NF;
cource(cno(主属性是码), cname(非主属性),cpno(非主属性),ccredit(非主属性))属于2NF(因为码(cno)由单个属性构成,所以直接得出结果)。
不满足2NF的例子:
对于关系模式SLC(Sno,Sdept,Sloc,Cno,Grade),其中, Sloc为学生住处,假设每个系的学生住在同一个地方。(sno,cno)是码,则
(Sno,Cno)→Grade (这里是完全函数依赖,需要在箭头上加F)
Sno →Sdept 则 (Sno,Cno)→Sdept (部分函数依赖,在箭头上加个P)
即:sno函数依赖sdept 而 sno 是 (Sno,Cno ) 的一个真子集,所以就是 (Sno,Cno ) 部分函数依赖sdept
Sno→Sloc 则 (Sno,Cno)→Sloc (部分函数依赖,在箭头上加个P)
Sdept→Sloc
因此,该关系模式不属于2NF。
一个关系不属于2NF,就会产生插入异常、删除异常、数据冗余度大和修改复杂等问题(教材p183),即:存在部分函数依赖。
解决办法是把该关系模式分解(分解成多个关系模式),消除这些部分函数依赖:
sc(Sno(码/主属性),Cno(码/主属性),Grade(非主属性)),所以,SC属于2NF
SL(Sno(码/主属性),Sdept(非主属性),Sloc(非主属性)),所以,SL属于2NF
非主属性都完全函数依赖于主属性
满足2NF的关系模式,并不能完全消除关系模式中的各种异常情况和数据冗余。
3NF(第三范式)
即:在关系模式R(U)中,不存在,非主属性对于码的传递函数依赖或关系模式满足2NF(第二范式),在此基础上消除传递函数依赖就是3NF(第三范式)。
定义:
关系模式R<U,F>中若不存在这样的码X、属性组Y及非主属性Z(Z不是Y的子集),使得X→Y(x函数确定y),Y一Z(y函数确定z)成立,Y不函数决定X,则称R<U,F>属于3NF。
若R属于2NF,并且消除非主属性传递函数依赖于码,则RE3NF。
3NF例:
对于关系模式SLC(Sno,Sdept,Sloc,Cno,Grade),其中, Sloc为学生住处,假设每个系的学生住在同一个地方。(sno,cno)是码,则
(Sno,Cno)→Grade (这里是完全函数依赖,需要在箭头上加F)
Sno →Sdept 则 (Sno,Cno)→Sdept (部分函数依赖,在箭头上加个P)
其中,SC属于3NF(SC关系sno、cno是码,grade是非主属性,非主属性无法传递函数依赖)
而SL不属于3NF( SL 关系 sno 是码/主属性,sdept、sloc 是非主属性,sno 函数确定sdept, sdept 函数确定 sloc (题目有假设住在同一个地方 )),存在非主属性对码的传递函数依赖。
解决办法同样是分解:
SD(Sno(码),Sdept)
DL(Sdept(码),Sloc)
若R属于3NF,则R的每一个非主属性既不部分函数依赖于码也不传递函数依赖。
如果R属于3NF,则R也是2NF。
第三范式要求一个表中不包含已在其他表中已包含的非主关键字信息
如:
部门表包含:部门号,部门名,建立时间等
职工表包含:职工号(码),职工名,...,部门号(外键)
· 在职工的关系模式中已经包含部门号了,就不能再包含部门名,建立时间等,如果再包含其他的话,如:再包含一个部门名,部门名函数依赖于部门号,部门号函数依赖于职工号,就会存在函数传递依赖。
BC范式(BCNF)
BCNF比3NF又进了一步,通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
定义:(x是决定因素,即决定因素必含有码)
设关系模式R<U,F>1NF(满足第一范式),若X→Y且Y不是X的子集时X必含有码(若Y是x的子集时,是平凡的函数依赖),则R<U,F>属于BCNF(BC范式)。
若每一个决定属性因素都包含码,则R<U,F>EBCNF。若R<U F>属于BCNF,则存在以下特征:
(1)所有非主属性都完全函数依赖于码 ( 满足第二范式 )
(2)所有主属性对每一个(不包含它的码),也是完全函数依赖(主属性之间也是完全函数依赖)
(3)没有任何属性完全函数依赖于非码的任何一组属性(任何属性都应该函数依赖于码)
R属于BCNF,按定义排除了任何属性对码的传递依赖与部分依赖(满足BCNF一定满足3NF), 所以R属于3NF,反过来未必成立(即:满足第三范式,未必满足BCNF)
满足BCNF例:
关系模式C(Cno Cname,Pcno),码Cno,没有任何属性对 Cno 部分依赖或传递依赖,所以 C 属于3NF。同时C中Cno是唯一的决定因素(候选码只有一个),所以C属于BCNF。同样,关系模式SC(Sno,Cno , Grade)也成立(sno,cno联合确定grade,只有一个函数依赖)。
不满足BCNF例:
在关系模式STJ(S,TJ)中,S表示学生,T表示教师,J表示课程。规定每一教师只教一门课。每门课由若干教师教,某一学生选定某门课,就确定了一个固定的教师。
(S(学生),J(课程))→T(教师)(包含码),(S,T)→J(包含码),T→J(T函数确定J)(不包含码)
(S,J)和(S,T)都是候选码,没有任何非主属性对码传递依赖或部分依赖,因此STJ属于3NF。由于T是决定因素,而T不包含码,,则STJ不属于BCNF。
对于不是BCNF的关系模式,仍然存在不合适的地方,例如,删除异常(学生被删除后,教师和课程也被删除了);插入异常(当教师没确定时,无法给学生安排课程);更新异常(当某课程换教师时,所有的相关记录都要修改)。
注:范式级别越高,信息分布越分散,查询也越难!
非BCNF的关系模式也可以通过分解成为BCNF。 SJ(SJ)EBCNF,TJT,JEBCNF。