出于简单和(假定的)速度考虑,我一直喜欢在数据库中使用长整型作为主键。但是,当使用类似REST或Rails的URL方案来表示对象实例时,我会得到以下这样的URL:
http://example.com/user/783
假设这个网络应用程序足够安全,可以防止未经授权的人输入其他数字查看其他用户,则假设还有ID为782、781、...、2和1的用户。一个简单的顺序分配的替代键也会“泄漏”实例(在此之前)的总数(例如,我是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问题等。