Performance MongoDB为什么使用嵌入式列表而不是单独的集合?

Performance MongoDB为什么使用嵌入式列表而不是单独的集合?,performance,mongodb,collections,Performance,Mongodb,Collections,假设我们有一个具有足够大RAM的服务器,当我们使用单独的集合而不是嵌入的对象列表时,为什么还要担心需要额外的查询呢?由于查询速度非常快,所以将对象存储为嵌入列表是否值得 有一个问题。因此,当依赖于数据模型时,您会人为地限制可以存储的内容 根据您的具体情况,频繁增加文档大小可能会导致文档在数据文件中移动,这是一项非常昂贵的操作,您确实希望避免 对于复杂的数据模型,查询往往会变得更加复杂,从而导致问题,正如您在这里经常看到的那样。复杂的查询不一定更快 通常,嵌入式文档源于这样一个事实,即开发人员习惯

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

  • 有一个问题。因此,当依赖于数据模型时,您会人为地限制可以存储的内容
  • 根据您的具体情况,频繁增加文档大小可能会导致文档在数据文件中移动,这是一项非常昂贵的操作,您确实希望避免
  • 对于复杂的数据模型,查询往往会变得更加复杂,从而导致问题,正如您在这里经常看到的那样。复杂的查询不一定更快
  • 通常,嵌入式文档源于这样一个事实,即开发人员习惯于SQL连接,并且希望他们的数据都在一个查询中。但如果你把它归结起来,通常你会有这样的问题

    对于给定的
    X
    ,属于它的
    Y
    是什么

    所以通常你已经有了
    X
    。在大多数情况下,没有必要过早加载您从未需要的数据。想象一下Xs的概览页面,在该页面中,您选择了希望查看相应的
    Y
    s的
    X
    。即使分页为10,如果嵌入了所有数据,加载的9/10数据也是无用的。有趣的事实:这也适用于SQL——尽管现在似乎没有人关心真正的优化


  • 这是的摘要,您可以在其中找到上述要点的详细说明。

    您是否应该基于硬件设计数据库模型?答案是否定的!如果你能减少查询的数量,为什么不这样做呢?您设计了一个应用程序,但您永远不知道将承载它的计算机。下面是一个指南,提供了一些关于如何在mongodb中建模关系的提示:对于我的项目,我认为使用嵌套的嵌入式列表可能会更复杂,查询方面的。你能看看我的另一个问题吗?所以Markus,当对象列表是有限的/非常少的20-30个最大对象时,比如说,即使我需要查询嵌套列表中的对象,还是将其存储为嵌入对象更好吗?@user1955934如果不知道您的用例、嵌入文档的大小、应用程序等等,这很难说。一般来说,如果您不能绝对肯定每次加载包含文档时都需要嵌入文档,并且在任何情况下嵌入文档的数量和/或大小都不可能达到大小限制,那么我建议避免嵌入。