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

问题描述 投票:2回答:3

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

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

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

更新:如果不是这样,哪个列应作为另一个表中的外键引用。主键列或标识列?

database-design entity-relationship database-normalization third-normal-form
3个回答
4
投票

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

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

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

第三范式(3NF)的形式定义是以第一和第二范式形式的表,其中没有非主键列过载地依赖于主键。

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

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

它错误地说“主键列”,其中主列即CK列是正确的。

他们的另一本书“数据库系统第4版2005”也引入了特殊的定义案例,当时只有一个CK而不说,所以后来给出了“一般”的定义。至少那些得到“主要属性”是正确的。

第三范式(3NF)的一般定义是第一和第二范式中的关系,其中没有非候选关键属性在传递上依赖于任何候选关键字。

对于具有任何正常形式的多个CK的表,没有什么不寻常的。


6
投票

不可以.3NF定义的“官方”措辞通常使用术语“主要属性”或“非主要属性”。如果你的书暗示这意味着“主键的属性”,那么把你的书扔进垃圾箱。这是错误的。 “主要属性”表示“作为任何键的一部分的属性”,“非主要属性”表示“不属于任何键的属性”。因此,在您的“自动增量属性”(以及将使其成为关键字的所有适用FD)的关系模式中的引入不可能引入3NF违规,因为它不会引入非主要属性。


5
投票

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

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

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

候选钥匙是重要的。具有多个键的表没有错。

© www.soinside.com 2019 - 2024. All rights reserved.