考虑 R(A,B,C,D,E)
F = {BC->AE, A->D, D->C, ABD->E}
。
我需要找到架构的所有候选键。
我知道 BA
,BC
,BD
是键,但我想知道如何发现它们。
我在 candidate keys from functional dependencies 中看到了一些答案= 但我没有完全理解它们。
根据他们的建议,我得到了 L={B}
, M={A,C,D}
, R={E}
现在我需要一次从 M
添加一个到 L
。
我从 A
开始,得到 BA
。所以 BA->A
,BA->B
(平凡)并且因为 A->D
所以 BA->D
并且因为 D->C
我们得到 BA->C
。
但是,我们如何得到 E
呢?
最佳答案
改编自 https://stackoverflow.com/a/14595217/3591273 的答案
因为我们有函数依赖:BC->AE, A->D, D->C, ABD->E
,我们有以下 super 键:
-
ABCDE
(所有属性始终是 super 键) -
ABCD
(我们可以通过E
获取属性ABD -> E
) -
ABC
(只需添加D
到A -> D
) -
ABD
(只需添加C
到D -> C
) -
AB
(我们可以通过D
得到A -> D
,再通过C
得到D -> C
) -
BC
(我们可以通过E
得到BC -> E
,再通过C
得到D -> C
) -
BD
(我们可以通过C
得到D -> C
,再通过AE
得到BC -> AE
)
(这里要实现的一个技巧是,由于 B
从不出现 在函数依赖项的右侧,每个键都必须包含 B
,即键 B
是 独立且不能从其他 key 派生)
Now that we have all our super keys, we can see that only the last three are candidate keys. Since the first four can all be trimmed down. But we cannot take any attributes away from the last three superkeys and still have them remain a superkey.
所以最小键是AB
, BC
, BD
更新
这是一种缩减方法,即通过使用函数依赖性连续减少琐碎的 super 键,但也可以采取相反的方式并使用扩充方法,即开始使用单个简单的键并使用其他键增加它们 wrt 依赖关系,直到键变得多余
关于database - 了解候选键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34252455/