为了简单和(假设的)速度,我一直更喜欢使用长整数作为数据库中的主键。但是当对对象实例使用REST或类似 Rails 的 URL 方案时,我最终会得到这样的 URL:
http://example.com/user/783
然后假设还有 ID 为 782、781、...、2 和 1 的用户。假设有问题的 Web 应用程序足够安全,可以防止人们在未经授权的情况下输入其他号码查看其他用户,a简单的顺序分配的代理键也“泄露”了实例的总数(比这个更早),在这种情况下是用户,这可能是特权信息。(例如,我是 stackoverflow 中的用户 #726。)
UUID / GUID会是更好的解决方案吗?然后我可以像这样设置 URL:
http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66
不完全简洁,但显示的有关用户的隐含信息较少。当然,它带有“通过默默无闻的安全”的味道,这不能替代适当的安全性,但它似乎至少更安全一点。
这种好处是否值得为 Web 可寻址对象实例实现 UUID 的成本和复杂性?我认为我仍然想使用整数列作为数据库 PK 来加速连接。
还有 UUID 的数据库内表示的问题。我知道 MySQL 将它们存储为 36 个字符的字符串。Postgres 似乎有更有效的内部表示(128 位?),但我自己没有尝试过。有人对此有经验吗?
更新:对于那些询问仅在 URL 中使用用户名(例如http://example.com/user/yukondude)的人来说,这对于具有唯一名称的对象实例来说工作得很好,但是无数的网络呢?真正只能通过数字识别的应用程序对象?订单、交易、发票、重复的图像名称、stackoverflow 问题……