一个属性集 X 的闭包,记作 X⁺XF⁺(其中 F 是函数依赖的集合),表示所有在给定函数依赖集的基础上,能够被 X 函数决定的属性 [1]。

为了计算关系模式 R(U, F) 中某个属性集 X(X 是 U 的子集)的闭包 XF⁺,可以使用以下算法 [1]:

  1. 初始化:将 X(0) 初始化为 X 中的属性。设置计数器 i = 0 [1]。
  2. 寻找可推导出的属性集合 B:对于 F 中的每一个函数依赖 V → W,如果 V 中的所有属性都包含在当前的 X(i) 中,则将 W 中的所有属性加入集合 B [1]。
  3. 计算下一个集合 X(i+1):取 B 和 X(i) 的并集作为 X(i+1),即 X(i+1) = B ∪ X(i) [1]。
  4. 终止判断:检查 X(i+1) 是否与 X(i) 相同,或者是否包含了 U 中的所有属性。如果满足任一条件,则 X(i+1) 就是闭包 XF⁺,算法结束 [1]。
  5. 继续迭代:如果 X(i+1) 与 X(i) 不同,并且没有包含 U 中的所有属性,则将 i 增加 1(i = i + 1),返回步骤 2 继续执行 [1]。

这个迭代过程会不断向 X(i) 中添加新的属性,只要某个函数依赖的左部包含在当前集合中,就将其右部的属性也加入闭包,从而确保所有可由 X 推导出的属性都被包含在最终的闭包中 [1]。

使用闭包计算关系的键

超键

在一个关系 R 中,若一个属性集 K 能够函数决定 R 中的所有属性,则称 K 为一个 超键(superkey) 。

指向原始笔记的链接

利用闭包的概念,这意味着 K 的闭包 K⁺(或 KF⁺)必须包含关系模式 U 中的所有属性(即 K⁺ = U)[1]。

候选键

一个 候选键(key 或 candidate key) 是一个 极小的 超键。也就是说:

  • K 是一个超键(K⁺ = U),
  • 并且 K 的任何真子集都不是超键(即对于 K 的任意子集 K’,如果 K’ ≠ K,则 K’⁺ ≠ U)[1]。
指向原始笔记的链接

计算候选键

要使用闭包来找出关系的键,可以按照以下步骤进行 [1]:

  1. 只在左边的出现的节点一定存在于候选键中。(也就是候选键的一个一部分或者全部)
  2. 只在右边出现的节点一定不是候选键。(啥都不是,它只能被候选键推导出来 。是个铁废物)
  3. 两边都没有出现的节点,一定存在于候选键中。
  4. 两边都出现的节点有待观察。(让这些元素分别与已经确定的候选中的元素结合,利用闭包推导,看能不能推导出所有的元素。)

https://www.cnblogs.com/dyc-1234/p/6781846.html

指向原始笔记的链接