whe*_*hys 13 rest url database-design mongodb
我在RESTful服务中第一次使用mongoDB.以前我的SQL数据库中的id列是一个递增的整数,所以我的RESTful端点看起来像/rest/objectType/1
.有什么理由我不应该只使用同一角色中的mongoDB的ObjectId,还是更明智地维护一个单独的递增整数id列并将其用于urls?
Wir*_*rie 16
ObjectId
在RESTful API中多次使用s,最大的缺点是它们在拥有干净的URL方面非常嘈杂.您可以将其保留为十六进制数字,也可以将其转换为一个非常大的整数,这两者都会产生一些不友好的URL:
/rest/resource/52435dbecb970072ec3a780f
/rest/resource/25459211534898951476729247759
Run Code Online (Sandbox Code Playgroud)
我在URL中添加了一个"标题"(就像StackOverflow一样),使它们更加友好:
/rest/resource/52435dbecb970072ec3a780f/FriendlyResourceName
Run Code Online (Sandbox Code Playgroud)
当然,软件会忽略"标题",但用户会看到它并且可以在心理上忽略疯狂的ID段.
通过暴露它们可以从基础设施中学到很少的用处:
除了可能收集机器ID(通常会指示创建ObjectId
s 的客户端数量)之外,其他内容并不多.
ObjectId
s不是随机的,因此您不能将它们用于安全性.您始终需要保护数据.虽然它们可能不会以明显的方式增加,但通过蛮力很容易找到其他资源.但是,如果您之前使用自动递增ID,则这不是一个新问题.
如果你知道你是不是在任何给定的时间创造了许多新的文件,它可能采用的模式之一是值得在这里创建一个简单的ID.在我写的一个应用程序中,我使用了auto-inc技术来处理URL中显示的一些文档ID,而对于那些只使用Ajax的应用程序,我使用了ObjectId
s.我真的希望一些URL能够轻松"打字".ObjectId
最终用户不容易输入任何形式的.这是MongoDB的优势之一 - 您可以使用任何_id
您想要的格式.:)
使用ObjectId
s 更明智,因为保持递增计数器可能是一个瓶颈.此外,由于ObjectId
包含时间戳并且是单调的,因此它们可以帮助优化查询.
该ObjectIds
可以猜到,但因为这是递增的ID绝对是真实的,我怀疑你没有通过之前默默无闻依靠安全,所以这是不麻烦你.
虽然是一个小的缺点,但是服务器上的创建时间会泄露给用户,即如果用户能够将其识别为ObjectId
,则可以对对象的创建时间进行反向工程.这是我看到的唯一潜在问题.
归档时间: |
|
查看次数: |
3278 次 |
最近记录: |