Mongodb设计(嵌入vs参考)

时间:2013-02-24 07:11:22

标签: performance mongodb web-applications database-design

我已经阅读了很多关于该主题的文档,Q& A等(嵌入或使用引用)。 我理解为什么你应该使用一种或另一种方法,但我看不出有人讨论(问)类似的情况:

我有2个(AB)个实体,它们之间的关系是ONE_TO_MANY(A可能属于许多B),我可以使用{{1} (非规范化方法)并且没关系(我清楚地理解它),但是如果我想(稍后)修改一个已使用的文档,embed文档,B文档字段,该怎么办?修改它并不意味着通过A替换A,这意味着对A'条记录进行了一些更改。这意味着(在A案例中)我必须在已经embed版本的所有B文档中应用此类更改。

基于此处的说明http://docs.mongodb.org/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/#data-modeling-example-one-to-many

A

MongoDb的操作速度有多快?

3 个答案:

答案 0 :(得分:0)

它基于主要使用的操作。如果您要插入并选择大量文档,并且有可能,例如每月一次,您将需要修改许多嵌套的子文档,我认为将A存储在B内是很好的做法,这就是mongodb应该是什么。只需选择一个文档而不需要加入另一个文档就可以节省大量时间,而且只要你没有任何问题就可以更快地更新一次。

答案 1 :(得分:0)

更新操作的速度显然取决于数据量。

关于是否使用嵌入式文档或引用的其他考虑因素是单个文档中的数据量是否超过16mb。这是很多文件。

但在某些情况下,对整个文档进行非规范化是没有意义的,特别是在其他地方使用/引用它们的时候。

User文档为例,通常不会对需要引用用户的每个集合中的所有用户属性进行非规范化。相反,您引用用户[可能有一些非规范化的用户详细信息]。

显然,当引用的用户更改时,需要更新每个额外的非规范化值(除非是审计),但是您可以将更新排队等待后台进程处理 - 而不是让调用者等待。

答案 2 :(得分:0)

我会就速度提出更多建议。

如果您有一个名为A的子文档,它嵌入了大量文档中 - 并且您想要更改A的实例......

  • 注意文档不会随着更改而增长太多。如果A变得太大,那将会影响性能,因为它会迫使Mongo将文档移动到内存中。

  • 这显然取决于您拥有多少个嵌入式实例。你拥有的越多,它就越慢。

  • 这取决于您如何匹配子文档。如果你发现没有索引的A,它会很慢。如果您使用范围运算符来识别它,则会很慢。

  • 有人已经提到文件的大小很可能会影响速度。

我听到的关于是否链接或嵌入的最佳建议是......如果实体(在这种情况下为A)是可变的......如果它经常变异/改变......那么链接它,不要没有嵌入它。