我读过很多关于“uuid 作为主键”主题的不同意见,我有点困惑。
特别是,这篇文章让我不确定什么是最好的方法: https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-careful-7b2aa3dcb439
我的用例:
我有一个与文档记录具有 1 到 n 关联的文档表。我想使用 UUID 作为文档表中的主键。我将使用 PostgreSql 数据类型 uuid https://www.postgresql.org/docs/current/datatype-uuid.html
此数据类型是否解决了本文的性能问题? 对于这个用例,是否建议使用 uuid? 这样做的目的只是为了让 ID 无法被猜到。
我在您链接到的文章中没有看到任何反对 UUID 的严肃论据。就性能而言:
生成 UUID 比计算序列要慢
uuid
比 bigint
需要更多的存储空间
最重要的是,UUID 上的主键索引在
INSERT
期间永远不会表现得那么好,需要更多 I/O 并且不会那么密集
但是所有这些性能缺点可能与您的其余处理相比相形见绌:网络延迟、客户端应用程序处理等。所以不要太担心。
我的经验法则:如果您因为在分布式系统中或数据库外部生成主键而需要 UUID,请这样做。如果您没有令人信服的理由使用 UUID,请使用身份列。