• 注册
当前位置:1313e > 数据库 >正文

数据库 1NF、2NF、3NF、BCNF

前言

在了解1NF、2NF、3NF、BCNF之前,我们需要先知道几个概念

  • 函数依赖
  • 完全函数依赖
  • 部分函数依赖
  • 决定因素

什么是函数依赖?

答:在关系r中,r中不可能存在两个元组在X上的属性值相等,而在Y的属性值不等,则称X函数确定Y,也称Y函数依赖于X,记作X->Y.
举例:对于姓名->年龄 想想看,只有i当姓名不重时,姓名才可以决定年龄,才能称年龄依赖于姓名,否则就不满足函数依赖。

什么是完全函数依赖?

答:如果X决定Y,但X的任何真子集都无法决定Y,那么称Y对X完全函数依赖。

什么是部分函数依赖?

答:部分函数依赖可以看作是相对于完全函数依赖而言的。如果X决定Y,但Y不对X完全函数依赖,那就是部分函数依赖

什么是决定因素?

若X可决定Y,则X称为这个函数依赖的决定属性组,也成为决定因素。

什么是码、候选码、主码?

答:主码 (属于) 候选码 (属于) 码。
码是可以确定一个元组的所有信息的属性名或属性名组。
候选码的真子集中不存在码。
主码是任意一个候选码

1NF

第一范式是指列的原子性,列不可再分。

例如下图就不符合第一范式
在这里插入图片描述
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

2NF

第二范式是指在1NF基础上消除部分函数依赖

看定义可能不好理解,看看下面例子,再回来理解一下。

假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:

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

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

(课程名称) → (学分)

(学号) → (姓名, 年龄)

3NF

第三范式是指在2NF基础上消除传递依赖

什么是传递依赖?

例如A->B->C,A决定B,B决定C,反过来讲就是C依赖B,B依赖A,传递起来就是C依赖于A。

如果在2NF基础上,没有这样的传递依赖,我们称之为3NF。

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

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

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

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

也就是意味着,在数据库表设计中,学院与学院地点、学院电话应该独立出去为表,从而满足第三范式。

BCNF

通常认为是修正的第三范式,若每一个决定因素都包含码,则该关系属于BCNF。

BCNF是第三范式的改进,也就是说如果是BCNF,则一定是3NF。反之则不是。
BCNF消除了主属性对候选码的部分和传递函数依赖, 即3NF是允许存在主属性对候选码的传递依赖和部分依赖的。

BCNF比较抽象,举个例子:在学生信息表里,学号是一个候选码,学号可确定学生姓名;(班级,学生姓名)也是一组候选码,有(班级,学生姓名)->学号,因此在主属性间形成了传递依赖。

参考文章

《 数据库系统概论 》王珊版
https://www.cnblogs.com/haore147/p/3902968.html
https://blog.csdn.net/cry_shoulder/article/details/94549319
https://blog.csdn.net/sumaliqinghua/article/details/86246762

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录