Postgresql:主键的UUID还是SEQUENCE?

时间:2015-10-22 05:59:04

标签: mysql postgresql

我来自MySQL,在MySQL中,您可以使用AUTOINCREMENT将行的唯一ID作为主键。

我发现Postgresql中没有AUTOINCREMENT,只有SEQUENCE或UUID.I已经读过我们可以使用UUID作为表的主键的地方。这具有掩盖其他用户id的附加优点(因为我想构建将ID作为参数的API)。我应该将哪个用于Postgresql?

3 个答案:

答案 0 :(得分:18)

PostgreSQL中的sequence与MySQL中的AUTOINCREMENT完全相同。 sequenceuuid效率更高,因为uuid为8字节而不是16字节。您可以使用uuid作为主键,就像大多数其他数据类型一样。

但是,我没有看到这与屏蔽用户ID有何关系。如果要屏蔽其他用户的某个用户的ID,则应谨慎管理表权限和/或使用 - 例如 - md5()加密ID。

如果您想要保护一个包含用户数据的表,这些数据来自试图猜测其他ID的窥探黑客,那么uuid类型是一个很好的选择。版本4是最佳选择,因为它有122个随机位(其他6个用于识别版本)。您可以像这样创建一个主键:

id uuid PRIMARY KEY DEFAULT uuid_generate_v4()

然后你就再也不用担心了。

答案 1 :(得分:4)

您可以在表格中使用UUID作为主键,因为它将是唯一的。但请记住,与SEQUENCE相比,UUID将占用更多空间。而且它们也不是很快。但是,他们肯定是独一无二的,因此您可以保证获得一致的数据。

您也可以参考:

答案 2 :(得分:3)

多年来,我开发了使用PK和FK作为数字顺序值的数据库应用程序。这已经完美地发挥了作用,但是近年来,当创建云应用程序时,将在应用程序之间交换信息,并且我们将在我们开发的各种应用程序之间进行集成,我们意识到在API中使用顺序ID最终需要付出很多努力。

在某些应用程序中,我们必须找到要通过API调用发送的(目标应用程序的)ID,另一方面,除了顺序PK / FK列之外,我们所有应用程序中的数据库表, UUID列,未在API调用中使用。在这种情况下,我们决定重写API,以便使用UUID列。

这解决了一些问题,因为我们的一个桌面应用程序会将其数据迁移到另一个云应用程序,该云应用程序还使用了PK / FK列。迁移此数据时,我们必须更改新序列的PK / FK的值,因为这些序列可能会在桌面应用程序的值与云应用程序的值之间发生冲突。考虑到这一点,我们选择将云应用程序PK / FK切换为UUID,因为来自桌面应用程序的数据具有UUID列。

然后的问题是,通过将INT列(PK和FK)转换为UUID列来转换云应用程序表,而不会丢失表信息。那是一项艰巨的任务,但是它变得更容易了,因为我最终构建了一个使更改变得容易的应用程序。应用程序将每个PK / FK整数列更改为UUID,以保留数据和关系。有兴趣的人可以点击以下链接:

https://claytonbonelli.github.io/int_pk2uuid_pk/