我想建立一个分布式系统。我需要将数据存储在数据库中,使用UUID或GUID作为某些表的主键会很有帮助。我认为这是这种设计的一个缺点,因为 UUID/GUID 非常大而且它们几乎是随机的。另一种方法是使用自动递增的 INT 或 LONG。
使用 UUID 或 GUID 作为我的表的主键有什么缺点?
我可能会使用 Derby/JavaDB(在客户端)和 PostgreSQL(在服务器上)作为 DBMS。
我想建立一个分布式系统。我需要将数据存储在数据库中,使用UUID或GUID作为某些表的主键会很有帮助。我认为这是这种设计的一个缺点,因为 UUID/GUID 非常大而且它们几乎是随机的。另一种方法是使用自动递增的 INT 或 LONG。
使用 UUID 或 GUID 作为我的表的主键有什么缺点?
我可能会使用 Derby/JavaDB(在客户端)和 PostgreSQL(在服务器上)作为 DBMS。
这取决于您的生成功能和决赛桌的大小
GUID 旨在成为全局唯一标识符。正如Postgres 8.3 文档中所讨论的,没有普遍适用的方法来生成这些标识符,但 postgreSQL 确实附带了一些更有用的候选者。
从您的问题范围和对离线写入的需求来看,您已经非常巧妙地排除了除 GUID 之外的任何东西的使用,因此其他方案没有补偿优势。
从功能的角度来看,密钥长度在任何类型的现代系统上通常都不是问题,这取决于读取次数和表的大小。作为一种替代方法,离线客户端可以在没有主键的情况下批量处理新记录,并在重新连接时简单地插入它们。由于 postgreSQL 提供“串行”数据类型,如果客户端可以执行对数据库的简单写入,则永远不需要确定 ID。
还有一个建议 - 永远不要将 GUID 用作聚集索引的一部分。GUID 不是连续的,因此如果它们是聚集索引的一部分,则每次插入新记录时,数据库都需要重新排列其所有内存页面以找到正确的插入位置,以防 int(bigint) 自动递增,它将只是最后一页。
现在,如果我们看一些 db 实现:1.) MySQL - 主键是集群的,没有改变行为的选项 - 建议在这里根本不使用 GUID 2.) Postgres,MS-SQL - 你可以将 GUID 设置为主键非聚集,并使用另一个字段作为聚集索引,例如 autoincrement int。
这取决于。
说真的,到目前为止,你已经付出了一切,这是你能做到的。
为什么使用 UUID 会有帮助?为什么不使用INT?为什么以后不能在 UUID 上建立索引?你明白拥有一个带有 UUID 键的排序列表并在几百万行之后插入一个随机(非顺序)UUID 意味着什么吗?
这将在什么平台上运行?多少个磁盘?有多少用户?有多少记录?