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

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

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

在关系型数据库中,候选键是一个或多个属性的组合,唯一地标识一个关系中的元组。在数据库设计中,选择一个合适的候选键是非常重要的,它会影响到数据库的性能和数据完整性。使用函数依赖可以帮助我们找到一个关系的候选键和子关系,下面让我们来看看如何使用函数依赖查找候选键。

函数依赖

函数依赖指的是一个或多个属性的值可以决定其他属性的值。例如,如果一个关系 R 中,属性 A 的值可以决定属性 B 的值,则称为函数依赖 A->B。我们可以用箭头表示函数依赖,如下所示:

A->B

如果一个关系中存在多个函数依赖,则可以表示为:

A->B,C

其中 A 可以决定 BC

候选键

候选键是一个或多个属性的组合,唯一地标识一个关系中的元组。如果一个关系中只存在一个候选键,则称为主键,主键是唯一的且不能为空。在数据库设计中,选择一个合适的候选键是非常重要的,如果选择的候选键不合适,会导致数据库的性能下降和数据完整性受到威胁。

在一个关系中,可以有多个候选键,我们需要找出其中的一个或多个候选键并将其作为主键。我们可以通过函数依赖来找到一个关系的候选键。

假设一个关系 R 中,存在函数依赖 A->BB->C,如果属性 AR 的候选键,则 A 可以决定整个关系 R,因为通过 A 可以找到 B,通过 B 又可以找到 C,所以整个关系中的元组都是唯一标识的。因此,AR 的主键。

但是,在实际情况中,很少会出现这种情况,通常一个关系中可能有多个候选键,我们需要找到其中的一个或多个候选键并将其作为主键。

依赖关系图

在找到候选键之前,我们需要确定一个关系中的所有函数依赖关系。我们可以使用依赖关系图来表示一个关系的函数依赖关系。假设一个关系 R 中,存在属性集合 {A, B, C, D},函数依赖关系如下:

A->B
B->D
C->A,B

我们可以通过依赖关系图来表示这些函数依赖关系,如下图所示:

      A <---- C
      |      |
      v      v
      B      B -> D
      |
      v
      D

在上图中,箭头表示函数依赖关系,例如 A->B 表示属性 A 可以决定属性 B 的值。

查找候选键

通过依赖关系图,我们可以找到一个关系的候选键。要找到候选键,我们可以从下面三个步骤开始:

  1. 找到依赖关系图中所有的超键,超键是一个属性集合,可以决定整个关系中的元组,例如上图中的 {A,B}{C,A,B}
  2. 从超键中找到最小的超键,最小超键是不能再去掉任何一个属性而依然能决定整个关系的属性集合,例如上图中的 {A,B} 就是最小超键。
  3. 如果最小超键只包含一个属性,则此属性就是关系的主键;否则,最小超键就是一个候选键。

考虑上图中的函数依赖关系图,我们可以依次执行上面的三个步骤:

  1. 首先,找到依赖关系图中所有的超键。超键包括 {A,B}{C,A,B}{A,B,D}
  2. 其次,从超键中找到最小超键,即 {A,B}
  3. 最后,由于最小超键只包含两个属性,因此 {A,B} 就是关系 R 的候选键。
查找子关系

在找到一个关系的候选键之后,我们可以使用它来识别关系的子集或子关系,例如:

假设一个关系 R 中包含属性集合 {A, B, C, D},函数依赖关系如下:

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

通过依赖关系图,我们可以找到关系 R 的候选键为 {A, B, C}

现在假设我们需要找到关系 R 中所有的子关系或子集。为了找到所有的子关系,我们需要从候选键中移除属性,并保证每个子集都是函数依赖的闭包,例如:

  1. 移除属性 A,形成关系 {B, C, D},因为 B->CC->D,因此这是一个函数依赖的闭包,可以得到子关系 {B, C, D}
  2. 移除属性 B,形成关系 {A, C, D},由于 A->BB->CC->D,因此这是一个函数依赖的闭包,可以得到子关系 {A, C, D}
  3. 移除属性 C,形成关系 {A, B, D},由于 A->BB->CC->D,因此这是一个函数依赖的闭包,可以得到子关系 {A, B, D}
  4. 移除属性 D,形成关系 {A, B, C},由于 {A, B, C} 是关系 R 的候选键,因此这也是一个子关系。

通过上面的操作,我们可以找到关系 R 的所有子关系或子集。

总结

在关系型数据库设计中,选择合适的候选键非常重要,它会影响到数据库的性能和数据完整性。使用函数依赖来查找候选键和子关系是一种比较常见的方法,通过依赖关系图和函数依赖的闭包,我们可以很方便地找到一个关系的候选键和子关系。