【问题标题】:MongoDB Schema Design Products with Children ProductsMongoDB Schema Design Products with Children 产品
【发布时间】:2016-05-26 03:44:00
【问题描述】:

在下面的博客中有例子:

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 的新手,所以只想通过社区运行这个模式设计,看看是否有任何潜在的陷阱需要注意这种方法。谢谢。

【问题讨论】:

  • 顺便说一句,如果您的零件编号是唯一的(这些东西通常是),您可以将它们保存为 _id 值,或将 {"partno":"123-aff-456"} 存储为 _id 值。
  • 请告诉我们您想要精确建模的内容。也许那时我们可以为您提供更多帮助。
  • Frank 你还在寻找答案还是提供的答案就足够了?
  • @PaulWasilewski - 感谢您提供帮助。我有一个关于我想在另一个 stackoverflow 问题中建模的描述,但它没有得到答案,所以我在这里问了一个更一般的 MongoDB 问题。 stackoverflow.com/questions/37378484/… 目前,我可能会使用 PostGres 进行原型制作,但想稍后尝试 MongoDB。但是,如果您可以为链接问题的答案提供更多帮助,我很想听听。谢谢。

标签: mongodb data-modeling


【解决方案1】:

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

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

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

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

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

然后在祖先数组中跟踪父母和祖父母,曾祖父母等:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 2012-08-30
    • 2022-01-09
    • 2011-08-10
    • 1970-01-01
    • 2013-03-28
    • 2017-09-11
    • 2018-11-20
    相关资源
    最近更新 更多