数据库之五种范式

12月28日 收藏 0 评论 1 java开发

数据库之五种范式

文章申明:转载来源:https://blog.csdn.net/karute/article/details/79519545

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。
下面给出各个范式之间的关系图:

C 1条回复 评论
越过山丘

看了两遍,慢慢消化吸收知识点

发表于 2022-02-06 23:00:00
0 0