重叠候选键究竟是什么?

vik*_*cks 8 normalization database-design dependencies

有人可以简单地向我解释一下什么是overlapping candidate key?什么是overlapping顾名思义?

考虑以下关系

R(L,M,N,O,P) 
{
    M -> O
    NO -> P
    P -> L
    L -> MN
}
Run Code Online (Sandbox Code Playgroud)

上述哪个函数依赖在上述关系中引入了重叠的候选键?

让我们将讨论限制在依赖项上,我目前对 BCNF 不感兴趣

小智 9

使用可能的候选键 vikkyhacks,您就对了。重叠候选键是具有至少一个共同属性的复合(由一个以上属性组成)候选键。所以你重叠的候选键是 NM 和 NO(它们共享 N)。

上面的附加解释,最初留在评论中:

所有重叠的候选键都是一组(例如两个或更多)候选键。这意味着第一个标准是您的关系R必须具有多个候选键(最小超级键)。对于要重叠的任何候选键,它们中的每一个(再次是两个或更多)必须满足一些附加条件。1) 它们都必须是复合候选键。它们必须由多个属性组成,因此像这样的键A永远不会重叠,但AB可能会与另一个键重叠。2) 组合键必须共享一个属性。ABACandBD但不重叠CDor EF

总结:两组或更多组属性,其中 1) 每组是关系的候选键(最小超键),2)每组是一个复合键(由多个属性组成),以及 3) 一个或多个组合键的属性与集合中另一个键的属性重叠。因此,您可以排除MNOPNOPL基于它们不是最小超级键。您可以排除PL基于它们不是复合键(它们由一个属性组成)。剩下两个键,NONM,它们共享属性N,所以你完成了。

例子

有一个你可以真正理解的例子也可能会有所帮助。我唯一一次看到你有重叠候选键的地方是当你有 1) 两个在功能上相互决定的属性(例如AB在那里A有一个BB有一个的一对一关系A)和 2)这些属性是复合候选键的一部分。

例如,在某些系统中,aCustomer有一个CreditCard,而 aCreditCard属于一个Customer。在 Rentals 表中,您可以Rental通过EquipmentIdDate和 来唯一标识 a CustomerId。为方便起见,您还存储CreditCard在此表中。

这意味着以下 FD 成立:

{CustomerId, EquipmentId, Date} -> {CreditCard}
{CustomerId} -> {CreditCard}
Run Code Online (Sandbox Code Playgroud)

但由于关联是一对一的,因此以下 FD 也成立:

{CreditCard} -> {CustomerId}
{CreditCard, EquipmentId, Date} -> {CustomerId}
Run Code Online (Sandbox Code Playgroud)

因为CustomerIdCreditCard可以互换使用以唯一标识您的客户。

在上面的场景中,您有重叠的候选键:

{CreditCard, EquipmentId, Date}
{CustomerId, EquipmentId, Date}
Run Code Online (Sandbox Code Playgroud)

它们重叠是因为它们是复合键(它们由多个属性组成)并且因为它们的至少一个属性是共享的(在这种情况下,它们共享EquipmentIdDate.

你说你现在不关心BCNF,但要完全把这个带回家,上面的场景是你偶尔会看到一张表在3NF但不在的原因BCNF。上表在 中3NF,但不在 中BCNF

3NF允许 FD,其中 1) FD 是微不足道的 2) FD 的左侧是候选键或 3) FD 的右侧是键属性(用于制作任何键的属性)。由于CreditCardCustomerId都是关键属性,因此所有 FD 要么满足 2 要么满足 3。

BCNF非常相似,但它只允许 . 允许的条件 1 和 2 3NF。由于第三个条件不会被允许的BCNF,都CID -> CCCC -> CID使用条件3,此表是不是BCNF,但它是3NF

出于实际目的,这种情况相当罕见,而且这些信息是迂腐的。您的桌子有问题的赠品将是CreditCard/CustomerId在您的桌子上重复对的事实。您还可以确认表甚至不会在2NF没有这种罕见的疾病,其中一个FD的右侧可能是一个关键的属性,因为CreditCard是主键的部分依赖(这取决于CustomerId但不是EquipmentIdDate