Database 从函数依赖关系确定键
我正在学习一门数据库理论课程,在阅读了这本书之后,我还不清楚在给定一组函数依赖项的情况下,我如何推断键 我有一个例子问题: 查找具有函数依赖关系的关系R(ABCDEFG)的所有键Database 从函数依赖关系确定键,database,functional-dependencies,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 有人能告诉我应该如何分解函数依赖关系,从而得出某些属性组
AB → C
CD → E
EF → G
FG → E
DE → C
BC → A
通过确定以下哪项是关键来展示您的知识
a. BCDEF
b. ADFG
c. BDFG
d. BCDE
有人能告诉我应该如何分解函数依赖关系,从而得出某些属性组合是关键的结论吗?我想我会面临许多这样的问题,我需要了解如何解决这些问题。我不是这方面的专家,所以如果我错了,请纠正我,但我的方法是消除不可能的答案 在这种情况下: 没有一个FD“给”你B、D或F。。。因为它们是关系的一部分,所以不可能有不包含B、D和F的超键。。。删除答案b(缺少b)。。。删除答案d(缺少F) 现在,让我们检查剩下的答案是否包含足够的信息来获取关系的所有部分 答案a(BCDEF)将“给”您B、C、D、E和F,因此您需要使用FDs查找a和G。。。BC可以到达A,EF可以到达G,所以答案A是一个键 答案c(BDFG)将“给”你B、D、F和G,因此你需要使用FDs找到A、c和E。。。可以通过FG联系到E。。。可通过DE到达C(通过FG到达E后)。。。最后,BC可以到达A(在到达C之后)
所以答案c是某种键,因为整个关系可以通过这种方式访问。。。但我不知道这是否足以符合正式定义。。。如果我不得不猜测的话,我会说不,因为您正在学习数据库理论课程,我将假设您有SQL经验,并尝试将理论与实现上下文联系起来 基本上,关系是实现中的表,键是可以用来标识唯一行的任何属性集(读取列)(在db理论中,这是一个元组)。这里最简单的类比是,键是主键,以及可以用来标识关系(表中的行)中单个元组的任何其他可能的列集。因此,以下是执行此操作的基本步骤(我将介绍示例A,然后您可以尝试其余步骤):
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.
主要目标是将密钥转换为关系,这应该证明提议的密钥实际上是一个密钥 做一个FD,例如AB→C 增加,直到提到所有属性,例如ABDEFG→ CDEFG(注意,这相当于ABDEFG→ ABCDEFG因为A->A和B->B是非常正确的 这说明ABDEFG是一个超级键 检查其他FD,其中LHS是超级键的子集,并且其RHS上包含超级键的某些其他属性 有两个。环境足迹→G和FG→E.从超级键中删除这些RHS的属性。这样做会得到两个键,它们当然是超级键,但不一定是不可约键:ABDEF和ABDFG 然而,从AB→C和CD→我们也可以推导出ABD→因此,我们也可以从ABDEF键中删除E。这里令人讨厌的是,当我说“检查其他FD”时,这显然意味着你也应该检查FD集合闭包中出现的任何FD(即,从给定FD集合派生的任何FD)。。。用手来做有点不切实际 用于验证结果是否正确的有用网站:
您现在应该能够确定选项c是一个键。这应该相当简单。您需要做的就是对给定的每个键进行闭包,看看它是否包含R的所有属性。例如,BCDEF的闭包=ABCDEFG,因为BC->A和BC是BCDEF的子集,因此如果EF是FD EF->G的子集。因为这个闭包包含R的所有属性,BCDEF就是键。使用闭包的主要目的是查看我们是否可以“访问”给定属性集中的每个属性。闭包是一组属性,我们可以通过浏览FDs实际访问这些属性
a. BCDEF
b. ADFG
c. BDFG
d. BCDE
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是一个超级键。然后,我们将使用dependency的结果来确定它们是否是键。(这里我为什么使用BC->A,因为A是我的超键的一部分,它依赖于BC)
代码
如果代码不仅仅是冗长的解释,下面是一个25行的算法实现,该算法基于函数依赖关系查找键:
例子
候选密钥([“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”]
答案a是一个适当的超键,这意味着它的某个适当子集也是一个键。通常,“键”一词的意思是“不可约”,而a的情况并非如此。但这些细节可能因课程而异