一个属性集 X 的闭包,记作 X⁺ 或 XF⁺(其中 F 是函数依赖的集合),表示所有在给定函数依赖集的基础上,能够被 X 函数决定的属性 [1]。
为了计算关系模式 R(U, F) 中某个属性集 X(X 是 U 的子集)的闭包 XF⁺,可以使用以下算法 [1]:
- 初始化:将 X(0) 初始化为 X 中的属性。设置计数器 i = 0 [1]。
- 寻找可推导出的属性集合 B:对于 F 中的每一个函数依赖 V → W,如果 V 中的所有属性都包含在当前的 X(i) 中,则将 W 中的所有属性加入集合 B [1]。
- 计算下一个集合 X(i+1):取 B 和 X(i) 的并集作为 X(i+1),即 X(i+1) = B ∪ X(i) [1]。
- 终止判断:检查 X(i+1) 是否与 X(i) 相同,或者是否包含了 U 中的所有属性。如果满足任一条件,则 X(i+1) 就是闭包 XF⁺,算法结束 [1]。
- 继续迭代:如果 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]:
- 只在左边的出现的节点一定存在于候选键中。(也就是候选键的一个一部分或者全部)
- 只在右边出现的节点一定不是候选键。(啥都不是,它只能被候选键推导出来 。是个铁废物)
- 两边都没有出现的节点,一定存在于候选键中。
- 两边都出现的节点有待观察。(让这些元素分别与已经确定的候选中的元素结合,利用闭包推导,看能不能推导出所有的元素。)
https://www.cnblogs.com/dyc-1234/p/6781846.html
指向原始笔记的链接