我计划使用this NPM package(shortid)来生成较短的ID,主要用于URL,我希望按照指示使用它们作为Mongodb id(至少对于某些集合)。
使用自定义ID会产生哪些成本?它会以任何显着的方式影响查找时间,写入时间等吗?
答案 0 :(得分:3)
这些类型的问题很快就会消失在意见之战中,而不是说出一个意见,我认为提供一些优点和缺点,并让你决定哪个更适合这个应用程序会更有意义。
假设" shortid"的格式将被存储为字符串我认为Abigail Watson对similar question on Google Groups的响应总结了一些较大的点。她的回答主要针对Meteor应用程序,所以她的一些优点与Meteor团队的设计决策有关,但你可以看到你应该如何考虑是否使用ObjectId
或& #34;短ID"是一个基于应用程序的决定。
她的全部回复:
ObjectId专业人士
- 它有一个嵌入的时间戳。
- 它是默认的Mongo _id类型;无处不在
- 与其他应用和驱动程序的互操作性
ObjectId缺点
- 它是一个对象,在实践中操作起来有点困难。
- 有时你会忘记将你的字符串包装在新的ObjectId()
中- 它需要创建服务器端对象以维护_id唯一性
- 通过minimongo有问题生成客户端
String Pros
- 开发人员可以创建特定于域的_id拓扑
字符串缺点
根据我的理解,流星选择使用字符串,基本上归结为延迟补偿,并能够在mini-mongo中在客户端生成_id。作为延迟补偿框架的一部分,默认的ObjectId实现并不适合在客户端上生成,因此他们决定推出自己的_id方案。
- 开发者必须确保_ids的唯一性
- findAndModify()和getNextSequence()查询可能无效
就个人而言,我发现ObjectIds中的嵌入时间戳在应用程序的生命周期中稍后是非常宝贵的。它们更难以操作,并且它们为应用程序的开发周期增加了更多的调试时间。但是,对于您调试ObjectIds的额外10或20小时,可以节省10倍或100倍的成本。示例:在工作中,由于嵌入的时间戳,我们只是挽救了一年的生产数据,这为我们节省了数十万美元的R& D时间和精力。
如果你能确保有一个中央权威来生成它们,那么对象就很棒。它们也是任何类型的时间序列数据的首选索引类型。虽然尝试为整个应用程序做出一个或另一个决定似乎很诱人,但我发现选择字符串vs ObjectId(与其他一些索引方案相比)实际上归结为集合中数据的拓扑结构。
在为集合选择_id时可能会问一些有用的问题:
- 集合中的数据是否需要延迟补偿?
- 是时间序列数据吗?
- 其他应用程序或工作实用程序是否会访问该集合?
- 集合中数据的拓扑结构是什么?
https://groups.google.com/d/msg/meteor-talk/f-ljBdZOwPk/oQYZQxCAKN8J
我投入两分钱是考虑使用" shortid"的主要原因。是为了更短的URL,为什么不创建一个也被索引并仅用于获取具有URL ID的文档的URL属性?您可以保留ObjectId
,这样您就不必担心分片或依赖性问题,同时还会缩短网址ID值。