说到部分函数依赖,传递函数依赖,必须谈到2个概念,“非主属性”和“主属性”。
主属性:组成候选码的属性,就是主属性。例如,属性集{学号,姓名,身份证号码,联系电话},学号是主键。学号,身份证号码都是候选码,都属于主属性。可以看出,主键不一定包含所有的主属性。
非主属性:除去主属性,就是非主属性。示例中,姓名,联系电话,是非主属性。
部分函数依赖与传递函数依赖,网上有很多,但大多都是概念,不好理解。我这里给出1个比较容易理解的定义:
部分函数依赖:当1个关系模式中主键由2个及以上的属性组成时,非主属性只依赖于其中1个主属性,就是部分函数依赖。举例,属性集{学号,姓名,联系电话,教师编号,教师姓名},主键是2个主属性(学号+教师号),教师编号决定了教师姓名,所以教师姓名依赖于教师编号,不依赖于学号,教师姓名只依赖于主键的其中1个主属性,所以就是部分函数依赖。
与部分函数依赖相反的是“完全函数依赖”。完全函数依赖是:非主属性完全依赖于主属性。举例1,属性集{学号,课程号,成绩},学号和课程号是主键,学号和课程号一起决定成绩,所以成绩完全依赖于学号和课程号,就是完全依赖。举例2,属性集{学号,姓名,联系电话},学号是主键,学号决定姓名,学号决定联系电话,姓名依赖学号,联系电话依赖学号,也是完全依赖。
传递函数依赖:当关系模式中,出现非主属性决定非主属性时,就是传递函数依赖。举例,属性集{学号,姓名,学校编号,学校名称},主键是学号,学号决定学校编号,学校编号决定学校名称,且学校编号、学校名称都属于非主属性,那么就是传递函数依赖。
范式判断,我就不说那些课本概念了,我做一下通俗易懂的定义:
1NF: 属性不可再分(数据库表中的每一列都是不可分割的基本数据项)
2NF:满足1NF且非主属性均完全函数依赖于候选键。
3NF:满足2NF且非主属性没有传递依赖于候选键。
BCNF:满足3NF、且主属性完全函数依赖于候选键、且主属性没有传递依赖与候选键。
2NF、3NF,解决是非属性对候选键的依赖问题。
BCNF,解决的是主属性对候选键的依赖问题。