为了简化和(假定)速度,我一直首选使用长整数作为数据库中的主键。但是,当对对象实例使用REST或类似Rails的URL方案时,我将得到这样的URL:
http://example.com/user/783
然后假设存在ID为782、781,...,2和1的用户。假设所讨论的Web应用足够安全,可以防止人们输入其他数字来查看未经授权的其他用户,简单的顺序分配的代理密钥也会“泄漏”实例总数(比该实例旧),在这种情况下为用户,这可能是特权信息。(例如,我是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)的用户来说,这对于名称唯一的对象实例非常适用,但是数十亿个Web只能通过数字识别的应用程序对象?订单,交易,发票,重复的图像名称,stackoverflow问题,...