我有一些问题来确定F
函数依赖项的闭包是什么。
我知道它的定义是
F⁺= {X → Y\F⊨X → Y}
一个例子
设以下关系
R(Student,Examination, Date)
具有以下一组功能依赖性:
F={D,St → Ex, Ex → D}
关系分解为R¹(St,Ex) R²(Ex,D)
为什么是F¹= ∅
但是F²={Ex → D}
?我会做:F²= ∅
从定义F⁺
我从社区 wiki 知道
功能依赖性要求它们必须适用于每个 可能的实例。
从一个实例中,您无法找到某个关系模式中包含的功能依赖项
因此我不知道如何知道什么是函数依赖族的闭包。
另一个例子是:
第二个例子
R(Course,Student,Birthday,Grade)
具有以下一组功能依赖性:
F={C,St → G, St → B}
以及以下关系:
R¹(C,St,G)
和R²(St,B)
F¹{C,St → G}
根据定义,R²(St → B)
我会这样做:
F¹=F²=∅
当关系 R 与一组函数依赖 F 和 R 在 R 1 ...R n中的分解时,您必须考虑两个不同的概念:
函数依赖集 F 的闭包。这个称为 F +的闭包是从 F 导出的所有依赖集,直到可能为止,应用一组称为“阿姆斯特朗公理”的规则。这个集合可能非常长,(与 F 的依赖项数量呈指数关系),因此通常不计算它。相反,可以计算的是它的覆盖,它是 F +可以从中导出的少量依赖项(因此等同于 F +)。这种计算很有用,例如,当您规范化关系时。
一组依赖项 F 在 R 的分解上的投影。根据定义,对于每个 R i ,此投影是F +的所有依赖项的集合,这些依赖项具有R i中的所有属性(并表示为 π R i (F))。但是,由于我们不计算 F +,如上所述,我们无法计算这样的投影。在实践中,在简单的情况下,可以做的是查看 F 中是否存在某种依赖性,其所有属性都包含在 R i中,因此我们确信这种依赖性在 R i中成立. 但是,如果通过这种方式您没有在分解的关系之一中找到依赖关系,这并不能保证这种依赖关系会丢失,因为它可能作为其他依赖关系的结果而存在。
在您的第一个示例中,对于关系 R(S, Ex, D),您在 F 中有两个依赖项:
因此,考虑 R 2 = (Ex, D),我们可以立即看到依赖关系 Ex → D 在 R 2中成立,因为它的所有属性都包含在 R 2中,而第一个依赖关系不能在 R 1和 R中都不成立2,因为它具有三个属性。实际上,在关系 R 1中,您既没有第一个依赖项,也没有第二个依赖项( R 1中只存在来自 F +的微不足道的依赖项,例如 St → St)。
相反,在你的第二个例子中,分解的关系是这样的,在第一个中有第一个依赖的所有属性,所以它在其中很重要,而在第二个中有第二个依赖的所有属性,你又可以确保第二个依赖关系在第二个关系中成立。
最后,请注意,虽然计算 π R i (F)在计算上不可行,但有一种有效的多项式算法可以查看某个分解是否保留了相关性,换句话说,如果 ∪π R i (F) 是F +的封面。您可以在此答案中查看更多详细信息。