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) 组合键必须共享一个属性。AB
与AC
andBD
但不重叠CD
or EF
。
总结:两组或更多组属性,其中 1) 每组是关系的候选键(最小超键),2)每组是一个复合键(由多个属性组成),以及 3) 一个或多个组合键的属性与集合中另一个键的属性重叠。因此,您可以排除MNOP
并NOPL
基于它们不是最小超级键。您可以排除P
并L
基于它们不是复合键(它们由一个属性组成)。剩下两个键,NO
和NM
,它们共享属性N
,所以你完成了。
有一个你可以真正理解的例子也可能会有所帮助。我唯一一次看到你有重叠候选键的地方是当你有 1) 两个在功能上相互决定的属性(例如A
,B
在那里A
有一个B
和B
有一个的一对一关系A
)和 2)这些属性是复合候选键的一部分。
例如,在某些系统中,aCustomer
有一个CreditCard
,而 aCreditCard
属于一个Customer
。在 Rentals 表中,您可以Rental
通过EquipmentId
、Date
和 来唯一标识 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)
因为CustomerId
和CreditCard
可以互换使用以唯一标识您的客户。
在上面的场景中,您有重叠的候选键:
{CreditCard, EquipmentId, Date}
{CustomerId, EquipmentId, Date}
Run Code Online (Sandbox Code Playgroud)
它们重叠是因为它们是复合键(它们由多个属性组成)并且因为它们的至少一个属性是共享的(在这种情况下,它们共享EquipmentId
和Date
.
你说你现在不关心BCNF
,但要完全把这个带回家,上面的场景是你偶尔会看到一张表在3NF
但不在的原因BCNF
。上表在 中3NF
,但不在 中BCNF
。
3NF
允许 FD,其中 1) FD 是微不足道的 2) FD 的左侧是候选键或 3) FD 的右侧是键属性(用于制作任何键的属性)。由于CreditCard
和CustomerId
都是关键属性,因此所有 FD 要么满足 2 要么满足 3。
BCNF
非常相似,但它只允许 . 允许的条件 1 和 2 3NF
。由于第三个条件不会被允许的BCNF
,都CID -> CC
和CC -> CID
使用条件3,此表是不是BCNF
,但它是3NF
。
出于实际目的,这种情况相当罕见,而且这些信息是迂腐的。您的桌子有问题的赠品将是CreditCard/CustomerId
在您的桌子上重复对的事实。您还可以确认表甚至不会在2NF
没有这种罕见的疾病,其中一个FD的右侧可能是一个关键的属性,因为CreditCard
是主键的部分依赖(这取决于CustomerId
但不是EquipmentId
或Date
。