根据功能依赖性确定键

| 我正在上一门数据库理论课程,在阅读了给定一组功能依赖项后如何推断键之后,我还是不清楚。 我有一个示例问题: 查找关系R(ABCDEFG)具有功能依赖性的所有键
AB → C
CD → E
EF → G
FG → E
DE → C
BC → A
通过确定以下哪项是关键来证明您的知识。
a. BCDEF             
b. ADFG           
c. BDFG           
d. BCDE 
有人可以指导我如何分解功能依赖关系,以得出某些属性组合是关键的结论吗?我希望我会遇到许多这类问题,并且我需要了解如何解决。     
已邀请:
进行FD,例如AB→C 增强直到提及所有属性,例如ABDEFG→CDEFG(请注意,这等效于ABDEFG→ABCDEFG,因为A-> A和B-> B确实是正确的)。 这告诉您ABDEFG是超键。 检查LHS是您的超键子集的其他FD,并且在其RHS上包含您的超键的其他某些属性的其他FD。 那里有两个。 EF→G和FG→E。从您的超级键中删除这些RHS的属性。这样做有两个键,它们肯定是超级键,但不一定是不可还原的键:ABDEF和ABDFG。 但是,从AB→C和CD→E,我们也可以得出ABD→E。因此,我们也可以从ABDEF密钥中删除E。令人讨厌的是,当我说“检查其他FD”时,这显然意味着您还应该检查在FD集的结尾处出现的所有FD(即,从给定的FD派生的任何FD)。 FDs)...用手做这有点不切实际... 一个有用的站点,用于验证您的结果是否正确: http://raymondcho.net/RelationalDatabaseTools/RelationalDatabaseTools 现在,您应该能够确定选项c是键。     
好吧,这应该很简单。您需要做的就是关闭给定的每个键,并查看其是否包含R的所有属性。例如,由于BC-> A和BC是BCDEF的子集,因此BCDEF = ABCDEFG的关闭,因此如果FD的EF EF->G。由于此闭包包含R的所有属性,因此BCDEF是键。进行闭包的主要目的是查看是否可以从给定的一组属性中“到达”每个属性。闭包是我们可以通过导航FD实际获得的属性集。     
由于您正在学习数据库理论课程,因此我假设您具有SQL经验,并尝试将该理论与实现上下文相关联。 基本上,关系是在实现中称为表的关系,键是可用于标识UNIQUE行的任何属性集(读取列)(在数据库理论中,这将是一个元组)。这里最简单的类比是,键是您的主键,以及您可以用来标识关系中的单个元组(表中的行)的任何其他可能的列集。因此,这是执行此操作的基本步骤(我将逐步介绍示例A,然后您可以尝试其余的操作): 列出您建议的密钥中未包含的所有属性(因此BCDEF不包含A和G)。 对于您缺少的每个属性,请遍历功能依赖项列表,然后查看建议的键是否能够推断您缺少的属性。
             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.
因为您能够从BCDEF推断A和G,所以选项a是关系ABCDEFG的关键。我知道有一个算法可以解决这个问题,它可能在您的课程文本中。也可能有一个例子。您应该手动逐步操作它,直到模式直观为止。 编辑:之所以我要遍历全文来寻找该算法,是因为您的考试将是书面的,而不是多项选择,因为它是数据库理论课程。如果是这样,那么您可以系统地遵循课程文本/注释中显示的符号,那么您将获得更多的部分学分。 主要目标是将密钥转换为关系,这应证明所提议的密钥实际上是密钥。     
好吧,我不是这方面的专家,所以如果我错了,请纠正我,但是我的方法是消除不可能的答案 在这种情况下: 您的FD都不“给”您B,D或F ...因为它们是关系的一部分,所以不能有不包含B,D和F的超级键...删除答案b(B缺失)...删除答案d(F缺失) 现在让我们检查剩余的答案是否包含足够的信息以获取关系的所有部分 回答(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 ... DE可以到达C (在通过FG到达E之后)...最后,在BC之前(在到达C之后)可以到达A ... 所以答案c是某种关键,因为可以通过这种方式访问​​整个关系...但是我不知道这是否足以满足正式定义...如果我不得不猜测,我\会说不     
码 如果代码与您不仅仅讨论了冗长的解释,那么以下是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\"]]
    
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是一个超级密钥。然后,我们将使用依赖关系的结果来确定它们是否为键。 (在这里我为什么使用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.
    

要回复问题请先登录注册