【问题标题】:MongoDB why use an embedded list instead of separate collection?MongoDB 为什么使用嵌入式列表而不是单独的集合?
【发布时间】:2016-01-12 13:58:28
【问题描述】:

假设我们有一个具有足够大 RAM 的服务器,当我们使用单独的集合而不是嵌入的对象列表时,为什么还要担心需要额外的查询呢?由于查询会非常快,将对象存储为嵌入式列表是否值得?

【问题讨论】:

  • 你应该基于硬件设计你的数据库模型吗?答案是不!如果您可以最大限度地减少查询次数,为什么不这样做呢?您设计了一个应用程序,但您永远不知道将托管它的机器。
  • 这里是一个指南,提供了一些关于如何在 mongodb 中建模关系的提示:docs.mongodb.org/v3.0/tutorial/…
  • 对于我的项目,我认为使用嵌套的嵌入式列表可能会更加复杂,查询方式。你能看看我的另一个问题吗? stackoverflow.com/questions/34736372/…

标签: performance mongodb collections


【解决方案1】:
  1. 有一个16MB size limit for BSON documents in MongoDB。因此,当依赖于数据模型时,您可以人为地限制可以存储的内容。
  2. 根据您的storage engine,频繁增加文档大小会导致文档在数据文件中移动,这是您真正想要防止的相当昂贵的操作
  3. 对于复杂的数据模型,查询往往会变得更加复杂,从而导致问题,正如您在 SO 上经常看到的那样。复杂的查询不一定更快。
  4. 通常,嵌入式文档源于开发人员习惯于 SQL JOIN 并希望他们的数据全部包含在一个查询中这一事实。但如果你把它归结为,通常你会有这样的问题

    对于一个给定X,属于它的Ys 是什么?

    所以通常你已经有X。在大多数情况下,无需过早加载您永远不需要的数据。想一想 Xs 的概览页面,您可以在其中选择您希望看到的 Ys 的 X。即使分页为 10,如果您嵌入了所有数据,加载的数据的 9/10 也将毫无用处。有趣的事实:这也适用于 SQL ——尽管现在似乎没有人关心真正的优化。

这是my blog post "The problem with overembedding"的摘要,您可以在其中找到对上述要点的详细解释。

【讨论】:

  • 所以马库斯,当对象列表是有限的/很少有 20-30 个最大对象时,即使我需要查询嵌套列表中的对象,将其存储为嵌入式对象是否更好?
  • @user1955934 如果不知道您的用例、嵌入文档的大小、应用程序等等,很难说这非常。一般来说,如果您不确定每次加载包含文档时都需要嵌入文档并且在任何情况下嵌入文档的数量和/或大小都不可能达到大小限制,我建议避免嵌入。
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 2018-01-12
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多