如何找到候选键?
回答
给定一个关系模式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
- 1. 如何找到一个候选键
- 2. 如何从一组超级键中找到所有可能的候选键?
- 3. 查找关系的所有候选键
- 4. 候选键或超级键
- 5. 找到R的所有最小的候选键
- 6. 找到给定FD的候选键的方法:s?
- 7. 帮助查找数据库候选键,主键
- 8. 没有找到Autowired bean的候选人
- 9. 如果我找不到我的表的候选键(标准化),该怎么办?
- 10. 如何找到最大的候选人招募一年在SQL
- 11. 指定候选键Grails的?
- 12. 候选键约束12.1
- 13. 候选关键字/缩小
- 14. 改变候选键2005
- 15. 候选键和主键是什么?
- 16. 如何选择给定关系模式R中的候选键?
- 17. 如何在关系数据库设计中找出候选关键字
- 18. 如何升级到候选版本?
- 19. 如何找到关键
- 20. 如何找到特定键的键码
- 21. 所有候选键都是超级键,而所有超级键都不是候选键。为什么?
- 22. 找到仍有机会赢得选举的候选人人数
- 23. 如何在cakephp 3中创建候选键?
- 24. 如何在样本软键盘中提交候选项目?
- 25. 候选键有什么意义?
- 26. 候选关键字的子集
- 27. 这是一个候选关键?
- 28. 数据库 - 候选键和FD
- 29. 主键,唯一键和候选键之间的区别
- 30. 主键也是超级键和候选键吗?
您使用的是什么参考?你在哪里坚持应用它?请谷歌'堆栈交换作业'。你只是要求一个教科书的章节/部分有一个特殊的例子。这太宽泛了。 – philipxy