1

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

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

关系数据模型

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

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

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

嵌入式数据模型

当首先计算所有实现然后将其作为单个插入(场景)保存到数据库时,这个模型应该给我最好的性能。

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

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

谢谢。

4

2 回答 2

2

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

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

于 2011-07-29T08:12:24.227 回答
0

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

于 2013-07-21T05:16:03.237 回答