什么是postgres中的uuid ossp

时间:2014-02-11 18:13:58

标签: ruby-on-rails postgresql uuid

我在迁移中看到了这个

enable_extension 'uuid-ossp'

据我所知,uuid是一个基于某些RFC的长唯一字符串,这使得db(在本例中为pg)的列类型为uuid

我的问题是 - 为什么需要这种类型的列而不仅仅是字符串列? 它是替换常规整数id列并将uuid作为id吗?

使用uuid作为id有什么好处而不是只是让字符串类型列包含一个uuid?

2 个答案:

答案 0 :(得分:3)

我希望看到更多的人在这里说话,但我认为uuid的想法是将id列替换为更独特的id,这在你有一个分布式数据库或处理时非常有用复制。

优点:

  • 更容易合并数据
  • 在/必须转移到分布式系统时更好地扩展
  • 避免在合并或复制数据时经常发生的Postgres序列问题
  • 您可以从其他平台(除了数据库,除非您需要)生成它们
  • 如果您想要混淆您的记录(例如,而不是访问users/1(id),这可能会促使好奇的用户尝试users/2以查看他是否可以访问其他人的信息,因为它的明显的参数的顺序性质)。显然,还有其他方法可以处理这个特定的问题

缺点:

  • 需要比典型ID
  • 更大的密钥长度
  • 通常是非连续的(如果您订购它会导致奇怪的行为,无论如何您可能不应该这样做)
  • 在排除故障时更难引用(通过长UUID而不是简单的整数ID查找)

以下是我认为有价值的更多资源:

答案 1 :(得分:3)

没有必要安装该扩展程序以使用uuid type。使用UUID类型而不是文本类型的优点是两个。第一个是自动约束

select 'a'::uuid;
ERROR:  invalid input syntax for uuid: "a"

其次是存储空间。 UUID仅使用16个字节,而十六进制表示采用33:

select
    pg_column_size('0123456789abcdef0123456789abcdef'),
    pg_column_size('0123456789abcdef0123456789abcdef'::uuid)
;
 pg_column_size | pg_column_size 
----------------+----------------
             33 |             16

uuid-ossp extension只会添加生成UUID的函数。