1 函数依赖XY
1.1 什么是函数依赖?
函数依赖XY: X和Y都是属性(集合)
- 一个X的值,只对应一个Y
- 一个Y,可能对应不止的X
XY 的意思是X函数决定Y,或Y函数依赖于X,X是Y的决定元素
为了举例子:
我们建立下面的排课表关系模型
班级 | 辅导员 | 办公室 | 课程 | 学时 | 教师 |
---|---|---|---|---|---|
师范1班 | 刘冰 | 201 | 数据库 | 54/6 | 潘帅 |
师范1班 | 刘冰 | 201 | 大学英语 | 32/0 | 李少芳 |
软件3班 | 张友 | 203 | 大学英语 | 32/0 | 李少芳 |
网工5班 | 颜启 | 202 | 数据库 | 54/6 | 张和 |
网工5班 | 颜启 | 202 | JAVA | 48/16 | 胡乐天 |
数媒7班 | 张友 | 203 | JAVA | 48/16 | 查左 |
其中的函数依赖有班级辅导员为一个函数依赖,班级(X)一旦确定,辅导员(Y)也随之确定。其他的函数依赖还包括辅导员办公室,课程学时等,都是箭头左边的属性可以决定右边的属性值。
X和Y也可以是属性集合,比如说单独课程无法决定老师,也就是课程老师,但是班级和课程两个属性可以决定教师这个属性,所以班级,课程教师也是一个函数依赖。
1.2 特殊类型的函数依赖
-
平凡的函数依赖:满足 XY,YX
在上面的排课表中,其中的平凡函数依赖有班级班级,班级,老师班级,平凡的函数依赖必然成立,没什么讨论的价值。 -
非平凡的函数依赖:满足 XY,YX
非平凡的函数依赖不一定成立,如在上面的例子中班级班级,辅导员这个函数依赖是成立的,而辅导员办公室,班级这个函数依赖是不成立的。 -
部分的函数依赖:XY: 存在, 使得成立
简单理解就是其实只要左边的一部分就可以决定右边了。举个例子,在排课表中,班级,课程学时是部分的函数依赖,因为左边课程就可以决定学时了。记为 -
完全的函数依赖 XY: 不存在, 使得成立
理解:要左边的全部才可以决定右边。比如在排课表中:班级,课程教师是完全的函数依赖。记为
-
传递的函数依赖:(公式不想列出,因为觉得好难懂!)
简单的理解就是左边与右边的属性存在中间属性。例如,排课表中,班级办公室是传递的函数依赖,因为存在班级辅导员和辅导员办公室,班级和办公室存在辅导员这个中间元素。
-
非传递的函数依赖:
左边和右边的属性直接决定,不存在中间元素。如课程学时是非传递的。
这就是所有特殊的函数依赖了,其中有
结论一:部分的函数依赖一定是传递的函数依赖,证明如下:
因为是部分函数依赖,所以XY: 存在, 使得成立,因为是X的部分,显然,又,所以是X和Y的中间元素,所以是传递的函数依赖。
结论二:非传递的函数依赖也一定是完全的,证明如下:
用反证法:如果函数依赖是部分的,则有且,又显然 ,所以有是传递的,因为有中间元素,与前提矛盾。反证失败,得出结论,非传递的函数依赖也是完全的函数传递
2 码
码这里只简单提几种码的概念,因为讲到范式需要用到几种码的概念。
2.1 超码
超码是关系中能唯一标识每个元组(可以简单的每一行数据)的属性或者属性组。
2.2 候选码
候选码是最小的超码,一个超码可能含有多于的属性。
2.3 主码
一个关系里可能存在几个候选码,但是只选一个出来作为主码。
2.4 码属性
又称主属性,一个属性,出现在某个候选码中。例如(A,B,C)构成了一个候选码,那么A,B,C都具有码属性。
2.5 非码属性
一个属性,不出现在任何的候选码中。一个属性,不是码属性就是非码属性。
3 范式
注:在下文中出现的码特指候选码。
3.1 第一范式 1NF
第一范式要求关系模型中的每个属性都是原子的,所谓原子的就是不可再分的。如上面排课表关系模型不满足第一范式的要求,原因是学时属性不是原子的,而是符合的,如果我们将学时拆分为理论学时和实验学时,则满足了第一范式的要求。
3.2 第二范式 2NF
- 满足第一范式
- 且每一个非码属性完全函数依赖于码
下面举一个不满足第二范式的关系。
我们有关系模型(学生学号,学生的系,学生的住处,课程号,班级) 且每个系的学生只能住同一个地方,关系模型的码为(学生学号,课程号)
学生学号(码属性) | 学生的系(非码属性) | 学生的住处(非码属性) | 课程号(码属性) | 班级(非码属性) |
---|---|---|---|---|
2019213201 | 网络工程 | 西三 | C110 | 5 |
2019213209 | 人工智能 | 西五 | C110 | 3 |
2019213208 | 网络工程 | 西三 | C130 | 5 |
2019213207 | 计算机科学 | 西四 | C120 | 4 |
存在以下的函数依赖
(学生学号,课程号)班级
学生学号学生的系,则**(学生学号,课程号)学生的系
学生学号学生的住处,则(学生学号,课程号)**学生的住处
学生的系学生的住处
简单地理解这个关系模型,只知道学生的学号,我们就可以确定学生的系,学生的住处。但无法知道学生的课程号和班级,只有同时知道了学生的学号和学生的课程,才知道学生的班级。
可以看到,非码属性学生的住处和学生的系部分依赖于码(学生学号,课程号)。也就是我只要学生学号就可以知道学生的住处和学生的系了,因此课程号有没有都无所谓的,你每一行给我加上一个无关紧要的课程号就使得整个关系模型变得冗余了。因此该关系模型是不符合第二范式的,可以对该关系模型进行拆分,拆分为:
学生学号(码属性) | 学生的系(非码属性) | 学生的住处(非码属性) |
---|---|---|
2019213201 | 网络工程 | 西三 |
2019213209 | 人工智能 | 西四 |
2019213208 | 网络工程 | 西三 |
2019213207 | 计算机科学 | 西五 |
和
学生学号(码属性) | 课程号(码属性) | 班级(非码属性) |
---|---|---|
2019213201 | C110 | 5 |
2019213209 | C110 | 3 |
2019213208 | C130 | 5 |
2019213207 | C120 | 4 |
候选码为(学生学号,课程号)
两个关系模型就都符合第二范式了。
3.3 第三范式 3NF
-
满足第一范式
-
每一个非码属性非传递函数依赖于码。
由上面结论二非传递的函数依赖也一定是完全的,所以满足第三范式也隐含着满足第二范式,是第二范式的真子集,也可以这么说,第三范式就是在第二范式的基础上消除函数传递。
考虑到我们上面拆分后的关系模型
学生学号(码属性) 学生的系(非码属性) 学生的住处(非码属性) 2019213201 网络工程 西三 2019213209 人工智能 西四 2019213208 网络工程 西三 2019213207 计算机科学 西五 因为我们提到每个系的同学只能住一个住处,该关系模型中存在关系依赖学生学号学生的系,学生的系学生的住处,所以非码属性(学生的住处) “函数依赖” 于码属性(学生学号)。该关系模型违反了第三范式,我们可以做拆分:
学生学号(码属性) | 学生的系(非码属性) |
---|---|
2019213201 | 网络工程 |
2019213209 | 人工智能 |
2019213208 | 网络工程 |
2019213207 | 计算机科学 |
学生的系(码属性) | 学生的住处(非码属性) |
---|---|
网络工程 | 西三 |
人工智能 | 西四 |
网络工程 | 西三 |
计算机科学 | 西五 |
在第二范式的基础上消除了函数传递,拆分后关系模型满足第三范式。
3.4 BC范式 4NF
-
满足第一范式的要求
-
每一个属性(码属性+非码属性)不传递函数依赖于码
比第三范式多要求了码属性不传递函数依赖于码,所以BC范式一定满足第三范式,是第三范式的真子集。
非码属性传递函数依赖于码在第三范式中已经举例了,不再举例。这里举一个码属性传递函数依赖于码的例子。
假设我们有如下的关系模型:
且假设一个教师只教一门课程,但一门课程有多个教师,也就是教师课程。并且假设一个班级和一门课程,只有一个老师给这个班上这门课,也就是(班级,课程)教师
班级(码属性) | 课程(码属性) | 教师(非码属性) |
---|---|---|
师范1班 | 数据库 | 潘帅 |
师范1班 | 大学英语 | 李少芳 |
软件3班 | 大学英语 | 李少芳 |
网工5班 | 数据库 | 严戈 |
网工5班 | JAVA | 胡乐天 |
数媒7班 | JAVA | 查左 |
由函数依赖教师课程和(班级,课程)教师,有码属性(班级,课程)函数传递于码属性(课程),因为有中间属性教师,违反了BC范式。
4 范式的判定
范式的判定就是要从满足范式的条件出发,从最低级的1NF开始,到2NF最后到3NF和BCNF,如果低范式无法满足,高范式也肯定无法满足。具体判定方法后续(看自己能不能学明白和有没有心情哈哈哈)
5 如何从低范式到更高级别的范式?
同上…
个人学习笔记,说的不对或请指正!!