如果我有R(E,F,G,H),那么这些功能依赖项中的候选键是什么?
FD1: EF -> G
FD2: EF -> H
FD3: G -> E
FD4: H -> F
我的想法是,由于EF-> G和EF-> H,因此EF将被视为候选密钥,因此EF + = {E,F,G,H}。我可以说GH也是候选关键字吗,因为G-> E,H-> F,因此GH-> EF和GH + = {E,F,G,H}?还有其他候选密钥吗?
答案 0 :(得分:1)
该模式具有四个候选键:EF,EH,FG,GH。您可以通过计算每对属性的闭包并注意其中包含所有属性来轻松验证这一事实。
问题自然是如何找到它们。简单的方法只是尝试关闭关系的所有属性子集,但这显然效率不高,是一个指数过程。
有更有效的算法来查找所有候选键,但是它们非常复杂。有简单的试探法,可以在不使用正式算法的情况下帮助降低解决方案的复杂性。
首先,您应该从规范的封面开始,否则不能应用这些启发式方法(在您的示例中,您已经具有规范的封面)。第一步是您可以排除仅出现在依赖项右侧的任何属性(在这种情况下不是),并考虑仅出现在左侧的所有属性必须始终是任何键的一部分(也不能在这种情况下)。
然后,您可以从依赖项的左侧开始,并计算它们的闭包,以查看那些属性集是否可以确定所有其他属性。如果不是这种情况,则可以一次添加其他属性,然后再次计算结果集的闭包,当发现键或该集合包含已考虑的子集时,不再考虑这些属性。
例如,在EF中,您发现可以确定所有其他属性,因此这是一个候选键。然后,考虑G,您可以添加E,注意EG + = EG,因此这不是候选密钥,然后添加H,注意GH + = EFGH,因此这是候选密钥,最后添加F,发现FG为候选密钥。当然,当一组属性是候选键时,您不会在其中添加其他属性。另一组测试从H开始,首先是HE(产生候选密钥),然后是HF,后者不产生候选密钥。在这一点上,我们应该检查是否向EG或HF添加了一个属性,我们是否获得了候选密钥,但是我们可以安全地在此处停止,因为我们将仅获得已经考虑过的集合的超集(例如,包含EGF的EGF)