何时使用自动递增的主键,何时不使用?

我试图找出决定是否将自动递增整数作为主键添加到表的“最佳实践”。

假设我有一个包含化学元素数据的表格。 每个元素的primefaces序数是唯一的,永远不会改变。 因此,而不是使用每个列的自动递增整数,它可能会更有意义,只是使用primefaces序数,是正确的?

如果我有一堆书,情况会不会如此呢? 我应该使用ISBN还是主键的自动递增整数? 还是一个包含每个人的SSN的员工表?

有很多已经解决堆栈溢出问题,可以帮助你解决你的问题。 看到这里 , 在这里 , 在 这里 。

您应该寻找的术语: 代用钥匙 。

希望能帮助到你。

这是一个备受争议的问题,双方都很感慨。

在我看来,如果有一个好的,可用的自然钥匙 – 就像国际标准书号(ISBN)那样,我就用它。 无论如何,我将把它存储在数据库中。 是的,一个自然键通常比一个整数自动增量键大,但我认为这个问题是夸大的。 磁盘空间今天很便宜。 我更担心这需要更长的时间来处理。 如果你正在谈论一个80字节的文本字段作为主键,我会说不。 但是如果你正在考虑使用10字节的ISBN而不是8字节的大整数,那么我无法想象会带来很大的性能损失。

有时自然键有性能优势。 例如,假设我想查找一本给定的图书已售出多less份。 我不关心书主logging中的任何数据。 如果主键是国际标准书号,我可以简单地写出“select count(*)from sale where isbn ='143573338X'”。 如果我使用自动增量键,则必须进行连接以查找isbn,并且查询变得更复杂和更慢,如“使用(bookid)从book连接销售中selectcount(*)”,其中isbn ='143573338X' ”。 (我可以向你保证,由于这个特定的ISBN是为我的书,销售logging的数量是非常小的,所以join和读一个额外的logging是一个很大的百分比差异!)

自然键的另一个优点是,当你必须在数据库上工作,并查看通过键引用这个表的logging时,很容易看到他们指向的是什么logging。

另一方面,如果没有好的,明显的自然钥匙,不要试图拼凑一个疯狂的。 我已经看到,人们试图通过把顾客的名字,出生年份的前6个字母和他的邮政编码连接在一起来制定一个自然的关键,然后祈祷这是唯一的。 这种愚蠢只是给自己制造麻烦。 通常情况下,人们最终会采取一个序列号来确保它是独一无二的,那么为什么呢? 为什么不把自己的序列号作为关键?

你有这个想法。

如果您正在build模的项目不存在唯一的密钥,则应将自动增量用作唯一密钥。 所以对于元素你可以使用primefaces序数或书号的ISBN号码。

但是,如果人们在留言板上发布消息,那么这些消息需要一个唯一的ID,但是不包含一个,所以我们从列表中分配下一个数字。

在可能的情况下使用自然键是有意义的,只要记住将该字段作为主键并确保将其索引为性能

关于使用ISBN和SSN,您真的必须考虑其他表中有多less行要通过外键引用这些行,因为这些ID会占用比整数更多的空间,因此可能会浪费磁盘空间,可能会加重performance。

我试图找出决定是否将自动递增整数作为主键添加到表的“最佳实践”。

将其用作PKey不属于用户pipe理数据的数据集的唯一标识符。

假设我有一个包含化学元素数据的表格。 每个元素的primefaces序数是唯一的,永远不会改变。 因此,而不是使用每个列的自动递增整数,它可能会更有意义,只是使用primefaces序数,是正确的?

是。

如果我有一堆书,情况会不会如此呢? 我应该使用ISBN还是主键的自动递增整数? 还是一个包含每个人的SSN的员工表?

国际标准图书编号/国际标准图书由第三方分配,由于其大的存储空间将是一种非常低效的方式来唯一标识一行。 请记住,PKeys在连接表时非常有用。 为什么使用像ISBN这样的大数据格式,当Integer这样一个小而紧凑的格式可用时,将会有许多文本字符作为唯一标识符?

使用自动递增整数方法时遇到的主要问题是,当您将数据导出到另一个数据库实例,甚至是归档和还原操作时。 由于该整数与它所引用的数据没有关系,因此无法确定在将数据还原或添加到现有数据库时是否有重复项。 如果你不想在行和PK中包含数据之间的关系,我只会使用一个GUID。 不太友好的用户来看,但它解决了上述问题。

旧的话题我知道,但另一件要考虑的事情是,鉴于大多数RDBMS使用PK在磁盘上布置块,使用自动递增PK将会大大增加您的争用。 这可能不是你的宝贝数据库的问题,但是相信我可以在城镇的较大一端造成巨大的性能问题。

如果您必须使用自动递增的ID,可以考虑将其用作PK的一部分 。 坚持它到底保持唯一性…..

而且,最好在跳到代孕之前尽可能地消耗自然PK的所有可能性。 人们对此一般都很懒惰。