目录
一、范式
1.一些概念
范式(NF):范式是 “符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”,可以理解为一张表所符合某设计标准的程度/级别。
第一范式(1NF):关系模式中所有属性都不可再分(强调列的原子性)
第二范式(2NF):在1NF的基础上,消除了非主属性对于候选键的部分函数依赖。
第三范式(3NF):在2NF的基础上,消除了非主属性对候选键的传递函数依赖。
2.主属性与非主属性
主属性:包含在任何一个候选码中的属性,称为主属性。
非主属性:不包含在任何一个候选码中的属性,称为非主属性。
例如:在一个表S(A,B,C,D)中,若表R的候选键为A,则该表中主属性有:A,非主属性有:B,C,D;
在一个表R(A,B,C,D,E,F)中,若表R的候选键为(A,B)或(A,C),则该表中主属性有:A,B,C,非主属性有:D,E,F。
3.函数依赖
1)函数依赖:在一个表里面,属性X可以映射到属性Y,即当X已知时即可确定唯一的Y。
例如:在学生表中,如果知道了学生的学号,即可确定学生的姓名。
2)部分函数依赖:设X,Y是关系R的两个属性集合,存在X->Y,若X'是X的真子集,存在X'->Y,则称Y部分函数依赖于X。
例如:学生表中,(学号,姓名)->(班级),但是只学号一个属性就可以确定一个元组,由于属性不可分割,班级已经可以确定,即存在(学号)->(班级),所以班级部分函数依赖于(学号,姓名)。
3)完全函数依赖:相对应的,也存在X->Y,若X'是X的真子集,不存在X'->Y,则称Y完全函数依赖于X。
例如:成绩表中,(学号,课程号)->(成绩),只有当学号和课程号都知道时,才能得出该学生某一门课的得分,(学号)->(成绩)和(课程号)->(成绩)都无法成立,所以成绩完全函数依赖于(学号,课程号)。
4)传递函数依赖:
例如:已知(学号->学校编号),(学校编号->学校名称),而学号又可以直接推出学校名称,即(学号->学校名称),如果一个表中同时拥有学号、学校编号、学校名称三个属性时,就具有了传递函数依赖,这时就不满足3NF了。
二、闭包
1.概念
在关系模式R<U,F>中为F所逻辑蕴含的函数依赖的全体叫做F的闭包。
(可以理解为在关系中F所能推出的(或者叫能影响的)所有属性、属性集以及相关函数依赖)
通常可以利用闭包来求候选键(候选键一定能推出全集)
2.示例
R(A,B,C,D,E,F,G),函数依赖集合{A->B,A->C,C->D,C->E,E->FG}
1)求候选键
(先观察函数依赖集,分别找到只在箭头左边出现的,只在箭头右边出现的,以及箭头两边都出现的:
只左:A
只右:B,D,F,G
两边都出现过:C,E
只在箭头左边出现过的只有A,那么可以确定候选键一定包含A,所以先用A进行验证,如果成功推出全集,A即为候选键;若不成功,则要将A和箭头两边都出现过的属性组成属性集,进行验证,比如验证AC是否为候选键,以及AE是否为候选键
(注意有时候选键不唯一,可能出现多种情况,如果AC是候选键,此时不能停下来,还要将AE也要验证一下,防止遗漏)
本题1)解决思路:
因为A->B,A->C,所以A->ABC(A一定能推出自己),AF(1)=ABC
又因为C->D,C->E),所以(A->ABCDE)(A能推出它直接影响的+它推出的属性能推出的所有属性(间接影响)),AF(2)=ABCDE
又因为E->FG,所以(A->ABCDEFG)(间接的间接),AF(3)=ABCDEFG=U(推出了全集)
所以A为候选键
2)判断最高满足第几范式
因为A->C,C->D,所以存在非主属性对码的传递函数依赖,不满足3NF
所以最高满足2NF