问题

我一直倾向于在数据库中使用长整数作为主键,以简单和(假设)速度.但是当使用 REST 或对象实例的Rails-like 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-addresserve对象实例实现UUID的成本和复杂性吗?我认为我仍然想要将整数列作为数据库PK来加速连接.

还有UUID的in-database表示的问题.我知道MySQL将它们存储为36-字符串. Postgres似乎有更高效的内部表示(128位?)但我自己没有尝试过.有人有这方面的经验吗?


更新:对于那些只在URL中使用用户名的人(例如, http://example.com/user/yukondude ),对于具有唯一名称的对象实例工作正常,但是对于真正只能通过数字识别的zillome的Web应用程序对象怎么样?订单,事务,发票,重复图像名称,stackoverflow问题,...

  最佳答案

我不能说你的问题的Web端.但uuids对ntier应用程序很好. PK生成可以分散:每个客户端生成自己的pk而不会碰撞. 速度差一般很小。

确保数据库支持有效的存储数据类型(16字节,128位)。 至少可以在 base64 中编码 uuid 字符串并使用 char(22)。

我已经广泛使用了Firebird,并且做推荐。

  相同标签的其他问题

databaseweb-applicationsuuid