Database 从函数依赖关系确定键

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 有人能告诉我应该如何分解函数依赖关系,从而得出某些属性组

我正在学习一门数据库理论课程,在阅读了这本书之后,我还不清楚在给定一组函数依赖项的情况下,我如何推断键

我有一个例子问题:

查找具有函数依赖关系的关系R(ABCDEFG)的所有键

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,然后您可以尝试其余步骤):

  • 列出不在建议密钥中的所有属性(因此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关系的关键。我知道这有一个算法,它可能在你的课程文本中的某个地方。可能还有一个例子。您应该手动一步一步地完成它,直到模式直观为止

    编辑:我之所以要回顾全文来寻找这个算法,是因为你的考试很可能是要写的,而不是选择题,因为这是一门db理论课程。如果这是真的,那么如果你能有条理地遵循课程文本/笔记中演示的符号,你将获得更多的部分学分


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

    做一个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的情况并非如此。但这些细节可能因课程而异