【问题标题】:MongoDB schema design - reference vs embeddingMongoDB 模式设计 - 参考与嵌入
【发布时间】:2011-10-13 06:08:11
【问题描述】:

我正在编写一个模拟,它需要一个后备数据库来存储结果。模拟写入大量数据。出于明显的性能原因,我选择试用 NoSQL 数据库,特别是 MongoDB。但是,我对我的数据模型有点困惑。

在关系世界中,模式将转换为:

  1. Simulation 保存仿真配置、状态等。
  2. 场景描述了一个特定的模拟案例。
  3. 实现组 TestResults。

模拟工作如下。首先,我们创建配置(映射到模拟表)并指定场景以及要计算的实现数量。然后我们开始模拟。模拟在一个场景中创建实现(并行,这么多实现并同时计算并插入到模拟当前正在处理的场景中)。

然而,在 NoSQL,特别是 MongoDB 中,关系又差又慢,所以我应该尽可能地使用嵌入式文档。所以我想出了这个:

在首先计算所有实现然后将其作为单个插入(场景)保存到数据库时,此模型应该为我提供最佳性能。

但是,出于性能原因,我想在计算后立即将实现插入到场景中。这将需要在每次完成实现时更新场景。这是一个坏主意吗 ?它在 MongoDB 参考上说,当将嵌入文档添加到父文档中时,父文档会更新,但无论如何都会有性能损失。

不将实现嵌入到场景中而是引用它会更快吗?稍后读取和聚合数据时会损失多少性能?还有什么我应该知道的陷阱吗?

谢谢。

【问题讨论】:

    标签: mongodb database-design schema-design database nosql


    【解决方案1】:

    您应该考虑的另一件事是,如果您要更新记录, 例如,如果您有一个嵌入的用户列表(比如说朋友),如果您更改用户集合中某个用户的名字,则必须迭代整个朋友列表并手动更新他们的名字。

    【讨论】:

      【解决方案2】:

      这取决于您将如何使用数据 - 嵌入可能涉及更新多个文档,因此写入速度很慢,但读取始终只是一个文档,因此速度会很快。引用则相反 - 写入单个文档(快)但读取多个文档(慢)。

      除了达到嵌入式文档的最大大小等潜在限制之外,它只是归结为哪种类型的性能对您的方案更重要。

      【讨论】:

        猜你喜欢
        • 2013-02-09
        • 1970-01-01
        • 2014-02-13
        • 2020-12-07
        • 2011-12-06
        • 2012-05-24
        • 1970-01-01
        • 2018-06-20
        • 2011-09-14
        相关资源
        最近更新 更多