什么是函数依赖?
如果两个具有相同 X 值的元组也具有相同 Y 值,即 X 唯一确定 Y,则关系中的函数依赖 X->Y 成立。
在表 1 中给出的 EMPLOYEE 关系中,
- FD E-ID->E-NAME成立是因为对于每个 E-ID,E-NAME 都有一个唯一的值。
- FD E-ID->E-CITY和E-CITY->E-STATE也成立。
- FD E-NAME->E-ID不成立,因为 E-NAME ‘John’ 不是唯一确定 E-ID。有 2 个 E-ID 对应于 John(E001 和 E003)。
员工
E-ID | E-NAME | E-CITY | E-STATE |
E001 | John | Delhi | Delhi |
E002 | Mary | Delhi | Delhi |
E003 | John | Noida | U.P. |
表格1
表 1 中给出的 EMPLOYEE 关系的 FD 集是:
{E-ID->E-NAME, E-ID->E-CITY, E-ID->E-STATE, E-CITY->E-STATE}
平凡与非平凡的函数依赖:平凡的函数依赖将始终保持在关系中。
X->Y will always hold if X ⊇ Y
在上面给出的例子中, E-ID, E-NAME->E-ID是一个微不足道的函数依赖,并且总是成立,因为 {E-ID,E-NAME} ⊃ {E-ID}。从表中也可以看出,对于{E-ID,E-NAME}的每个值,E-ID的值都是唯一的,所以{E-ID,E-NAME}在功能上决定了E-ID。
如果一个函数依赖不是平凡的,它被称为非平凡的函数依赖。非平凡函数依赖在关系中可能成立,也可能不成立。例如; E-ID->E-NAME是一个非平凡的函数依赖,它在上述关系中成立。
函数依赖的属性
设X 、 Y和Z是关系 R 中的属性集。函数依赖的几个属性始终存在于 R 中,也称为阿姆斯壮公理。
- 自反性:如果Y是 X的子集,则X → Y。例如;设 X 代表 {E-ID, E-NAME},Y 代表 {E-ID}。 {E-ID, E-NAME}->E-ID 对于关系为真。
- 增强:如果X → Y ,则XZ → YZ。例如;设 X 代表 {E-ID},Y 代表 {E-NAME},Z 代表 {E-CITY}。由于 {E-ID}->E-NAME 对于关系为真,所以 { E-ID,E-CITY}->{E-NAME,E-CITY} 也为真。
- 传递性:如果X → Y和Y → Z ,则X → Z。设 X 代表 {E-ID},Y 代表 {E-CITY},Z 代表 {E-STATE}。由于 {E-ID} ->{E-CITY} 和 {E-CITY}->{E-STATE} 对关系为真,所以 { E-ID }->{E-STATE} 也为真。
- 属性闭包:在功能上依赖于属性 A 的属性集称为 A 的属性闭包,它可以表示为 A + 。
求 A 的属性闭包的步骤
Q. 给定关系 R 的 FD 集,属性闭包集 S 是 A 的集合
- 将 A 添加到 S。
- 递归地添加可以从集合 S 的属性功能上确定的属性,直到完成。
从表 1 中,FD 是
给定 R( E-ID , E-NAME, E-CITY, E-STATE)
FDs = { E-ID->E-NAME, E-ID->E-CITY, E-ID->E-STATE, E-CITY->E-STATE }
E-ID 的属性闭包可以计算为:
- 将 E-ID 添加到集合 {E-ID}
- 添加可以从集合的任何属性派生的属性。在这种情况下,E-NAME 和 E-CITY、E-STATE 可以从 E-ID 派生出来。所以这些也是闭包的一部分。
- 因为还有一个其他属性要从 E-ID 派生。所以结果是:
(E-ID)+ = {E-ID, E-NAME, E-CITY, E-STATE }
相似地,
(E-NAME)+ = {E-NAME}
(E-CITY)+ = {E-CITY, E_STATE}
Q. 找到给定 FD 的属性闭包 R(ABCDE) = {AB->C, B->D, C->E, D->A}为了找到 (B) + ,我们将使用各种方法在集合中添加属性FD 如下表所示。
Attributes Added in Closure | FD used |
{B} | Triviality |
{B,D} | B->D |
{B,D,A} | D->A |
{B,D,A,C} | AB->C |
{B,D,A,C,E} | C->E |
- 我们可以通过将 C 和 D 添加到集合中(平凡性)然后 E 使用(C-> E)然后 A 使用(D-> A)来找到 (C, D) + 并且集合变为。
(C,D)+ = {C,D,E,A}
- 类似地,我们可以通过将 B 和 C 添加到集合中来找到 (B,C) + ,然后使用 (B->D) 然后使用 (C->E) 然后使用 (D->A) ) 并设置为
(B,C)+ ={B,C,D,E,A}
候选键
候选键是关系的最小属性集,可用于唯一标识元组。例如,表 1 中给出的 EMPLOYEE 关系的每个元组都可以由E-ID唯一标识,并且也是最小的。所以它将是关系的候选键。
候选键可能是也可能不是主键。
超级钥匙
Super Key 是关系的属性集,可以用来唯一标识一个元组。 例如,表 1 中给出的 EMPLOYEE 关系的每个元组都可以通过E-ID 或 (E-ID, E-NAME) 或(E-ID, E-CITY) 或 (E-ID, E-STATE) 或 (E_ID, E-NAME, E-STATE)等。所以所有这些都是 EMPLOYEE 关系的超级键。
Note: A candidate key is always a super key but vice versa is not true.
问:发现候选键和使用FD关系的超键,设定一组属性,其属性关闭设置相关的所有属性被称为关系的超级关键。例如,表 1 所示的 EMPLOYEE 关系具有以下 FD 集。 {E-ID->E-NAME, E-ID->E-CITY, E-ID->E-STATE, E-CITY->E-STATE}让我们计算不同属性集的属性闭包:
(E-ID)+ = {E-ID, E-NAME,E-CITY,E-STATE}
(E-ID,E-NAME)+ = {E-ID, E-NAME,E-CITY,E-STATE}
(E-ID,E-CITY)+ = {E-ID, E-NAME,E-CITY,E-STATE}
(E-ID,E-STATE)+ = {E-ID, E-NAME,E-CITY,E-STATE}
(E-ID,E-CITY,E-STATE)+ = {E-ID, E-NAME,E-CITY,E-STATE}
(E-NAME)+ = {E-NAME}
(E-CITY)+ = {E-CITY,E-STATE}
如 (E-ID) + , (E-ID, E-NAME) + , (E-ID, E-CITY) + , (E-ID, E-STATE) + , (E-ID, E-CITY, E-STATE) +给出关系 EMPLOYEE 的所有属性的集合。所以所有这些都是关系的超级关键。
其属性闭包是关系的所有属性的集合的最小属性集称为关系的候选键。如上所示,(E-ID) +是关系的所有属性的集合,并且是最小的。所以 E-ID 将是候选键。另一方面 (E-ID, E-NAME) +也是所有属性的集合,但它不是最小的,因为它的子集 (E-ID) +等于所有属性的集合。所以 (E-ID, E-NAME) 不是候选键。