【问题标题】:How to store many-to-many relationships in MongoDB如何在MongoDB中存储多对多关系
【发布时间】:2012-05-25 05:22:34
【问题描述】:

今天下午刚刚安装了数据库,我认为我对 MongoDB 还很陌生。

我正在设法掌握存储和检索对象,但我正在努力寻找存储具有多对多关系的对象的最佳方法。

我已经遇到过 DBRef 对象并且已经开始工作了,但这似乎只支持延迟加载的方法。

有没有办法鼓励 MongoDB 急切地加载 DBRefs?
是否有更好/不同的方式来存储多对多关系?

非常感谢

罗伯

【问题讨论】:

  • 您能否更具体地说明您想要存储的关系类型? Mongo 的文档结构是灵活的,并不是所有的多对多关系都必须以相同的方式表示。这里有很多不同模式的好例子:mongodb.org/display/DOCS/Schema+Design
  • 盖茨副总裁发布了一个链接,其中包含“用户 - 活动 - userCampaign”的完美示例。在此建议存储 id 列表,存储 ID 是否比存储 DBRef 更好?

标签: mongodb many-to-many mongodb-php


【解决方案1】:

首先,我认为您需要查看this question over here,它讨论了多对多关系。

要了解的另一件事是“DBRefs”的性质。 MongoDB 数据库不提供任何连接功能

DBRef 只是几年前几个库/驱动程序实施者商定的标准。 DBRef 只是一个特定表示法的 JSON 对象,它提供指向某个集合中的某个其他文档的指针。因此,“延迟与急切”加载的实现完全取决于您正在使用的驱动程序/包装器库。

也就是说,“急切加载”的概念对于 MongoDB 来说是毫无意义的。在 SQL 中,您可以通过使用某种形式的预加载和“提前”进行连接来潜在地节省总查询量。同样,数据库不支持连接,因此“急切加载”与“延迟加载”采用相同数量的查询。

【讨论】:

  • 我还想指出,即使是 mongo 文档也表示,如果您知道集合将保持不变,手动存储 ID 会更有效。就我个人而言,我不使用 DBref,只存储 ID 并在需要时解析它们。
  • 这引发了一个有趣的问题。这是否意味着如果 MongoDB 托管在与 Web 服务器不同的机器上,那么每个文档请求都会有一个往返行程?我注意到执行 find() 会返回一个游标,其中每个文档都在迭代中被检索。
  • @RobForrest 这取决于您的实现。如果您有两个集合:A 和 B,并且您从 A 然后 从 B 加载所有内容,您可能可以在两个查询中执行此操作。但是,如果您在 for 循环内执行简单的“延迟”加载,您肯定会产生大量开销。因此,您可能希望同时实现“加入”和“批量加入”功能。
猜你喜欢
  • 2011-06-17
  • 2013-01-02
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2020-08-02
  • 2020-10-09
相关资源
最近更新 更多