Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何找到候选密钥?_Database_Relational Database_Functional Dependencies_Candidate Key - Fatal编程技术网

Database 如何找到候选密钥?

Database 如何找到候选密钥?,database,relational-database,functional-dependencies,candidate-key,Database,Relational Database,Functional Dependencies,Candidate Key,例如: 设R=(A,B,C,D) 设F={C->AD,AB->C} 那我怎么才能找到候选钥匙呢 答案是{AB,BC} 为什么?给定一个关系模式R,其中包含一组属性T,以及一组非空的非平凡函数依赖项F,描述假定在该模式中保持的一组特定约束: 未出现在F中FD右侧部分的每个属性必须出现在任何候选关键字中 在F中未出现在FD左侧部分的每个属性不能出现在任何候选关键字中 要查找所有候选键,对于所有其他属性,应尝试将它们的每个可能组合添加到1的属性中,并查看闭包是否确定了关系的所有属性(并且,如果不丢失此

例如:

设R=(A,B,C,D) 设F={C->AD,AB->C}

那我怎么才能找到候选钥匙呢

答案是{AB,BC}


为什么?

给定一个关系模式
R
,其中包含一组属性
T
,以及一组非空的非平凡函数依赖项
F
,描述假定在该模式中保持的一组特定约束:

  • 未出现在
    F
    中FD右侧部分的每个属性必须出现在任何
    候选关键字中

  • F
    中未出现在FD左侧部分的每个属性不能出现在任何
    候选关键字中

  • 要查找所有候选键,对于所有其他属性,应尝试将它们的每个可能组合添加到1的属性中,并查看闭包是否确定了关系的所有属性(并且,如果不丢失此属性,则无法从组合中删除任何属性)

    注意,如果set
    F
    为空,则唯一的候选键由所有属性T构成

    在实践中,有些算法可能相对有效(因为查找所有密钥的问题通常是指数型的)

    一种简单的方法是从函数依赖项的规范封面开始,在本例中,例如:

    { A B → C
      C → A
      C → D }
    
    在找到任何候选键中必须存在的属性(在本例中为
    B
    )后,尝试向它们添加依赖项的左侧(在本例中为
    AB
    ,即
    A
    ,和
    C
    )(以任何顺序,并可能组合它们)然后计算闭包,看看它们是否决定了所有属性。当您发现某些属性集决定了所有关系属性时,您已经找到了一个候选键(无需向其添加其他属性)。在您的示例中:

     (A B)+ = A B C D
     (B C)+ = A B C D
    

    因此,
    ab
    bc
    都是候选键(因为您无法删除这两个键的任何属性,而不会丢失确定所有其他属性的属性)。由于没有其他属性(来自
    D
    的部分不能出现在候选密钥中),您知道您已经找到了所有候选密钥。

    您使用的是什么参考?你在哪里应用它?请用谷歌搜索“stackexchange家庭作业”。你只是要求教科书中有一章或几节有一个专门的例子。这太宽泛了。每个属性都决定它自己,所以你的1和2都是空的,除非你假设了一些关于FD的东西,比如它们是不平凡的。但是唯一的CK本身可能是琐碎的(所有属性),因此2是错误的&您不能在查找CK时忽略琐碎FDs的属性。“实践中”之前的部分不清楚如何查找CK。我建议进行修复,但我不清楚如何修改此演示文稿以保持其风格/方法/本质(无论是什么),但要使其准确。@philipxy,我试图更正答案。如果您认为它仍然太多bug和/或混乱,我将删除它。项目符号用于您的算法。它们实际上属于它的子步骤。也就是说,算法的最小覆盖范围实际上就是你的子弹所处的环境。但您缺少将非覆盖属性添加到FD零件生成的属性的最后一步。所以我基本上建议你展示在某处发布的实际算法。。。就像提问者的教科书一样,他们忽视了这一点。也许没有你现在的回答那么简洁,但也许比你现在的回答更简洁。或者只是找到一个如此重复的。“我怎样才能找到候选密钥?”让我休息一下。在第二部分中,你似乎是在介绍并激励算法,首先给出它使用的子弹,一个从1开始并受2限制的蛮力算法。我不认为你可以让项目符号在一个假设F是规范的,并在以后添加未提及的属性的算法之外工作。对于不在F中的属性,2仍然为false。仍然需要F+。缺少明确的定义——确定所有属性的最小集合——1和2只会使暴力搜索变得复杂。总之,子弹后面的两段不清楚。嗯。。。有一个像样的答案吗?我注意到我的评论非常简洁,但事实是,你对算法的介绍并不清楚,尽管我相信你能说清楚。