您的位置:首页 > 数据库

关系数据库三范式 整理

2014-06-24 16:04 295 查看
 

 


第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

说明:每个单列是不可再分的。Eg:地址:(中国南京),应该拆分为(中国,南京)

 

l  
第二范式(2NF):在满足第一范式的基础上,数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。(另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。)

 

Eg:将所有信息放入一个表时:(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)

存在关系为(学号,
课程名称) → (姓名,
年龄,
成绩,
学分)

 

这个数据库表不满足第二范式,因为存在如下决定关系:

  

(课程名称)→
(学分)  (学号)
→ (姓名,年龄)

 

即存在组合关键字中的字段决定非关键字的情况

 


第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A→
B → C"的决定关系,则C传递函数依赖于A。也就是说表中的字段和主键直接对应不依靠其他的中间字段。

 

说白了:决定某字段值的必须是主键!

学生关系表为Student(学号,
姓名,
年龄,
所在学院,
学院地点,
学院电话),关键字为单一关键字"学号",因为存在如下决定关系:

 

  (学号)
→ (姓名,
年龄,
所在学院,
学院地点,
学院电话)

 

  这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:

 

(学号)
→ (所在学院)
→ (学院地点,
学院电话)

 

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

小心关键字对关键字的依赖。

 

假设仓库管理关系表为StorehouseManage(仓库ID,
存储物品ID,
管理员ID,
数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

 

  (仓库ID,
存储物品ID)
→(管理员ID,
数量)

  (管理员ID,
存储物品ID)
→ (仓库ID,
数量)

 

  所以,(仓库ID,
存储物品ID)和(管理员ID,
存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

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

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

 

即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。需要拆分为2个表。

 

另外一个例子:

 

 
有这样一个关系:地址adress(道路号码road,城市city,邮编pc)。

约束要求:(road,pc)->city;(road,city)->pc。它有两个候选键(road,pc)和(road,city)。因此三个属性都是主属性。

而放在一起存在关键字段决定关键字段的情况,所以其不符合BCNF范式。需要拆分为2个表。

 

非关键字,也就是在关系推导中处于右边,在表中可以取空置。

关键字,是可以确定一个元祖也就是表内容的属性,是所有推导关系中处于左边位置的属性。

关键字并不是主键,主键是由一个或者多个关键字组成的,主键是最终确定的一种处于推导位置左边的属性。

 

参考文章:

范式
http://blog.csdn.net/sxy_javaeye/article/details/4742949 http://www.cnblogs.com/beijiguangyong/archive/2011/03/15/2302781.html
BCNF范式
http://wangqian-bio.blog.163.com/blog/static/416609212011111854151747/
关键字
http://bbs.csdn.net/topics/390755765?page=1#post-397639528

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息