如何找到候选键?
给定一个关系模式R
与一组属性T
的和非空集非平凡函数依赖F
的描述某一组假定在该模式保持的约束:
每个属性不出现在FD的右侧部分
F
必须出现在任何候选键。不会在FD的左部出现在
F
不能出现在任何候选键每属性。
要找到所有的候选键,所有其他属性,你应该尝试添加到1的属性在他们之上的每一个可能的组合,看看是否关闭判断的关系的所有属性(并且不能从组合中删除任何属性而不会丢失该属性)。
需要注意的是,如果设定F
是空的,唯一的候选键是由所有属性T.
构成在实践中,有算法,可以相对有效的(因为发现所有键的问题在一般情况下指数)。
一种简单的方法是从函数依赖的规范盖开始,在这种情况下,例如从:
{ A B → C
C → A
C → D }
并发现在这种情况下,属性必须存在于任何候选键(后B
),尝试向它们添加依赖关系的左侧(在这种情况下,两个都是AB
,即A
和C
)(以任意顺序,并可能将它们组合)并计算闭包,以查看它们是否确定所有属性。当您发现某些属性集确定了所有关系属性时,您已找到候选关键字(并且不需要为其添加其他属性)。在您的例子:
(A B)+ = A B C D
(B C)+ = A B C D
所以A B
和B C
是候选键(因为你不能删除他们两个中的任何属性,而不会丢失确定所有其他属性的属性)。由于没有其他属性(D
中的一部分不能出现在候选键中),因此您知道已找到所有候选键。
每个属性都确定自己,所以你的1&2是空的,除非你假设关于FD的东西,就像它们不平凡一样。但唯一的CK本身可能是微不足道的(所有的属性),所以2是错误的,你不能忽略用于发现CK的普通FD的属性。“实践中”之前的部分对于找到CK是不清楚的。我建议进行修复,但我不清楚如何修改此演示文稿以保持其风格/方法/本质(可能是这样),但要使其准确无误。 – philipxy
@philipxy,我试图纠正答案。如果您认为它仍然太多和/或混淆,我会删除它。 – Renzo
项目符号用于您的算法。他们真的属于它作为子步骤。即该算法的最小覆盖范围实际上就是子弹明智的上下文。但是,您错过了将最终步骤添加到由FD部分生成的非覆盖属性的最后一步。所以我基本上建议你提供一个实际的算法,发布在某个地方...... *像提问者的教科书,他们忽略*。也许不那么简单,但可能比现在的答案更简洁。或者只是找到一个SO重复。 “我如何找到候选人钥匙?”给我休息一下。 – philipxy
您使用的是什么参考?你在哪里坚持应用它?请谷歌'堆栈交换作业'。你只是要求一个教科书的章节/部分有一个特殊的例子。这太宽泛了。 – philipxy