函数依赖
函数依赖的概念
学习函数依赖前,我们先了解一下什么叫依赖关系:
对于R中任意一个可能的关系,不可能存在X属性值相等,但Y属性值不等的情况,那么就可以说X函数确定Y或者
Y依赖于X
,记作X➡Y。
函数依赖同别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖。例如,姓名→年龄是一种依赖关系,但是如果出现同命人,那么年龄就不再依赖于姓名了。
函数依赖中常见的术语
非平凡的函数依赖
:X→Y,但是X⊊Y,那么X→Y就是非平凡的函数依赖
平凡的函数依赖
:X→Y,但是X⊆Y,那么X→Y就是一种平凡的函数依赖
决定因素
:X→Y,那么X就是Y的决定因素
完全函数依赖
:在一个关系中,X→Y,并且X任意一个真子集X’与Y都没有依赖关系,这就成Y对X完全函数依赖,否则称
非完全函数依赖
以学生选课数据库为例,有关系R(学号,课程号,姓名,学院,成绩,课程名)
主属性是(学号,课程号)
非主属性有(学院,姓名,成绩,课程名)
对它进行函数依赖关系的分析:
由于只根据学号无法知道哪一门成绩,只知道课程号无法知道是谁的成绩,因此只有两者组合起来才能确定一门成绩,
(学号,课程号)→成绩是一种完全函数依赖
而姓名、学院等属性与课程号无关,课程名与学号无关,因此
(学号,课程号)→姓名/学院/课程名是一种完全函数依赖
码
码是可以确定一个元组的所有信息的属性名或属性名组。在一个数据库中,有以下几种码:
候选码
:如果关系中的某一属性或属性组的值能唯一地标识一个元祖,则称该属性组为候选码。
主码
:如果一个关系有多个候选码,则选定其中一个为主码。
主属性
:候选码的诸属性称为主属性。
非主属性
:不包含在任何候选码中的属性称为非主属性。
范式(NF)
关系数据库中的关系是满足一定要求的,满足不同程度的要求的为不同范式。
1NF
第一范式可以理解为一张单独的表,各表项之间没有相联的关系,如果关系模式R的每一个属性都是不可再分的数据项,则称关系模式R满足第一范式。
2NF
第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。第二范式要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
第二范式要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,
第二范式就是非主属性非部分依赖于主关键字
。
3NF
在第二范式基础上,消除非主属性对键的传递依赖,则称它符合第三范式。如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R为第三范式。
第三范式的定义比较抽象,这里仍举学生选课的例子来讲解:
在学生选课数据库中,主属性为(学号,课程号),非主属性是(课程名,学院,成绩,班号)
对于对于学生信息这样的数据库,有这样的传递函数依赖关系:
学号→学院→班号
,这样就会造成删除等操作时比较严重的错误,再建立一个表,包括学号、学院、班号的数据库,取消原表中的班号,这样就消除了传递函数依赖,可称为第三范式
BCNF
设关系模式R∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有超码,那么R∈BCNF。满足BCNF条件有:所有非主属性对每一个候选键都是完全函数依赖; 所有的主属性对每一个不包含它的候选键,也是完全函数依赖;没有任何属性完全函数依赖于非候选键的任何一组属性。
以上范式的转化关系可以简单描述为一下一张图: