尝试确定特定的数据库规范化问题

时间:2009-06-05 19:05:27

标签: database-design normalization

一位同事勾画出一张新桌子的价值:

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

这些是表格中的唯一列。列名称为Col1,Col2。

一个人说这个表没有正常化,另一个人说是。

它违反规范化的具体论点是在Col1“Foo”中删除带有“Foo”的三个记录将不再存在于系统中。那个人说应该有一个包含ID和Name列的查找表。上表将该表的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。它是否正确?

5 个答案:

答案 0 :(得分:3)

如果这两列确实存在,那么我会说这个数据库表是第三种正常形式。这是我的理由:

  1. 1NF中的清晰,因为没有任何属性是“多值的”
  2. 由于col1和col2都不是有效的候选键(重复值!),因此该表上唯一可能且有效的主键是(col1,col2)
  3. 2NF规定,非主要属性不应在功能上依赖于候选键的一部分。由于只有col1和col2都是唯一可能的候选键的一部分,所以这一点没有实际意义 - 2NF中的表 IS
  4. 3NF根据E.F.Codd基本上说任何非关键属性必须依赖于“关键,整个关键,而不是关键”。由于我们 ONLY 有两列构成密钥,因此没有其他非密钥属性,因此没有任何非密钥属性违反此规则 - >表 IS 是3NF
  5. 我不知道你的工作伙伴是否想要真正进入4NF,5NF或Boyce-Codd NF - 我非常怀疑......

    马克

答案 1 :(得分:2)

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

答案 2 :(得分:1)

答案 3 :(得分:1)

有一些different levels of normalization

如果“Foo”,“some value 1”“Foo”,“some value 2”“Foo”,“some value 3”“Bar”,“some value 3” 表示表格如下:

Col1| Col2
------------------
Foo | some value 1
Foo | some value 2
Foo | some value 3
Bar | some value 3

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

关于您添加的新问题:
如果有跨越Col1&的PK Col2,然后它仍然在2NF和3NF。您必须添加一个不属于该键的列的列,否则它必须仅来自Col1或仅来自Col2。

答案 4 :(得分:0)

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

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

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

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

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