0

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

"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。它是否正确?

4

5 回答 5

3

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

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

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

马克

于 2009-06-05T20:31:49.613 回答
2

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

于 2009-06-05T19:11:56.840 回答
1

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

于 2009-06-05T19:10:54.160 回答
1

有几个不同级别的标准化

如果 "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”。

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

于 2009-06-05T19:18:26.640 回答
0

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

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

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

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

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

于 2009-06-05T19:25:48.543 回答