PostgreSQL 中 UUID 类型的索引而不是主键

Index instead of primary key on UUID type in PostgreSQL

首先,我阅读了一些关于此的帖子,例如:

我的问题很简单:我在 table 中的 ID 是 UUID v4(在 Rails 中创建或来自 iOS 应用程序)。 由于默认情况下 UUID 是唯一的,我可以删除 ID 上的主键并仅在其上添加索引吗?主要(和 uniq?)目标是在每次插入时节省插入时间(几毫秒)(PostgreSQL 不必验证 ID 是否已被使用)。

这是一个不错的选择吗?或者我是否保留 PK 以在插入之前添加另一个唯一性验证?

有关信息,table 将管理大约 1000 万条记录。

首先:UUID 并不是真正唯一的。但是产生double值的几率真的非常低(How unique is UUID?).

但 UUID 还存在一些其他问题。 UUID 用于在不同点之间交换数据。因此,如果您想到两个相互通信的数据库,它们将共享具有相同 UUID 的相同数据集。现在考虑一个存档,其中存储了来自多个来源的数据集。您可能拥有来自某些旧通信的具有相同 UUID 的数据集。

所以这取决于您当前(也许未来可能?)的用例,这是否会造成任何问题。

此外,我不确定它是否比关于主键索引 space 的简单整数值有任何优势。请注意,每个主键都会自动 creates an internal index per default(因此无需创建单独的索引)。因此,整数列的主键索引可能更小更快。

您描述的两个键显然都被用作代理键。代理意味着它们不是从传入数据派生的,因此除了提供唯一性之外与它没有任何关系。

为了提供唯一性,您不需要 2 个密钥,因此您的问题的答案是您可以删除其中一个密钥。 table 的大小在这里并不是一个真正的因素,因为 uuid_v4() 将为比 1000 万行大得多的数据集提供唯一性。

拥有 2 个唯一性键不仅没有必要,而且也是一个瓶颈。这两个值都必须在插入时创建,并且都必须验证其唯一性。删除其中一个显然是更好的做法。