在进行规范化问题时,我似乎遇到了一个奇怪的问题。当我与实际名字发表关系时,我可以很容易地解决这些问题,但是当我收到信件时,这似乎要困难得多。
对于以下问题,我不知道为什么它不是3NF,为什么它是2NF。
给定R(A,B,C,D,E,F)
FDs = {AB-> C,DBE-> A,BC-> D,BE-> F,F-> D}
因此,对于2NF,所有右侧属性必须在功能上完全依赖于左侧属性。对于3NF,要么所有左侧属性都必须是超级键,要么右侧属性必须是主要属性。
我试着把它画出去,但我甚至找不到候选钥匙。任何人都可以帮我确定为什么这不是3NF?另外,这里的候选键是什么?因为我没有看到任何具有与原始关系相等的闭包的属性。
答案 0 :(得分:0)
在进行规范化问题时,我似乎遇到了一个奇怪的问题。 当我与实际名字发表关系时,我可以想出这些 很容易,但当我收到信件时,似乎要困难得多。
是的,字母不太直观。我会告诉你一个简洁的方法,你可以在这种情况下确定候选键:
留下三列( L ),中间( M )和右列( R ),其中左列包含所有属性在所有给定的功能依赖项中仅出现在左侧。在我们的例子中,这些属性将是B
和E
,因为它们总是在任何给定的FD的左侧(或者你可以说它们在任何给定的FD中都不在右侧)。 。类似地,中间列包含出现在给定FD的左侧和右侧的属性。因此,我们在中间列中有A
,C
,D
和F
。右列包含仅出现在FD右侧的属性(从不在任何给定FD的LHS上)。所以我们有:
L | M |R
B,E|A,C,D,F|-
现在你有了这个表,记住以下规则:(这些非常直观)
因此,在我们的案例中,我们首先检查BE
是否是候选键。我们发现BE-closure由关系R
的所有属性组成,因此它是候选键。 (注意:如果BE
不是候选键,那么我们将从中间(M)列逐个获取属性并将其与BE
组合并检查其闭包,例如。{{ 1}},BEA
,BEC
...)
所以现在我们只有一个候选键BED
。所以我们的 prime 属性是 {B,E} ,而非素数属性是 {A,C,D,F} < /强>
如果RHS是非素数属性且LHS不是候选键,我们知道3NF 违反了 。鉴于FD是:
我们注意到,所有这些FD的RHS都是非主要属性。因此,在所有这些中,LHS应该是它在3NF中的关键。我们看到(1),(3)和(5)违反了这一点,因此不在3NF 。 (注意:在(2)中我们可以看到LHS上的BE
是一个无关的属性,因此其D
因此(2)不违反3NF规则)