是否有一个良好的情况不使用主键?

我目前正在做的事情涉及到几个Excel工作表转换成MS SQL服务器数据库。 这些大多数是完全无关的,不要联系在一起。 有时,一些字段可能真的需要NULL条目。

在任何人开发数据库的经验中,你有没有遇到过一种可以不使用主键的情况?

如果不是,在这种情况下我该怎么办?

在我看来,每个数据库表都应该有一个主键。 在维护数据方面这很重要。 您可以直接更新和删除数据库中的特定行。

一些数据库维护用户可见的内部行标识符。 这绝对是主键的一种可能的替代scheme,但我更喜欢在这些数据库中明确定义一个。

另外,整数标识主键执行以下操作:

  • 他们确定插入到表中的顺序。
  • 它们是使用密钥的连接的轻微优化。
  • 他们区分原本会重复的logging。
  • 他们提供了一个“水印”机制来跟踪最新logging的更新。

主键的问题并不直接关系到表中的其他属性是否允许NULL,也不直接关系到表是否需要链接到其他关系(尽pipe主键用于这种链接)。

相反,主键都是关于build立和维护表中的行所代表的对象的身份 。 在任何应用程序中,您将需要知道该行所指的真实世界“事物”,或者其中具有一组值的行与每一行中的值不相同且可与具有相同值的另一行进行互换,则您将需要一个主键。

当你的表用于产生一个单一的源行没有意义的聚合结果时,你不需要主键。 这包括广泛的报告和分析情况。 主键不会伤害,但在这种情况下是没有意义的。

您可能希望在数据是大数据集的匿名提取的分析情境中专门避免主键。 在这种情况下,没有主键有助于保证信息不能追溯到原始来源。

如果您没有某种方法来唯一标识源数据中的每一行, 而且您可能需要能够从数据中操作或检索特定的行,然后才能创build人造主键。 例如'Entry_ID'

我在你的例子中可以看到的主要问题是如果你导入数据,然后需要修改它。

说你import

Name | Age | Favourite Colour ----------------------------- Anne | 23 | red John | 34 | blue John | 34 | blue 

如果你想删除一个John, 34, blue的,你会怎么做? 那么,可能有一些笨重的代码(我想你会有超过3列)。

 Delete top (1) from testPK where name='john' and age=34 and favouriteColour = 'blue'; 

但是,如果你有这个

 Entry_ID | Name | Age | Favourite Colour ---------------------------------------- 10001 |Anne | 23 | red 10002 |John | 34 | blue 10003 |John | 34 | blue 

那么这很简单

 Delete from Table where Entry_ID = 10003 

根据我的经验,有很多情况下你不需要使用PK。 特别是如果要从外部源导入某些数据,则可以将所有内容导入到分段体系结构中,然后再处理数据和分发(ETL)。 在性能和重复数据删除,清理等方面更好

有时你也可以使用FREETEXTsearch一些字典表,这也不需要PK。

这就是说,在大多数情况下,你的制作表有一个PK有很多原因:性能,组织等…

在我早期的数据库开发经验中,我经常遗漏主键,特别是从其他地方导入的数据,比如你的Excel表格。 没有什么可怕的事情发生。 但回想起来,我是在玩火,很多事情很容易出错。

所以我认为这个问题的最好答案就是把它放在头上:是否曾经有一种情况,使用主键是一个主意? 我不能想到一个主键会导致问题的情况。

至于转换Excel文件,我使用的方法是直接导入Excel表格作为存储数据的表格,直到我把它放到一个“真正的”表中用于数据库。 我使用主键IDENTITY字段+ Excel工作表中的所有字段创build“真实”表,并使用INSERT INTO传输数据。 喜欢这个:

 CREATE TABLE real_table ( Pkey int IDENTITY PRIMARY KEY not null , Column_A varchar(255) null , Column_B varchar(255) null ) INSERT INTO real_table( Column_A , Column_B) select Column_A , Column_B from Excel_import_table