我想建立一个分布式系统。我需要将数据存储在数据库中,使用UUID或GUID作为某些表上的主键会很有帮助。由于UUID / GUID很大,而且几乎是随机的,因此我认为这种设计有缺点。替代方法是使用自动递增的INT或LONG。
使用UUID或GUID作为表的主键有什么缺点?
我可能将Derby / JavaDB(在客户端上)和PostgreSQL(在服务器上)用作DBMS。
我想建立一个分布式系统。我需要将数据存储在数据库中,使用UUID或GUID作为某些表上的主键会很有帮助。由于UUID / GUID很大,而且几乎是随机的,因此我认为这种设计有缺点。替代方法是使用自动递增的INT或LONG。
使用UUID或GUID作为表的主键有什么缺点?
我可能将Derby / JavaDB(在客户端上)和PostgreSQL(在服务器上)用作DBMS。
Answers:
这取决于您的生成功能和最终表的大小
GUID旨在成为全局唯一标识符。如Postgres 8.3文档中所讨论的,没有普遍适用于生成这些标识符的方法,但是postgreSQL确实附带了一些更有用的候选方法。
从问题的范围以及对脱机写入的需要出发,您已经非常巧妙地将GUID之外的任何东西都装了箱,因此,其他方案没有补偿优势。
从功能的角度来看,密钥长度在任何现代系统上通常都不是问题,这取决于读取的次数和表的大小。作为一种替代方法,脱机客户端可以在没有主键的情况下批处理新记录,并在重新连接时仅插入它们。由于postgreSQL提供了“ Serial”数据类型,因此如果客户端可以执行对数据库的简单写入,则它们将永远不需要确定ID。
{Node_ID, Item_ID}
,其中每个节点都有一个Node_ID
,每个节点Item_ID
自动递增一个。
还有一条建议-切勿将GUID用作聚集索引的一部分。GUID不是顺序的,因此,如果它们是聚集索引的一部分,则每次插入新记录时,数据库都需要重新排列其所有内存页以找到正确的插入位置,以防int(bigint)自动递增,只会是最后一页。
现在,让我们看一下一些数据库实现:1.)MySQL-主键是群集的,没有任何更改行为的选项-建议此处完全不使用GUID。2. Postgres,MS-SQL-您可以将GUID设置为主键未聚簇,并使用另一个字段作为聚簇索引,例如autoincrement int。
database would need to rearrange all its memory pages to find the right place for insertion
=>我认为Postgres并非如此,因为群集是可选的,新行的存储是无序的。
这取决于。
认真地讲,到目前为止,您已经拥有了尽可能多的东西。
为什么使用UUID会有帮助?为什么不使用INT?您为什么以后不能仅在UUID上建立索引?您是否了解使用UUID键排序列表并在几百万行之后插入随机(非顺序)UUID是什么意思?
这将在什么平台上运行?多少个磁盘?有多少用户?多少条记录?