本文章的素材与知识来自李国良老师和冠宇老师。
-
依赖理论
对于关系数据库中的依赖,分为函数依赖、多值依赖和连接依赖。
一.函数依赖
1.函数依赖
(1)定义:
(2)理解:
- 通俗地讲,对于关系R中的两个属性或属性组X和Y,如果X的值能决定Y的值,则X->Y。
- 其中X和Y可能由一个属性构成,也可能由多个属性构成。
- 函数依赖X->Y要求当X的值相同时,Y的值一定相同;但不要求X的值不同时的情况,即允许当X的值不同时,Y的值仍可能相同。
- 一个函数依赖X->Y要成立,不仅要求当前关系R中的已有数据均满足函数依赖条件,还要求关系R的所有可能取值都要满足函数依赖条件。即当前已有的数据要满足X->Y,未来可能添加的数据也必须满足X->Y。
(3)意义:函数依赖反映了一个关系中属性或属性组之间相互依存、相互制约的关系,同时具有对现实世界的反映。例如:国家—>首都。
(4)分类:函数依赖还可以进一步细分为 平凡函数依赖和非平凡函数依赖、部分函数依赖和完全函数依赖、传递函数依赖。这三种分类不冲突,一个函数依赖可以同时是平凡(或非平凡)、部分(或完全)、传递的。
2.平凡和非平凡函数依赖
(1)定义:
(2)理解:
- 平凡函数依赖是无意义的,因为关系的所有属性或属性集X均满足X->X,即均满足平凡函数依赖。
- 因此平常所指的函数依赖默认都是非平凡函数依赖。例如说X->Y,那么我们不考虑Y是X的子集的情况。
3.部分和完全函数依赖
(1)定义:
(2)理解:
- 通俗地讲,对于函数依赖X->Y,只要X少了一个属性就无法决定Y,则称Y完全函数依赖于X;如果X少了一个或多个属性后仍能决定Y,则称Y部分函数依赖于X。
(3)平凡非平凡 + 部分完全:
上述提到一个函数依赖的平凡非平凡与部分完全是不冲突的,因此下面来对这两个属性作排列组合,探讨其可行性。
- 平凡+部分:可行。X->X
- 平凡+完全:可行。(X,Y)->(X,Y)
- 非平凡+部分:可行。(X,Y)->Z 且 X->Z
- 非平凡+完全:可行。(X,Y)->Z
4.传递函数依赖
(1)定义:
(2)理解:
- 为什么当Y->X时,就有X->Z?若Y->X,又因为Y->Z,则有Y是该关系的候选键;又因为X->Y,所以X也是该关系的候选键,因此有X->Z。
- 传递函数依赖的定义中,仅限制了Y!->X,但是未限制Z->Y。
5.从函数依赖的角度理解关系的键
(1)
(2)通俗地讲,对于关系R的属性集U,X是U中的一个属性,如果U中所有属性都完全函数依赖于X,则X可以作为该关系R的一个候选键。
(3)所有在候选键中的属性都为主属性,不在任一候选键中的属性为非主属性。
(4)对于一个候选键内部的所有主属性之间,不存在任何函数依赖,包括部分完全、传递非传递。
(5)对于同一个关系模式的不同候选键,它们的属性个数是可能不同的!例如:对于关系模式R<U,F>,U={ A,B,C },F={ A->B,A->C,(B,C)->A },那么根据上述候选键的性质,该关系模式R的候选键有:(A)和(B,C)。
二.多值依赖
1.多值依赖
(1)定义:
(2)理解:
- 通俗地讲,多值依赖X->->Y,就是给一个X,能决定一组Y的值,且这组Y的值只与X有关。
(3)示例
该关系中,给一个Sno可以决定一组Phone,因为一个学生可以有多个手机号;且Phone的值只取决于Sno,与Email无关;因此构成多值依赖Sno->->Phone。
同样地,给一个Sno可以决定一组Email,因为一个学生可以有多个邮箱;且Email的值只取决于Sno,与Phone无关;因此构成多值依赖Sno->->Email。
(4)函数依赖与多值依赖的关系
- 函数依赖是对于属性或属性集X和Y,给一个X可以决定一个Y。
- 多值依赖是对于属性或属性集X和Y,给一个X可以决定一组Y。
- 函数依赖是一种特殊的多值依赖,当X->->Y,且这组Y里面实际只有一个值的时候,则多值依赖X->->Y就成为了函数依赖X->Y。因此函数依赖又称为单值依赖。
2.平凡和非平凡多值依赖
(1)定义:
(2)理解:
- 平凡和非平凡多值依赖,就是看除了X、Y以外,关系R中是否还有其他属性或属性集:若只有X、Y,则是平凡多值依赖;若除X、Y以外还有其他属性或属性集,则是非平凡多值依赖。
三.连接依赖
1.连接依赖
(1)定义: