数据库范式(1NF 2NF 3NF BCNF)

最近看到一条招聘信息上要求求职者:熟悉数据仓库数据层级关系,精通3NF和多维数据模型设计。3NF是什么不太了解,所以特地学习一下,找了一些资料,觉得这篇博客写的比较容易懂,如果大家喜欢,欢迎前往观看

转载:http://blog.csdn.net/xuxurui007/article/details/7738330

范式判断流程图

数据库范式(1NF 2NF 3NF BCNF)_第1张图片

1.       四种范式之间关系

        数据库范式(1NF 2NF 3NF BCNF)_第2张图片

2.       第二范式、第三范式、BCNF区别:

2NF:非主键列和主键列之间,是完全依赖于主键,还是依赖于主键的一部分(只依赖某个主键);

3NF:非主键列之间,不存在依赖,只直接依赖主键。

BCNF:主键列之间,不存在依赖。

一般关系数据库都满足第一范式,先确定是几个主键属性。

第一范式:列不可再分

第二范式:非主键属性全部依赖于主键属性

第三范式:非主键属性之间无依赖关系

第四范式:主键属性之间无依赖关系



3.       第一范式:有主键,列不可分。每一列都是不可分割的基本数据项。

a.       反例:

StudyNo

Name  

Sex  

Contact

20040901     

john        

Male     

Email:[email protected],phone:222456

20040902     

mary        

famale   

email:[email protected] phone:123455

contact字段可以再分,不符合第一范式。

b.  正解:

StudyNo

Name  

Sex  

Email

Phone

20040901     

john        

Male     

Email:[email protected]

222456

20040902     

mary        

famale   

email:[email protected]

123455

4.       第二范式:在第一范式基础上,对于多关键字表,非主属性不部分依赖于主键(eg:只依赖某个主键);对于单关键字表,不存在部分依赖情况(只依赖一个主键,全部依赖),全符合。

a.       反例:

StudyNo

Name  

Sex  

Email

Phone

ClassNo

ClassAddress

20040901     

john        

Male     

Email:[email protected]

222456

200401

#12A

20040902     

mary        

famale   

email:[email protected]

123455

200402

#8A

主键是studyNoclassNoclassAddress部分依赖主键classNo,需要变为两个表。

b.  正解:

学生表

StudyNo

Name  

Sex  

Email

Phone

20040901     

john        

Male     

Email:[email protected]

222456

20040902     

mary        

famale   

email:[email protected]

123455

教室表

ClassNo

ClassAddress

200401

#12A

200402

#8A

c.   消除数据冗余和增、删、改异常。

(1) 数据冗余:

    同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

(2) 更新异常:

    若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

(3) 插入异常:

    假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

(4) 删除异常:

    假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

5.       第三范式:在第二范式基础上,非关键字段对任一主键不能传递函数依赖。非主键列必须直接依赖于主键,不能传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。进一步说,非主键列之间不能存在依赖关系。

a.       反例:

StudyNo

Name  

Sex  

Email

Phone

BounsLevel

Bouns

20040901     

john        

Male     

Email:[email protected]

222456

优秀

1200

20040902     

mary        

famale   

email:[email protected]

123455

800

主键是StudyNo,只有一个主键,符合第二范式。但是非主键列bounsLevel和bouns存在依赖关系。

b.  正解:

学生表

StudyNo

Name  

Sex  

Email

Phone

BounsNo

20040901     

john        

Male     

Email:[email protected]

222456

1

20040902     

mary        

famale   

email:[email protected]

123455

2

奖学金等级表

BounsNo

BounsLevel

Bouns

1

优秀

1200

2

800

c.   消除数据冗余和增、删、改异常。

6.       鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。即不存在关键字段决定关键字段的情况。

a.       反例:StoreHouseManager

StoreHouseID(仓库ID

GoodsID(商品ID

ManagerID(管理员ID

GoodsNum(商品数量)

001

20130104

1

200

主键是StoreHouseIDManagerID,满足第三范式。但是,存在关键字段决定关键字段情况。

(仓库ID) → (管理员ID)

(管理员ID) → (仓库ID)

b.  正解:

仓库管理表

StoreHouseID(仓库ID

GoodsID(商品ID

GoodsNum(商品数量)

001

20130104

200

仓库表

StoreHouseID(仓库ID

ManagerID(管理员ID

001

1

c.   消除增、删、改异常。

(1) 删除异常:

当仓库被清空后,所有"存储物品ID""数量"信息被删除的同时,"仓库ID""管理员ID"信息也被删除了。

(2) 插入异常:

当仓库没有存储任何物品时,无法给仓库分配管理员。

(3) 更新异常:

如果仓库换了管理员,则表中所有行的管理员ID都要修改。


 

quote:http://jacki6.iteye.com/blog/774866

http://gaoshuaidage.blog.163.com/blog/static/9130678020089161041387/

http://www.cnblogs.com/GISerYang/archive/2012/05/09/2491996.html

你可能感兴趣的:(数据库范式(1NF 2NF 3NF BCNF))