对于Mongodb,引用一个对象或使用一个自然的String键会更好吗?

时间:2011-05-18 14:14:06

标签: mongodb

我正在建立一个不同语言的索引句子语料库。我有一个语言集合,其中包含ObjectId和ISO代码作为键。使用对语言集合的引用或存储像“en”或“fr”这样的键是否更好?

我想这是一个妥协:

  • 易于引用语言
  • 该集合中的对象
  • 在查询中具有特定语言的查询速度
  • 磁盘上数据的大小

我应该知道的任何最佳做法?

2 个答案:

答案 0 :(得分:7)

最后,它归结为个人选择以及最适合您应用的选择。

MongoDB对_id强加的唯一要求是它是唯一的。它可以是ObjectId(默认提供),字符串,甚至是嵌入式文档(我记得它不能是数组)。

在这种情况下,您可以保证ISO代码是唯一值,它可能是理想值。你有一个'已知'的主键,它本身也是可识别的,所以使用它而不是生成的ID可能是一个更明智的选择。它还意味着您可以在另一个集合中“引用”此信息,您可以保存ISO代码而不是对象ID;那些浏览原始数据的人可以立即识别出参考点的信息。

暂且不说:

ObjectId的两大好处是它们可以跨多个机器,进程和线程唯一生成,而无需MongoDB服务器进行任何类型的中央序列跟踪。它们也作为特殊类型存储在MongoDB中,只使用12个字节(而不是ObjectID的字符串版本的24字节表示)

答案 1 :(得分:3)

除非磁盘空间有问题,否则我可能会使用“en”或“fr”等语言键。通过这种方式,它可以节省对Languages集合执行额外查询以查找给定语言的ObjectId键,您可以直接查询sentences

db.sentences.find( { lang: "en" } )

只要lang字段被编入索引 - db.sentences.ensureIndex( { lang: 1 } ) - 我认为查询效果不会有太大差异。

如果你有一个庞大的数据集,并且磁盘空间是一个问题,那么你可以考虑一个ObjectId(12个字节),或一个数字(8个字节),它可能小于UTF-8字符串键取决于它的长度。