在Mongodb中使用自定义ID的效率成本是多少?

时间:2015-07-16 12:07:17

标签: node.js mongodb mongoose

我计划使用this NPM package(shortid)来生成较短的ID,主要用于URL,我希望按照指示使用它们作为Mongodb id(至少对于某些集合)。

使用自定义ID会产生哪些成本?它会以任何显着的方式影响查找时间,写入时间等吗?

1 个答案:

答案 0 :(得分:3)

这些类型的问题很快就会消失在意见之战中,而不是说出一个意见,我认为提供一些优点和缺点,并让你决定哪个更适合这个应用程序会更有意义。

假设" shortid"的格式将被存储为字符串我认为Abigail Watsonsimilar question on Google Groups的响应总结了一些较大的点。她的回答主要针对Meteor应用程序,所以她的一些优点与Meteor团队的设计决策有关,但你可以看到你应该如何考虑是否使用ObjectId或& #34;短ID"是一个基于应用程序的决定。

她的全部回复:

  

ObjectId专业人士

     
      
  • 它有一个嵌入的时间戳。
  •   
  • 它是默认的Mongo _id类型;无处不在
  •   
  • 与其他应用和驱动程序的互操作性
  •   
     

ObjectId缺点

     
      
  • 它是一个对象,在实践中操作起来有点困难。
  •   
  • 有时你会忘记将你的字符串包装在新的ObjectId()
  • 中   
  • 它需要创建服务器端对象以维护_id唯一性
  •   
  • 通过minimongo有问题生成客户端
  •   
     

String Pros

     
      
  • 开发人员可以创建特定于域的_id拓扑
  •   
     

字符串缺点

     
      
  • 开发者必须确保_ids的唯一性
  •   
  • findAndModify()和getNextSequence()查询可能无效
  •   
     根据我的理解,流星选择使用字符串,基本上归结为延迟补偿,并能够在mini-mongo中在客户端生成_id。作为延迟补偿框架的一部分,默认的ObjectId实现并不适合在客户端上生成,因此他们决定推出自己的_id方案。

     

就个人而言,我发现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值。