【问题标题】:Trying to determine a specific database normalization issue试图确定特定的数据库规范化问题
【发布时间】:2010-10-31 17:59:44
【问题描述】:

一位同事将新表的值勾画为:

"Foo", "some value 1"
"Foo", "some value 2"
"Foo", "some value 3"
"Bar", "some value 3"

这些是表中唯一的列。列名是 Col1、Col2。

一个人说这个表没有标准化,另一个人说它是。

它违反规范化的具体论点是删除 Col1 "Foo" 中带有 "Foo" 的三个记录将不再存在于系统中。那个人说应该有一个包含 ID 和名称列的查找表。上表将引用该表的 Id 作为其 FK。

它没有被规范化的论点是表中没有第三列依赖于第一列(第三种规范化形式)。

我认为混淆来自它是 1NF,因为它满足这个例子:

Customer    Tr. ID  Date            Amount
Jones   12890   14-Oct-2003     -87
Jones   12904   15-Oct-2003     -50
Wilkins     12898   14-Oct-2003     -21
Stevens     12907   15-Oct-2003     -18
Stevens     14920   20-Nov-2003     -70
Stevens     15003   27-Nov-2003     -60

来自http://en.wikipedia.org/wiki/Database_normalization

但听起来好像违反了这条规则,“相同的信息可以在多行上表示;因此对表的更新可能会导致逻辑不一致。”这适用于超过 1NF 的归一化。

所以看起来原始表会违反 2NF,从而违反 3NF,但会满足 1NF。它是否正确?

【问题讨论】:

  • 呃,谢谢 Rich B,但我还是一头雾水。
  • 好的,所以我没有问“什么是标准化”。我问这个特定实例是否违反了规范化规则。为什么不实际回答问题,而不是更改标题然后做出回应。您没有回答实际问题。
  • 我的困惑在于您如何“措辞”您的样本数据。字段名称是什么?记录长什么样?是“foo”数据吗?那么不,它没有标准化,因为你在重复数据。
  • @blu 我们需要更多关于所表示的实际数据及其与周围数据的关系的信息才能回答。
  • @Adrien:重复数据不会使表格在任何正常使用中都未标准化。例如,两个人可以有相同的名字,几乎没有人会因此而拆分名字表。或者,即使他们确实拆分了名字表,该列也可能是外键。

标签: database-design normalization


【解决方案1】:
【解决方案2】:

有不同的标准化水平。但是如果没有实际的字段名称,您将无法真正知道是否需要规范化。

【讨论】:

    【解决方案3】:

    有几个different levels of normalization

    如果 "Foo", "some value 1" "Foo", "some value 2" "Foo", "some value 3" "Bar", "some value 3" 表示表格如下所示:

    Col1| Col2 ------------------ 福 |一些值 1 福 |一些价值 2 福 |一些价值 3 酒吧 |一些价值 3

    Col1/Col2 上有一个主键,是的,它是“标准化”。
    如果根本没有键,那么不,它没有被规范化,因为你可以插入另一个“Bar”实例,“some value 3”。

    关于你添加的新问题:
    如果有一个PK跨越Col1和Col2,那么它仍然是2NF和3NF。您必须添加一个不属于要违反的键的一部分的列,然后它必须只能从 Col1 或只能从 Col2 派生。

    【讨论】:

    • 不,这些是唯一的列。该人想使用 Col1 连接到另一个表。
    • @blu 如果存在跨 Col1 和 Col2 的主键或唯一性,则将其标准化。如果没有,则违反第一范式。
    • 感谢您的建设性回答
    • np,标准化不是我希望有人在 5 秒内掌握的东西。我更新了答案以涵盖您添加的问题的补充内容。
    【解决方案4】:

    我相信表中的值列表代表四行:

    col1 col2
    Foo  some value 1
    Foo  some value 2
    Foo  some value 3 
    Bar  some value 3
    

    根据我的理解,此表将被视为标准化。我希望这里的主键是 {col1, col2} 的复合键。

    当 col1 和 col2 都是其他表的外键时,我通常希望在表中看到这种类型的多对多映射,这些表包含被映射实体的附加属性。

    我还建议考虑数字键而不是这些 nvarchar 值。我怀疑这些文本值可能不是它们所代表的实体的良好候选键,但我没有足够的信息来完全做出判断。

    【讨论】:

    • 我知道概述的表格很糟糕,我永远不会做这样的事情。当被问到“为什么”时,我说它违反了规范化,我被告知不,它是规范化的。
    • 主键是 {col1, col2},我认为这是规范化的。但是,您是否有足够的信息来证明为什么会推荐更改?
    【解决方案5】:

    如果这两列真的全部存在,那么我会说这个数据库表是第三范式。这是我的推理:

    1. 在 1NF 中是 CLEARLY,因为没有一个属性是“多值的”
    2. 由于 col1 和 col2 都不是有效的候选键(重复值!),因此该表上唯一可能且有效的主键是 (col1,col2)
    3. 2NF 规定非主属性不应在功能上依赖于候选键的一部分。由于只有 col1 和 col2 都是唯一可能的候选键的一部分,因此这一点没有实际意义 - 2NF 中的表 IS
    4. 根据 E.F.Codd 的 3NF 基本上说,任何非键属性都必须依赖于“键、整个键,而且只有键”。由于我们ONLY有两列构成键,没有其他非键属性,所以没有一个非键属性违反这条规则 --> 表 IS强>是3NF

    我不知道你的工作伙伴是否真的想进入 4NF、5NF 或 Boyce-Codd NF - 我非常怀疑......

    马克

    【讨论】:

    • 没错,谢谢。 “每个元素都必须依赖于键、整个键,而且只能依赖于键,所以帮帮我 Codd!”
    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2010-09-08
    • 2012-01-04
    • 2011-02-03
    相关资源
    最近更新 更多