如果我们使用自动递增的身份列和 PK,则违反 3NF

Violation of 3NF if we use an auto-incremented identity column along with a PK

正如 Thomas Connolly 和 Carolyn Begg 合着的数据库解决方案第二版第 180 页所说:

Third normal form (3NF)
A table that is already in 1NF and 2NF, and in which the values in all non-primary-key columns can be worked out from only the primary key column(s) and no other columns.

我见过很多场景,人们在 table 中已经有了主键列,但仍然使用标识列。一条记录也可以从标识列中得到,那么如果我们在table?

中使用自增标识列和主键,这不是违反了 3NF 吗?

更新:如果不是这样,哪个列应该被引用为另一个table.The主键列或标识列中的外键?

您引用的段落是错误的 - 或者至少它是非正式的以致于作为解释毫无用处。

A relation R is in third normal form if it is in second normal form and every non-prime attribute of R is non-transitively dependent on each candidate key of R.

Codd E. F.,“数据库关系模型的进一步规范化”

候选键才是最重要的。 table 有一个以上的键没有错。

没有。 3NF定义的'official'措辞通常使用术语"prime attribute"或"non-prime attribute"。如果你的书建议这意味着 "attribute of the primary key" 那么把你的书扔进垃圾箱。这是错误的。 "prime attribute" 表示 "attribute that is part of ANY of the keys","non-prime attribute" 表示 "attribute that is not part of ANY of the keys"。因此,在关系模式中引入您的 "autoincrement attribute" (以及所有将使其成为关键的适用 FD)不可能引入 3NF 违规,因为它不会引入非素数属性。

那本书数据库解决方案:构建数据库的分步指南第 2 版 2004 年版一团糟。不幸的是,它说错话,误导人,而且他们的很多措辞都非常糟糕——比如 "work out"——这是非正式的,从未定义过。

Third normal form (3NF)
A table that is already in 1NF and 2NF, and in which the values in all non-primary-key columns can be worked out from only the primary key column(s) and no other columns.

这个错误的定义实际上是非正式的,当 table 只有一个 CK(候选密钥)时。但是这本书没有 除了 间接 后来 当它给出 另一个 涉及 PK(主键)的错误定义:

The formal definition for third normal form (3NF) is a table that is in first and second normal forms and in which no non-primary-key column is transitively dependent on the primary key.

后来还是说可以有多个CK,但还是定义错误:

Therefore, for tables with more than one candidate key you can use the generalized definition for 3NF, which is a table that is in 1NF and 2NF, and in which the values in all the non-primary-key columns can be worked out from only candidate key column(s) and no other columns.

错误地说 "primary-key columns" 其中 主要列 CK 列 是正确的。

他们的另一本书数据库系统第 4 版 2005 也介绍了定义的特殊情况,当只有一个 CK 时没有说明然后稍后给出 "general" 定义。至少那些 "prime attribute" 是正确的。

General definition for Third Normal Form (3NF) is a relation that is in First and Second Normal Form in which no non-candidate-key attribute is transitively dependent on any candidate key.

一个 table 在任何范式中有多个 CK 并没有什么不寻常的。