我正在创建一个RESTful API。
我的用户表有一个主键1,2,3,...
现在在API中命名资源,我想要一些更复杂的名称。哈希值也将是唯一的标识符,但更难猜测。
我应该将此哈希保存在用户表的额外列中,还是将1,2,3,...踢出主键,并使用唯一的哈希作为全局ID(数据库和API)
为什么复杂?
REST API URL可以被发现。混淆资源标识符几乎是不可发现的。如果要阻止人们访问某些数据,请通过身份验证和授权保护该数据。如果您实际上是在创建RESTful API,那么其中一部分就是可发现性。
因此,从API角度来看,我可以想象做这样的事情的唯一理智的原因是避免URI和PK之间的强耦合。举例来说,例如,您希望将来更改存储,并且您不想永远被顺序的PK所困扰。如果是这样,我会说使用随机UUID版本4,作为二进制值存储在数据库中,并使用十六进制表示来构造URI。这就是我在这种情况下所做的,并且效果很好。
现在,从数据库角度来看,我建议您在采用数据库之前先检查数据库如何处理随机值作为主键。例如,MySQL插入性能会由于聚集索引中的随机值而大大降低,因此最好为hash / uuid列使用唯一索引,并为PK使用自动递增列。
除此之外,如果您只想混淆URI,我不会更改数据库,只需对整数值应用一些可逆编码,即可将其用作URI的一部分。