什么是PostgreSQL中的uuid-ossp?

5

我在迁移中看到过这个

enable_extension 'uuid-ossp'

据我所知,uuid是一种基于某些RFC的长唯一字符串,这使得db(在本例中为pg)可以将该列类型设为uuid。
我的问题是 - 为什么需要这种类型的列而不只是一个字符串列? 它是用来替换常规的整数id列,并将uuid作为id吗?
使用uuid作为id是否有优势,而不是只有一个包含uuid的字符串类型列?

UUID不是字符串,而是一个128位的值,通常以36个字符的十六进制字符串形式呈现给人类。uuid-ossp是Postgres的插件,用于生成UUID值。请参见:在Postgres中生成UUID以进行插入语句?Postgres中UUID列的默认值 - Basil Bourque
2个回答

5
我希望看到更多人在这里发表意见,但我认为 uuid 的想法是用一个更独特的 id 替换 id 列,这在你拥有分布式数据库或处理复制时非常有用。
优点:
- 更容易合并数据 - 在必要时/如果需要转移到分布式系统时,具有更好的扩展性 - 避免了 Postgres 序列问题,这些问题经常在合并或复制数据时发生 - 您可以从其他平台(而不仅仅是数据库,如果需要)生成它们 - 如果您想混淆您的记录(例如,而不是访问 users/1(id),这可能会促使好奇的用户尝试 users/2 来查看他是否可以访问其他人的信息,因为参数的顺序显然是连续的)。当然,处理此特定问题还有其他方法
缺点:
- 需要比典型 id 更大的键长度 - 通常是非连续的(如果您按其排序,可能会导致奇怪的行为,但通常情况下不应该这样做) - 在故障排除时更难引用(通过长 UUID 而不是简单的整数 id 查找)
以下是我发现有价值的一些资源:
- Peter van Hardenberg(Heroku 的成员)关于 UUID 的论点(除其他内容外,这是一份惊人的演示文稿,您应该观看全部)...这是使用 UUID 而不是 id 的部分:http://vimeo.com/61044807#t=15m04s - Jeff Atwood(曾在 StackOverflow 工作)关于 GUID 的论点:http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html - http://rny.io/rails/postgresql/2013/07/27/use-uuids-in-rails-4-with-postgresql.html - http://blog.crowdint.com/2013/10/09/using-postgres-uuids-as-primary-keys-on-rails.html

就数据长度而言,典型的ID字段使用32位或64位整数。UUID是128位值,由Postgres存储。因此,它比原来大两到四倍。如果您需要联合数据等好处,那么这是非常值得的。幸运的是,内存和存储现在非常便宜。 - Basil Bourque


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接