9

我们正在开发一个阅读量很大并且可能有数百万个文档的应用程序。我们需要在几乎每个集合中引用用户信息。用户信息有一些属性会不时改变。

我们应该使用 DBref 还是在所有集合中嵌入用户信息?

重读应用程序中的 DBref 性能有多差?

如果我们不使用 DBref,如果用户信息定期更改,我们如何更新每个文档?

在 Mongodb 中,对于这种用例,DBref 和嵌入式文档是否有替代方案?

4

1 回答 1

12

DBref 与传统关系系统中的外键不同。它只是一个约定,可以轻松地告诉驱动程序(有能力)自动加载那些引用的文档。有关这方面的更多信息,请参阅DBRef

根据使用的驱动程序,您可能只能在需要时自动加载这些引用(惰性),因此性能开销应该非常小。但是存储开销比另一个文档的简单引用 _id 高一点。基本上,我会说,如果链接的文档可以是变量类型,您应该只使用那些 DBrefs。如果它是静态的,那么你就会被 _id-references 和你自己的惰性加载器功能所困,所以你不要重复自己。

不要重复自己(或数据库术语中的数据重复)也适用于您的上下文,正如 MongoDB 建议的那样(我也会这样做),即仅链接您的文档。否则,您将拥有更高的存储使用率和运行时间较长的更新,以仅更新一个逻辑实体(经常在物理上复制)。

使用前面提到的自定义惰性加载器,您可以添加一些缓存,以便并非每次查找实际上都会导致 mongodb 查找。然后,您很可能需要注意缓存和数据库之间的数据一致性。

于 2012-06-13T06:50:44.463 回答