带有儿童产品的MongoDB架构设计产品

时间:2016-05-25 16:30:53

标签: mongodb data-modeling

在以下博客中,有一个示例:

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 ]

我正在考虑做类似的事情,除了产品可能由许多产品组成(即它们将具有相同的架构)。产品的环境影响将是儿童产品对环境影响的总和。这些孩子可以将自己的父母产品作为其他儿童产品,如树。

为了使更新设计不那么复杂,如果儿童的环境影响发生了变化,它就不会自动将变更传播到链中。父母可以从子女的更新时间戳中看到它更新,并且可以选择通过网络界面重新计算更新其字段。

我是MongoDB的新手,所以只想让社区运行这种架构设计,看看是否有任何潜在的陷阱需要注意这种方法。谢谢。

1 个答案:

答案 0 :(得分:1)

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

你提到孩子们可以有自己的孩子。所以你进入树形结构。请查看此页面以获取可能的解决方案:

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

我的解决方案是“使用祖先阵列建模树结构”,这样您就可以在一个查询中获取所有后代及其相关的环境影响。这将涉及在

中仅保留_id
parts : [{_id: 1}, {_id: 2}, ...]

然后跟踪祖先阵列中的父母和祖父母以及曾祖父母等:

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

请参阅链接以获得有关此模式的清晰说明。