说明:数据库中的某些概念真的很让人头疼,概念的东西本来就是很枯燥的,再加上枯燥的学习,那就更加枯燥了。概念这东西,你不理解也能生产东西,经验多了就行,但是为了更深入的学习,你还必须理解。这里,我抛开书本的概念,尽量以我简单的理解,介绍一下这些概念:
- 什么是函数依赖?
- 什么是完全与部分函数依赖?
- 什么是平凡和非平凡函数依赖?
- 什么是属性集的闭包?
- 3范式的理解?
(1)什么是函数依赖?
解释:从这个"函数依赖"短语来看,2个词语,函数+依赖。
函数:学编程的都知道,但是这里并不仅仅指的指令的集合。让我们回到第一次接触"函数"这个词语的初中或高中时代吧。函数,是一种映射关系,也就是常见的X—>Y的关系,在数学上有很多的函数(Y=X+3),知道了这个关系,我们会有X得出Y,这就是函数,表示2个事物之间的某种对应关系。
依赖:人生分为4阶段,第一阶段,我依赖于爸妈,第二阶段,我依赖于老婆,第三阶段,爸妈依赖与我,第四阶段,我依赖于我的孩子。这个"依赖"是常用汉语的意思。但在专业术语里面,也就是这么个意思。
函数依赖:有这么个关系实体,学生(学号,姓名,年级,性别,年龄),我知道了一个学号,就可以知道有关这个学号的其他信息。就像,你们知道了我,就可以知道我爸妈是谁,我老婆是谁,以及我未来的孩子是谁(这个,只有到未来了)。
说白了:生活中的某个事物(人)具有一些特殊的属性(指纹),我们可以通过这个特殊的属性(指纹)知道它的一些其他的信息,这种关联我把它看做函数依赖。
(2)什么是完全与部分函数依赖?
解释:完全和部分,是针对于某个集体而言的。这个集体,指的是主键是多个属性的组合,而不是单个属性的主键。理解了上面的函数依赖,那么这里的完全与部分就不用过多的解释了。
例如:常见的选课表([学号,课程号],成绩)[]里面是主键。那么完全函数依赖就是:非主键的属性(成绩)必须,全部依赖于主键所有的属性([学号,课程号]),少一个都不可以。说白了,学号+课程号—>成绩,只知道其中(学号,课程号)的一个,就不可以。只知道学号,不知道课程号,是没有办法知道某人的某个课程的成绩的。这,就是完全函数依赖。
而,部分函数依赖,非主键的属性依赖于主键中部分的属性就可以了。
(3)什么是平凡和非平凡函数依赖?
解释:所谓的平凡,就是很普通的意思,那么非平凡就是不普通的意思。唉,你可别小看这个意思,它却让你容易理解概念的东西。那么怎么理解这个"平凡"呢。"平凡"的对立面可以说是特殊,特别,特别就是你平常不见的事物,就很特别,就不平凡。
例如:这个函数依赖(也就是关系):(学号,课程号)——>课程号,由学号和课程号推出课程号,这不是逗人玩儿吗?谁会这么二呀。已知课程号,你推出课程号,有意思吗?这就是我认为的重复性生产,太平凡的一件事儿了。所以,这就是平凡函数依赖。
而 (学号,课程号)——>所在系号,从没有推出有,这就是很特殊的一面,就是不平凡的。
说白了,对于一个函数依赖,由左边——>右边,如果右边的属性,在左边出现过,那么就是平凡函数依赖。反之,右边的属性没有在左边出现过,那么就是非平凡函数依赖。
(4)什么是属性集的闭包?
解释:属性集的闭包,首先是属性集的拥有,其次是闭包,封闭包含。
举个例子吧:有这个关系
SC(Sno, Sname, Sex, Birthday, Cno, Cname, Grade, Tno, Tname)
满足函数依赖集:
{Sno→Sname, Sno→Sex, Sno→Birthday, Cno→Cname, (Sno, Cno)→Grade, Tno→Tname}.
从这个函数依赖中,我们可以知道主键是(Sno, Cno, Tno)这三个属性的组合。
那么我问:属性集(Sno, Tno)的闭包是:?
从函数依赖集可知:Sno→Sname, Sno→Sex, Sno→Birthday而Tno→Tname
所以,闭包应该是,2个集的并集{Sno, Sname, Sex, Birthday, Tno, Tname}
属性集的闭包,说白了,就是有属性集中的每个属性,可以通过函数依赖推出的所有属性的集合。
(5)3范式的理解?
范式,我的理解就是制定二维表的标准。
我们常说的1NF是指:表中的每一个属性都是原子属性(不可分割的数据项)。第一范式很容易满足。
2NF:在1NF的前提下,每一个非主属性对于主键都是完全函数依赖的。换句话说,如果一个主键是单属性的话,那么它肯定是完全函数依赖的。
3NF:在2NF的基础上,每一个非主属性对于主键不存在函数传递依赖。这个函数传递依赖很容易理解,所以我就没有解释。
备注:以上纯属个人的理解,有些文字语言没有书本上概念的严谨,还需参考书本理解。