mongodb:这是我应该将嵌入对象规范化的地方吗?

时间:2012-03-03 04:57:50

标签: mongodb mongoose

我有一个包含Parent的{​​{1}}个集合,每个EmbeddedThing都包含对创建它的EmbeddedThing的引用。

User

我很快意识到我需要获得给定用户的所有UserCollection: [ { _id: ObjectId(…), name: '…' }, … ] ParentCollection: [ { _id: ObjectId(…), EmbeddedThings: [ { _id: 1, userId: ObjectId(…) }, { _id: 2, userId: ObjectId(…) } ] }, … ] ,我设法使用map / reduce完成:

EmbeddedThing

这是我应该将"results": [ { "_id": 1, "value": [ `EmbeddedThing`, `EmbeddedThing`, … ] }, { "_id": 2, "value": [ `EmbeddedThing`, `EmbeddedThing`, … ] }, … ] 标准化为自己的集合,还是应该保持map / reduce来实现这一目标?还有其他一些设计吗?

如果有帮助,这是为了让用户在所有EmbeddedThing中看到EmbeddedThing的列表,而不是某些报告/聚合任务(这让我意识到我可能会这样做)错)。

谢谢!

1 个答案:

答案 0 :(得分:2)

“嵌入或不嵌入:这是问题”:)

我的规则是:

    如果嵌入对象仅在父对象的上下文中有意义,则
  • 嵌入。例如,没有OrderItem的{​​{1}}没有意义。
  • 如果由性能要求决定,则嵌入。阅读完整的文档树非常便宜(而不是必须进行多次查询并以编程方式加入它们。)

您应该查看您的访问模式。如果您每秒加载Order几千次,并且每周加载一次ParentThing,那么map-reduce可能是一个不错的选择。用户查询速度很慢,但您的应用程序可能没问题。

另一种方法是更正规化。也就是说,当您添加嵌入的东西时,将其添加到父项和用户。

  • 优点:查询很快。
  • 缺点:复杂的代码。双倍写入。可能会失去同步(您在一个地方更新/删除,但忘记在另一个地方执行)。