前言
在了解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