数据库之五种范式

一、第一范式(1NF)数据库

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

例1:spa

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


  咱们就能够获得一个关系表Student<U, F>,其就属于第一范式:blog


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

二、第二范式(2NF)im

  第二范式的定义:若是关系表R属于第一范式,而且每个非主属性彻底函数依赖于某个候选键,则此关系表R属于第二范式。(关于函数依赖以及主键。候选键等概念能够查阅其余资料)数据

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

例2:db

  对于一个关系表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;

  SdeptSloc。


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

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



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

三、第三范式(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都属于第三范式。

四、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; TJ。(S, J)和(S, T)都是候选码,因此都是主属性。函数依赖图以下:


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

五、第四范式(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。


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