我正在编写一个模拟,它需要一个后台数据库来存储结果。模拟写了大量的数据。出于明显的性能原因,我选择尝试一个NoSQL数据库,特别是MongoDB。然而,我对我的数据模型感到有点困惑。
在关系世界中,模式将转换为:

。
仿真工作如下所示。首先,我们创建配置(映射到仿真表),并指定场景和要计算的实现数。然后我们开始模拟。模拟在一个场景中创建实现(并行地,大量的实现和计算同时进行,并插入到模拟当前正在处理的场景中)。
但是,在NoSQL,特别是MongoDB中,关系是不好的和缓慢的,所以我应该尽可能多地使用嵌入式文档。所以我想出了这个:

当首先计算所有的实现,然后将其保存到数据库中时,这个模型应该给我最好的性能(在场景中)。
但是,出于性能方面的原因,我希望在计算出实现后立即将其插入场景中。这将需要每次实现复杂时更新场景。这主意不好吗?它在MongoDB引用中指出,当将嵌入文档添加到父文档中时,父文档将被更新,但无论如何都会导致性能损失。
不是将实现嵌入到场景中而是引用它会更快吗?在以后读取和聚合数据时,会损失多少性能?还有其他我应该知道的陷阱吗?
谢谢。
发布于 2011-07-29 08:12:24
这取决于您将如何使用数据-嵌入可能涉及更新多个文档,所以写起来很慢,但读取总是一个文档,只有这样才会很快。引用正好相反--写入单个文档(快速),但读取多个文档(缓慢)。
除了潜在的限制,比如达到嵌入式文档的最大大小,它只是取决于哪种类型的性能对您的场景更重要。
发布于 2013-07-21 05:16:03
您应该考虑的另一件事是,如果要更新记录,例如,如果您有一个嵌入的用户列表(例如朋友),如果您更改了用户集合中的某个用户的名称,则必须迭代整个朋友列表并手动更新他们的名字。
https://stackoverflow.com/questions/6827781
复制相似问题