2013-02-24 91 views
1

我读过很多文件,Q &一个等有关的话题(嵌入或使用引用)。 我明白了点为什么你应该使用一种或另一种方法,但我不能看到有人讨论(问)类似的情况:蒙戈Db的设计(嵌入VS参考)

我有2个(AB)实体以及它们之间的关系是ONE_TO_MANY(A可能属于多个B),我可以使用embed(非规范化的做法),它是确定(我清楚地了解它),但如果我想什么(后)来修改使用,为许多B文件,A文档领域的一个?修改它并不意味着用A'代替A,这意味着一些改变到完全A记录。这意味着(在embed的情况下),我必须在已有A版本的所有B文档中应用此类更改。

根据此处描述http://docs.mongodb.org/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/#data-modeling-example-one-to-many

What If later we would like to change used in many documents address:name field ? 
What If we need the list of available addresses in the system ? 

如何快,操作将在MongoDB中做些什么呢?

回答

0

它是基于什么样的操作大多使用。如果你插入和选择很多文件并且有可能,例如一个月一次,你需要修改很多嵌套的子文件,我认为在B里面存储A是很好的做法,这是mongodb应该是的。您只需选择一个文档即可节省大量时间,而无需再加入另一个文档,并且一次只需更新一次即可,无需任何问题。

0

如何快速更新OPS者显然是依赖于数据量。

其他考虑关于是否使用嵌入文档或参考是数据的单个文件中的卷是否将超过16MB。这是很多文件的头脑。

在某些情况下,然而,它根本没有任何意义尤其denormalise整个文件,他们已经习惯/别处引用。

User文档为例,您通常不需要对每个需要引用用户的集合的所有用户属性进行denormal化。相反,你引用用户[也许有一些非规范化的用户细节]。

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

0

我会针对速度提出一些更多建议。

如果你有一个子文件调用的是嵌入在大量的文件 - 你想改变的情况下...

  • 细心一点的文件不长太多与变化。如果A变得太大,这会损害性能,因为它会强制Mongo将文档移动到内存中。

  • 这显然取决于你有多少嵌入式实例。你越多,它会变得越慢。

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

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

我听说过是否要链接或嵌入是这样的......如果实体(在这种情况下)是可变的...如果它要发生变异/常换最好的建议...然后链接它,不要嵌入它。