我应该在Rails中使用UUID作为主键吗?

4
我希望使用客户端框架Spine.js,它会为模型生成UUID作为ID,然后可以持久化到服务器。如果我直接使用客户端生成的UUID作为模型的主键,并将其保存在服务器上,这将是最简单的方法。 在Rails中使用客户端生成的UUID作为主键有什么缺点?
2个回答

11
我总体上不喜欢将UUID用作“主键”,但是在分布式模型中,如果UUID生成得当,它们就非常适合。根据其他问题的情况,它仍然可能不是“主”键,而是另一个“候选”键(考虑由唯一索引支持的“备用PK”)。
我知道的两个问题是:
1. UUIDs 像 IPv6 一样。它们很长,因此不是最人性化的值。另一方面,它们的格式非常一致,很容易识别。请准备好你的复制和粘贴技能。
2. 完全随机的UUIDs倾向于使索引碎片化;如果将其用作PK,则通常会聚集(与可能只是指向记录的索引相反),这可能会导致可怕的碎片化。然而;
- 良好的数据库维护计划应该可以解决这个问题:定期重新索引碎片化的索引。 - 特殊的UUID生成方案,例如SQL Server中的NEWSEQUENTIALID,虽然“更可预测”,但也可以生成单调递增的值,从而缓解索引/聚集的碎片化。
祝编码愉快。

考虑到这一切,我应该知道哪些与Rails相关的注意事项? - Chetan
2
我没有遇到过任何一个 (TM) (C) (R)。 - user166390
我刚刚发现了一个问题。rails_admin 无法处理非整数主键。看起来许多插件都假定有一个整数类型的 id 字段,因此它们可能会出现故障 :/ - Chetan
好的,ID 应该不需要由人类使用或编写,首先你不应该在代码中硬编码 ID,而且在测试时,你应该使用自己的代码来管理它,而不是手动输入。 - kisai

3
假设您正在使用关系型数据库来存储这些值,需要注意的一点是,当表格很大时,UUID通常作为主键表现不佳。
请参考我们无畏领袖写的这篇博客文章中的信息性讨论:主键:ID与GUID的比较

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