Database 如何找到候选密钥?
例如: 设R=(A,B,C,D) 设F={C->AD,AB->C} 那我怎么才能找到候选钥匙呢 答案是{AB,BC}Database 如何找到候选密钥?,database,relational-database,functional-dependencies,candidate-key,Database,Relational Database,Functional Dependencies,Candidate Key,例如: 设R=(A,B,C,D) 设F={C->AD,AB->C} 那我怎么才能找到候选钥匙呢 答案是{AB,BC} 为什么?给定一个关系模式R,其中包含一组属性T,以及一组非空的非平凡函数依赖项F,描述假定在该模式中保持的一组特定约束: 未出现在F中FD右侧部分的每个属性必须出现在任何候选关键字中 在F中未出现在FD左侧部分的每个属性不能出现在任何候选关键字中 要查找所有候选键,对于所有其他属性,应尝试将它们的每个可能组合添加到1的属性中,并查看闭包是否确定了关系的所有属性(并且,如果不丢失此
为什么?给定一个关系模式
R
,其中包含一组属性T
,以及一组非空的非平凡函数依赖项F
,描述假定在该模式中保持的一组特定约束:
F
中FD右侧部分的每个属性必须出现在任何候选关键字中F
中未出现在FD左侧部分的每个属性不能出现在任何候选关键字中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
因此,
ab
和bc
都是候选键(因为您无法删除这两个键的任何属性,而不会丢失确定所有其他属性的属性)。由于没有其他属性(来自D
的部分不能出现在候选密钥中),您知道您已经找到了所有候选密钥。您使用的是什么参考?你在哪里应用它?请用谷歌搜索“stackexchange家庭作业”。你只是要求教科书中有一章或几节有一个专门的例子。这太宽泛了。每个属性都决定它自己,所以你的1和2都是空的,除非你假设了一些关于FD的东西,比如它们是不平凡的。但是唯一的CK本身可能是琐碎的(所有属性),因此2是错误的&您不能在查找CK时忽略琐碎FDs的属性。“实践中”之前的部分不清楚如何查找CK。我建议进行修复,但我不清楚如何修改此演示文稿以保持其风格/方法/本质(无论是什么),但要使其准确。@philipxy,我试图更正答案。如果您认为它仍然太多bug和/或混乱,我将删除它。项目符号用于您的算法。它们实际上属于它的子步骤。也就是说,算法的最小覆盖范围实际上就是你的子弹所处的环境。但您缺少将非覆盖属性添加到FD零件生成的属性的最后一步。所以我基本上建议你展示在某处发布的实际算法。。。就像提问者的教科书一样,他们忽视了这一点。也许没有你现在的回答那么简洁,但也许比你现在的回答更简洁。或者只是找到一个如此重复的。“我怎样才能找到候选密钥?”让我休息一下。在第二部分中,你似乎是在介绍并激励算法,首先给出它使用的子弹,一个从1开始并受2限制的蛮力算法。我不认为你可以让项目符号在一个假设F是规范的,并在以后添加未提及的属性的算法之外工作。对于不在F中的属性,2仍然为false。仍然需要F+。缺少明确的定义——确定所有属性的最小集合——1和2只会使暴力搜索变得复杂。总之,子弹后面的两段不清楚。嗯。。。有一个像样的答案吗?我注意到我的评论非常简洁,但事实是,你对算法的介绍并不清楚,尽管我相信你能说清楚。