【发布时间】:2017-08-29 09:31:10
【问题描述】:
鉴于这种逻辑设计:
R(a,b, c, d)
a is the only key. I can't underline it using this editor.
a->b
a->c
a->d
它在 BCNF 中,因为没有复合键,没有传递依赖,也没有部分键依赖。
但是,我们仍然在属性 b、c 和 d 中的行间存在重复数据。
我们是否引入代理键并这样重写:
R(a, bID, cID, dID)
R1(bID, b)
R2(cID, c)
R3(dID, d)
如果是这样,那是在标准化之前还是之后发生的?
【问题讨论】:
-
代理键可能很紧凑,但它们并不能减少值的重复,并且它们增加了间接级别。为什么您将相同价值的多次出现视为一个问题?
-
由于您解释的原因,我认为它们是一个问题。我明白这些特定的重复在规范化过程中不是问题。
-
在规范化之前或之后引入代理键没有区别。
-
1.什么是“跨行重复数据”? 2. 规范化不添加 id,它通过投影替换表格。 3.您的“因为”不清楚和困惑,请参阅一些 BCNF 和较低的 NF 定义。 4. 假设没有非 FD JD,这是在 5NF 中,尽可能归一化(在正常意义上)。你是什么意思,“规范化之前或之后”? 6. 添加 id 会使 id 值具有与它们标识的值完全相同的外观模式,因此添加它们不会影响您拥有的“跨行重复数据”(无论您的意思是什么)。 PSstackoverflow.com/a/26952821/3404097
-
您的问题是关于“在属性中的行之间重复数据”,但您还没有解释这是什么,那么我们如何回答您的问题?您似乎认为这很明显,但相反,您似乎持有许多误解,不仅关于“重复数据”,而且关于规范化和代理/标识符。因此,如果您不想遭受误解,请编辑您的问题,以明确您的假设/期望以及困扰您的原因以及您认为这是一个问题的原因。
标签: sql normalization database-normalization