确定功能依赖关系中的键

时间:2011-04-20 19:26:54

标签: database functional-dependencies

我正在学习数据库理论课程,在阅读了如何推断密钥之后我不清楚,给出了一组功能依赖。

我有一个示例问题:

查找具有功能依赖关系的关系R(ABCDEFG)的所有键

AB → C
CD → E
EF → G
FG → E
DE → C
BC → A

通过确定以下哪一项是关键来证明您的知识。

a. BCDEF             
b. ADFG           
c. BDFG           
d. BCDE 

有人可以告诉我如何分解功能依赖关系以得出某些属性组合是关键的结论吗?我希望我会遇到很多这类问题,我需要了解如何处理它。

7 个答案:

答案 0 :(得分:31)

拿FD,例如AB→C

增加直到提到所有属性,例如ABDEFG→CDEFG(请注意,这相当于ABDEFG→ABCDEFG,因为A-> A和B-> B非常简单。

这告诉你ABDEFG是超级密钥。

检查LHS是超级密钥子集的其他FD,其RHS上包含超级密钥的其他属性。

有两个。 EF→G和FG→E。从超级密钥中删除这些RHS的属性。这样做会给你两把钥匙,肯定是超级钥匙,但不一定是不可减少钥匙:ABDEF和ABDFG。

然而,从AB→C和CD→E我们也可以推导出ABD→E。因此我们也可以从ABDEF键中删除E.这里令人讨厌的是,当我说“检查其他FD”时,这显然意味着你还应该检查出现在你的FD集合中的任何FD(即可以从你给定的FD集合中导出的任何FD) ......用手做这有点不切实际......

验证结果是否正确的有用网站:

http://www.koffeinhaltig.com/fds/ueberdeckung.php

您现在应该能够确定选项c是一个关键。

更新

链接现在已经破了,不知道该网站已经去了哪里。也许你仍然可以在跟踪互联网历史的网站上找到有用的东西。

答案 1 :(得分:17)

此视频非常清楚地解释了

http://www.youtube.com/watch?v=s1DNVWKeQ_w

答案 2 :(得分:3)

这应该是相当简单的。您需要做的就是关闭给定的每个键并查看它是否包含R的所有属性。例如,自BC以来BCDEF = ABCDEFG的关闭 - > A和BC是BCDEF的子集,因此如果EF用于FD EF - > G.由于此闭包包含R的所有属性,因此BCDEF是关键。采用闭包的主要目的是看看我们是否可以从一组给定的属性“到达”每个属性。闭包是我们通过导航FD实际可以达到的一组属性。

答案 3 :(得分:2)

由于您正在参加数据库理论课程,我将假设您拥有SQL经验,并尝试将理论与实施环境联系起来。

基本上,关系是你在实现中称为表的关系,关键是任何一组属性(读取列),可用于标识UNIQUE行(在db理论中这将是一个元组)。这里最简单的类比是,键是您的主键,以及您可以用来标识关系中的单个元组(表中的行)的任何其他可能的列集。所以,这里是执行此操作的基本步骤(我将介绍示例A,然后您可以尝试其余的步骤):

  1. 列出建议密钥中不存在的所有属性(因此BCDEF不包含A和G)。
  2. 对于您缺少的每个属性,请浏览功能依赖项列表,看看您建议的密钥是否能够推断您缺少的属性。

                 a. So for A, you have BC -> A.  Since both B and C are in the proposed
                    key BCDEF, you can infer that BCDEF -> A.  Your set now becomes
                    BCDEFA.
                 b. For G, again going through your FDs you find EF -> G.  Since both
                    E and F are in BCDEFA, you can infer BCDEFA -> G.
    
  3. 因为您能够从BCDEF推断出A和G,所以选项a是ABCDEFG关系的关键。我知道有一个算法,它可能在你的课程文本的某个地方。也有一个例子。您应该手动逐步操作,直到模式直观。

    编辑:我之所以回过头来查找这个算法的原因是你的考试可能会被编写而不是多项选择,因为它是一个db理论课程。如果这是真的,那么如果您可以有条不紊地遵循课程文本/笔记中所示的符号,您将获得更多的部分学分。

    主要目标是将密钥转换为关系,这应该证明提议的密钥实际上是关键。

答案 4 :(得分:1)

好吧,我不是这方面的专家,所以如果我错了,请纠正我,但我的方法是消除不可能的答案

在这种情况下:

你的FD中没有一个“给你”B,D或F ...因为那些是关系的一部分,所以没有不包含B,D和F的超级键...删除答案b(B是失踪)...删除答案d(F缺失)

现在让我们检查剩下的答案,如果它们包含足够的信息来获取关系的所有部分

回答a(BCDEF)将“给”你B,C,D,E和F所以你需要找到使用FD的A和G ...可以通过BC到达A,可以通过EF到达G,所以回答一个是关键

答案c(BDFG)将“给”你B,D,F和G所以你需要使用FD找到A,C和E ...可以通过FG到达E ... C可以通过DE(在通过FG到达E之后)......最后A可以通过BC到达(到达C之后)......

所以答案c是某种键,因为可以通过这种方式访问​​整个关系...但我不知道这是否足以符合正式定义...如果我必须猜测,我别说

答案 5 :(得分:0)

代码

如果代码与您讨论的不仅仅是长解释,那么这是一个基于函数依赖性查找键的算法的25行实现:

https://github.com/lovasoa/find-candidate-keys/blob/master/find-candidate-keys.js

实施例

candidate_keys(["A","B","C","D","E","F","G"], [ [['A','B'], 'C'], [['C','D'], 'E'], [['E','F'], 'G'], [['F','G'], 'E'], [['D','E'], 'C'], [['B','C'], 'A'] ]) 回报 [["B","D","F","G"],["B","D","E","F"],["B","C","D","F"],["A","B","D","F"]]

答案 6 :(得分:-1)

step1: since AB->C and CD->E.  then we get ABD->ABCDE(1)
step2: Given (1) and EF->G, then we get ABDF->ABCDEF, then ABDF->ABCDEFG(2), 

所以ABDF是超级钥匙。然后我们将使用depnedencies的结果来确定它们是否是键。 (这里为什么我使用BC-> A,因为A是我的超级键的一部分,它依赖于BC)。

step3: Given (2) and BC->A, we get BCDF->ABDF, so BCDF->ABCDEFG(3)   
step4: Given (3) and DE->C, we get BDEF->BCDE, so BDEF->ABCDEFG(4)   
step5: Given (4) and FG->E, we get BDFG->BDEF, so BDFG->ABCDEFG,    
So the Answer BDFG is right.