MongoDB多对多关系逻辑

时间:2014-11-18 04:32:08

标签: mongodb database-schema

我正在尝试为产品供应商制造商设计架构:

  1. 产品可以有许多供应商,但只有1家制造商。
  2. 供应商可以拥有许多产品和许多制造商。
  3. 制造商可以拥有许多供应商和许多产品。
  4. 我查看了this页面,其中10gen表示“为了避免可变的,不断增长的数组,请将发布商参考存储在图书文档中”。在我的示例中,我认为产品 - >制造商关系等同于 book - > publisher 的关系。因此我会这样做:

    {
       _id: "widgets",
       manufacturer_name: "Widgets Inc.",
       founded: 1980,
       location: "CA"
    }
    
    {
       _id: 123456789,
       product_name: "Steel Widget",
       color: "Steel",
       manufacturer_id: "widgets"
    }
    
    {
       _id: 223456789,
       product_name: "White Widget",
       color: "White",
       manufacturer_id: "widgets"
    }    
    

    处理供应商的最佳方式是什么(与许多产品和许多制造商有关系),以至于“我避免使用可变的,不断增长的数组”?

1 个答案:

答案 0 :(得分:1)

注意:这是一种方式来建模它。数据建模与用例和您想要提出的相应问题有很大关系。您的用例可能需要不同的模型。

我可能会像这样建模

制造商

{
  _id:"ACME",
  name: "ACME Corporation"
  …
}

产品

{
  _id:ObjectId(...),
  manufacturer: "ACME",
  name: "SuperFoo",
  description: "Without SuperFoo, you can't bar or baz!",
  …
}

现在出现了问题。可能,如果我们将所有产品嵌入供应商文档中,反之亦然,我们可以轻松地打破16MB的大小限制,我会采用不同的方法:

供应商:

{
  _id:ObjectId(...),
  "name": "FooMart",
  "location: { city:"Cologne",state:"MN",country:"US",geo:[44.770833,-93.783056]}
}

productSuppliers:

{
  _id:ObjectId(...),
  product:ObjectId(...),
  supplier:ObjectId(...)
}

这样,每种产品都可以拥有众多供应商。现在出现了这个缺点。

要查找某个产品的供应商,您必须执行两步查询。首先,您必须找到给定产品的所有供应商ID:

db.productSuppliers.find({product:<some ObjectId>},{_id:0,supplier:1})

现在,我们想要找到距离科隆,明尼苏达州最近距离10英里的所有SuperFoo供应商:

db.suppliers.find({
  _id:{$in:[<ObjectIds of suppliers from the first query>]},
  "location.geo": { $near :
    {
      $geometry: { type: "Point",  coordinates: [ 44.770833, -93.783056] },
      $maxDistance: 16093
    }
  }

})

您需要做一些智能索引才能使这些查询更有效。您需要哪些索引取决于您的使用案例。索引的问题在于它们仅在保存在RAM中时才有效。所以在创建索引时你应该小心。

再次:您对数据进行大量建模的方式取决于您的使用案例。如果每个制造商只有少量产品或每个产品只有少数供应商,或者每个供应商仅供某个制造商提供产品,那么该型号可能看起来很不一样。

请密切关注MongoDB's data modeling documentation。 MongoDB的大多数问题源于各个用例的错误数据建模。