2016-05-25 156 views
1

在以下博客MongoDB的架构设计的产品,还有就是例子:与儿童用品

http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1

其中一个产品可能有很多地方 db.parts.findOne() { _id : ObjectID('AAAA'), partno : '123-aff-456', name : '#4 grommet', qty: 94, cost: 0.94, price: 3.99 }

db.products.findOne() { name : 'left-handed smoke shifter', manufacturer : 'Acme Corp', catalog_number: 1234, parts : [ // array of references to Part documents ObjectID('AAAA'), // reference to the #4 grommet above ObjectID('F17C'), // reference to a different Part ObjectID('D2AA'), // etc ]

我想除了产品可以由许多产品组成(即它们将具有相同的模式)之外,可以做类似的事情。产品对环境的影响将成为儿童产品对环境影响的总和。这些孩子反过来可以成为他们自己的父母产品给其他儿童产品,如树。

为了使更新的设计更简单,如果孩子的环境影响发生了变化,它不会自动将变化传播到链条上。父母可以从儿童更新时间戳中看到它是更新的,并且可以选择通过Web界面重新计算其字段。

我是MongoDB的新手,所以只想由社区运行这个模式设计,看看是否有任何潜在的隐患要留意使用这种方法。谢谢。

+0

顺便说一句,如果你的零件号码是部分唯一的(通常是这些东西),你可以将它们保存为'_id'值,或者存储'{“partno”:“123-aff-456”}作为'_id'值。 – PaulMcG

+1

请告诉我们你想要准确模型。也许那么我们可以帮助你更多。 –

+0

弗兰克你仍然在寻找答案或是提供的答案是否足够? –

回答

1

有了上述设计,孩子的环境影响不会存储在儿童的阵列中。因此,要获得产品的整体环境影响,您必须运行两个查询,这可能没有问题。如果最好在一个查询中得到这个结果,那么你必须存储该阵列中每个孩子的环境影响。

你提到孩子们可以有自己的孩子。所以你正在进入一个树形结构。看看这个网页,可能的解决方案:

https://docs.mongodb.com/manual/applications/data-models-tree-structures/

我的解决办法是“模型树的结构与祖先的阵列”这样你可以得到一个查询所有后代及其相关环境影响。这将涉及保持刚刚在

parts : [{_id: 1}, {_id: 2}, ...] 

的_id,然后跟踪祖先数组中的父母和祖父母和曾祖父母等这样:

ancestors: [{_id: 3}, {_id: 2}, {_id: 1}, ...] 

看到该链接有明确这种模式的解释。