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

时间:2018-02-12 19:37:29

标签: database-design entity-relationship database-normalization third-normal-form

正如Thomas Connolly和Carolyn Begg在180页写的“数据库解决方案第二版”一书中所说:

  

第三范式(3NF)
  已经在1NF和2NF中的表格   可以从中计算出所有非主键列中的值   只有主键列而没有其他列。

我见过许多人们使用标识列的情况,尽管他们的表中已经有了主键列。记录也可以从标识列中得出,如果我们在表中使用自动递增的标识列和主键,那么它是否违反了3NF?

UPDATE:如果不是,那么哪一列应作为另一个表中的外键引用。主键列或标识列?

3 个答案:

答案 0 :(得分:6)

没有。这位官员' 3NF定义的措辞通常使用术语" prime属性"或"非素数属性"。如果你的书暗示这意味着主键的属性"然后将你的书扔进垃圾箱。这是错误的。 "素数属性"表示"属性是键的 ANY 的一部分"和"非素数属性"表示"属性不属于 ANY 键的一部分"。因此,在你的那种"自动增量属性的关系模式中引入" (以及将其作为密钥的所有适用的FD)不可能引入3NF违规,因为它不会引入非主要属性。

答案 1 :(得分:5)

你引用的段落是错误的 - 或者至少它是如此非正式,以至于作为解释是无用的。

  

如果关系R处于第二范式,则它处于第三范式   并且R的每个非素数属性都是非传递性依赖的   R的每个候选键。

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

候选钥匙是重要的。具有多个密钥的表没有任何问题。

答案 2 :(得分:4)

那本书数据库解决方案:建立数据库的第2版2004年版的分步指南是一团糟。不幸的是,它说的是错误的东西,它会误导,并且很多措辞都非常糟糕 - 比如"锻炼" - 这是非正式的&从未定义过。

  
    

第三范式(3NF)
    一个已经在1NF和2NF中的表,其中所有非主键列中的值只能从主键列而不是其他列中计算出来。

  

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

  

第三范式的正式定义(3NF)是第一个表格   和第二范式并且其中没有非主键列是可传递的   取决于主键。

后来它仍然说可以有多个CK,但它仍然给出了错误的定义:

  

因此,对于具有多个候选键的表,您可以使用广义   3NF的定义,它是一个1NF和2NF的表,并且在   可以从中计算出所有非主键列中的值   只有候选键列而没有其他列。

错误地说"主键列"其中主列 CK列是正确的。

他们的另一本书“数据库系统第4版2005”也引入了特殊的定义案例,当时只有一个CK而没有这么说,所以后来给出了#34; general"定义。至少那些获得" prime属性"正确的。

  

第三范式(3NF)的一般定义是第一和第二范式中的关系   没有非候选键属性过渡依赖于任何候选键。

任何正常形式的具有多个CK的表都没有什么异常。