📜  使用函数依赖查找子关系的候选键(1)

📅  最后修改于: 2023-12-03 15:22:22.443000             🧑  作者: Mango

使用函数依赖查找子关系的候选键

什么是函数依赖?

在关系型数据库中,函数依赖(Functional Dependency,以下简称 FD)是指某一属性或属性组的值,可以唯一地决定另一个属性或属性组的值。例如,学生的学号能够唯一地决定该学生的姓名。FD 可以用 A -> B 表示,表示 A 属性(或属性组)的值决定了 B 属性(或属性组)的值。

什么是候选键?

候选键(Candidate Key)是关系模式中能够唯一标识一个元组的最小属性集。一个关系模式可能存在多个候选键。候选键的性质包括唯一性和最小性。

如何使用函数依赖查找候选键?

对于一个关系模式 R,我们可以使用函数依赖来查找候选键。具体的过程如下:

  1. 将 R 中的所有属性作为一组候选键;
  2. 针对每个候选键集合 CK,判断 CK 是否能够唯一标识关系模式 R 中的每个元组;
  3. 如果 CK 能够唯一标识关系模式 R 中的每个元组,则 CK 是一个候选键;
  4. 否则,从 CK 中删除一个属性,得到一个新的属性集合,称为 CK'。返回第 2 步,使用 CK' 代替 CK。

在这个过程中,我们需要用到函数依赖的推导和分解技巧。具体来说,我们可以通过分解出满足某个 FD 的属性集合,并验证是否包含候选键来判断 CK 是否为候选键。如果 CK 不是候选键,则可以通过分解出满足某个 FD 的属性集合,并验证是否包含 CK 来生成新的候选键。

一个示例

假设我们有下面这个关系模式:

R(A, B, C, D, E)

我们知道下面这些 FD:

A -> B
C -> A
C -> D
E -> A

我们开始假设 {A, B, C, D, E} 是一个候选键。我们尝试移除其中的一个属性,得到下面的结果:

{B, C, D, E} -> A
A -> B
C -> A
C -> D
E -> A

很明显,{B, C, D, E} 并不能唯一标识元组。我们尝试将其分解,得到下面的结果:

{B, C, D} -> A
E -> A

通过验证,我们可以确定 {B, C, D} 是一个候选键。