规范化依赖关系

14

我只是想确定自己的想法是否正确。

1)完全依赖是指一个或多个主键决定另一个属性。

2)部分依赖是指一个主键决定另一个或多个属性。

3)传递依赖是指非关键字属性决定另一个属性。

我的理解正确吗?

4个回答

15

这个答案直接来自于我的计算机科学课程,是从Connolly和Begg的教材中获得的。

enter image description here

全函数依赖

确定候选键(这里是propertyNo、iDate和pAddress)。因为这三者的任何组合都可以让你找到给定元组的其他属性(例如,我可以通过这三个条件找到完成检查的员工编号,我可以找到使用该车辆的员工编号等)。但请注意,要找到其他属性,需要同时拥有这3个条件,而不仅仅是部分条件。 全函数依赖始终涉及非候选键取决于候选键,不论是全部还是部分取决于候选键。

部分函数依赖

在这三个候选键中寻找依赖关系。是否有任何一个候选键的子集依赖于其他条件?有,它就是pAddress。给定一个propertyNo,你可以找到该物业的地址。然后再看看候选键之外的内容。是否有某些键仅依赖于候选键的某些部分而不是所有组件?在这种情况下,没有。所以部分依赖关系始终是候选键内部的依赖关系或非候选键对候选键的部分,而不是全部组件的依赖关系

传递依赖

现在,看一下非候选键(staffNo、comments、iTime(巡检时间)、sName、carReg)。其中,有没有任何一个属性对其他属性具有函数依赖性?有,那就是 sName - 给定一个 staffNo,你可以找出员工的名字。但是 staffNo 是对 3 个候选键具有函数依赖性的。因此通过传递性,propertyNo + iDate + pAddress -> staffNo -> sName,所以sName 对 staffNo 具有传递依赖传递依赖总是涉及到候选键之外的属性


1
不幸的是,那是一本非常糟糕的教科书,充满了错误。这混淆了关于FDs的概念与CKs和NFs无关的概念。此外,这只是模糊和介绍性的。它谈到了一些关于FDs和其他事情的内容,但实际上并没有说出它们中的任何一个是什么。 - philipxy

7
并不完全正确。你的术语需要更加精确:当你说“一个或多个主键”时,你(很可能)真正指的是“一个或多个主键列”?
只有当一个键由多个列(合成键)组成时,完全依赖和部分依赖才会有所区别:
1)完全依赖是指必须使用完整的键(键的所有列)来确定另一个属性。
2)部分依赖是指键是复合键且仅有一些列而非全部列决定了另一个属性。(这仍然可以是多列)
3)如你所说的传递依赖关系。

2
“只有当键由多个列组成时,才会出现区别”,这并不完全正确。涉及简单键的部分依赖在相对罕见但完全可能的情况下发生,即当空集{}是一个确定因素时。 - nvogel

4

完全依赖指的是依赖于所有相关属性,通常意味着所有候选键的属性。它不必是被指定为“主”键,因为主键在依赖理论和规范化中没有任何特殊作用。

部分依赖指的是依赖于这些属性的一个真子集,通常是某个候选键的真子集。

根据语境不同,传递依赖可能意味着以下两种情况之一:

(1) 形如 A->B, B->C 的依赖

(2) 形如 A->B, B->C 的依赖,其中 B 不是超键

几乎总是在指代(2)所描述的情况时使用传递依赖这个术语,并已经几乎成为了该意义的近义词,尽管(1)是更正式正确的含义。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接