MongoDB架构设计 - 引用与嵌入

时间:2011-07-26 09:12:58

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

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

在关系世界中,架构将转化为:

Relational data model

  1. 模拟保存模拟配置,状态等
  2. 场景描述了一个特定的模拟案例。
  3. 实现组TestResults。
  4. 模拟工作如下。首先,我们创建配置(映射到Simulation表)并指定方案和要计算的Realization数量。然后我们开始模拟。模拟在场景中创建实现(并行,如此多的实现并同时计算并插入到模拟当前正在处理的场景中)。

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

    Embedded data model

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

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

    将Realization嵌入Scenario并引用它会更快吗?以后读取和聚合数据时会丢失多少性能?我还应该知道其他任何陷阱吗?

    感谢。

2 个答案:

答案 0 :(得分:1)

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

除了达到嵌入式文档的最大大小等潜在限制外,还可以归结为哪种类型的性能对您的场景更为重要。

答案 1 :(得分:0)

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