数据库五种范式

1、第一范式(1NF)

  对于一张二维表,最基本的要求就是:每一个分量必须是不可分的数据项,也就是说同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。满足了这个条件的关系表就属于第一范式。

例1:

  建立一个描述学校教务的数据库,涉及的对象包括学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)和成绩(Grade)。属性集合为U={Sno, Sdept, Mname, Cno, Grade}。函数依赖F为F={Sno→Sdept, Sdept→Mname, (Sno, Cno)→Grade}。


  我们就可以得到一个关系表Student<U, F>,其就属于第一范式:


但是该关系表存在一系列问题,比如数据冗余太大、更新异常、插入异常和删除异常等,因此该关系表不是一个好的模式,需要进行调整,这就需要用到后面提到的各种高级范式。

2、第二范式(2NF)

  第二范式的定义:如果关系表R属于第一范式,并且每一个非主属性完全函数依赖于某个候选键,则此关系表R属于第二范式。(关于函数依赖以及主键。候选键等概念可以查阅其他资料)

  2NF是在1NF的基础上消除了非主属性对键的部分函数依赖。

例2:

  对于一个关系表S-L-C(Sno, Sdept, Sloc, Cno, Grade),其中Sloc为学生的住处,并且每个系的学生只住在同一个地方,其余的属性与例1中含义相同。S-L-C的候选键为(Sno, Cno)。此时,有如下函数依赖关系:

  F(完全函数依赖):(Sno, Cno)→Grade;

  P(部分函数依赖):(Sno, Cno)→Sdept,因为Sno→Sdept;

  P(部分函数依赖):(Sno, Cno)→Sloc,因为Sno→Sloc;

  Sdept→Sloc。


在这个关系表中,可以发现存在非主属性部分函数依赖与键,因此该关系表S-L-C不属于第二范式。

  可以将该表分解为两个关系表,使得两个表属于第二范式:SC(Sno, Cno, Grade)和S-L(Sno, Sdept, Sloc)。拆分后,关系表SC和S-L的函数依赖关系如下:



此时,非主属性对于键都是完全函数依赖了。

3、第三范式(3NF)

  第三范式定义:关系模式(表)R<U, F>中若不存在这样的键X,属性组Y及非主属性Z(Z不包含于Y)使得X→Y,Y→Z成立,X不依赖于Y,则称R属于第三范式。

  3NF是在2NF的基础上消除了非主属性对键的传递函数依赖。

  在例2中的S-L关系表中,候选键为Sno,Sloc传递依赖于Sno,因为:Sno→Sdept,Sdept→Sloc;所以传递依赖:Sno→Sloc。非主属性Sloc传递依赖于键,因此S-L不属于第三范式。

  同样的,可以继续将S-L分解:S-D(Sno, Sdept)和D-L(Sdept, Sloc),分解后就不存在传递依赖了,因此S-D和D-L都属于第三范式。

4、BC范式(BCNF)

  BCNF的定义:对于一个关系表(模式)R<U, F>属于第一范式,若X→Y且X不包含Y时X必含有键,则R属于BC范式。

  BCNF是在3NF的基础上消除了主属性对键的部分函数依赖和传递函数依赖。

例3:

  对于关系表SJP(S, J, P),S是学生,J表示课程,P表示名次。每一个学生选修每门课程的成绩有一定的名次,每门课程中每一名次只有一个学生(没有并列)。依赖关系如下:(S, J)→P; (J, P)→S。所以(S, J),(J, P)都是候选键,所以三个属性都是主属性。在这个表中,没有没有非主属性对键传递依赖或者部分函数依赖,因此SJP属于3NF;并且也不存在主属性对键传递依赖或者部分依赖,所以SJP也属于BCNF。

例4:

  对于关系表STJ(S, T, J),S和J如例3,T表示教师。每个教师只教一门课。每门课有若干教师,某一学生选定某门课,就对应一个固定的教师。函数依赖如下:(S, J)→T; (S, T)→J; T→J。(S, J)和(S, T)都是候选码,所以都是主属性。函数依赖图如下:


STJ是3NF,因为没有非主属性对键传递依赖或者部分函数依赖(实际上就没有非主属性),但STJ不是BCNF,因为存在主属性对键传递依赖或者部分函数依赖。

5、第四范式(4NF)

  第四范式的定义:关系表R<U, F>属于第一范式,如果对于R的每个非平凡多值依赖X→→Y(Y不包含于X),X都含有键,则称R属于4NF。

  4NF是在3NF的基础上消除了属性间的非平凡且非函数依赖的多值依赖。

例5:

  关系模式WSC(W, S, C)中,W表示仓库,S表示保管员,C表示商品。假设每个仓库有若干保管员,有若干种商品。每个保管员保管所在仓库的所有商品,每种商品被所有保管员保管。WSC的键为(W, S, C),在WSC中存在非平凡的多值依赖:W→→S,W→→C,而W不是键,因此WSC不是4NF。可以用分解法对其进行处理,把WSC分解为两个表:WS(W, S),WC(W, C)。在WS中存在多值依赖W→→S,但这是平凡的多值依赖,所以WS属于第四范式。同理WC与属于4NF。


  下面给出各个范式之间的关系图: