首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB多对多关系逻辑

MongoDB多对多关系逻辑
EN

Stack Overflow用户
提问于 2014-11-18 04:32:08
回答 1查看 525关注 0票数 0

我正试图为产品供应商制造商设计一个模式

  1. 一个产品可以有许多供应商,但只有一个制造商。
  2. 一个供应商可以有许多产品和许多制造商。
  3. 一个制造商可以有许多供应商和许多产品。

我查看了页面,其中10 the表示“为了避免可变的、不断增长的数组,将publisher引用存储在图书文档中”。在我的示例中,我认为product-->manufacturer关系与book-->publisher.的关系等价因此,我要这样做:

代码语言:javascript
运行
复制
{
   _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"
}    

什么是最好的方法来处理供应商(与许多产品和许多制造商的关系),使我“避免可变的,不断增长的阵列”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 01:12:11

注:,这是一种建模方法。数据建模与用例和您想问的相关问题有很大关系。您的用例可能需要一个不同的模型。

我可能会像这样做模型

制造商

代码语言:javascript
运行
复制
{
  _id:"ACME",
  name: "ACME Corporation"
  …
}

产品

代码语言:javascript
运行
复制
{
  _id:ObjectId(...),
  manufacturer: "ACME",
  name: "SuperFoo",
  description: "Without SuperFoo, you can't bar or baz!",
  …
}

现在问题来了。由于可能的话,如果我们将所有产品嵌入到一个供应商文档中,或者反之亦然,那么我们可以很容易地打破16‘d的大小限制,所以我会使用另一种方法:

供应商:

代码语言:javascript
运行
复制
{
  _id:ObjectId(...),
  "name": "FooMart",
  "location: { city:"Cologne",state:"MN",country:"US",geo:[44.770833,-93.783056]}
}

productSuppliers:

代码语言:javascript
运行
复制
{
  _id:ObjectId(...),
  product:ObjectId(...),
  supplier:ObjectId(...)
}

这样,每种产品都可以有数以亿计的供应商。现在有缺点了。

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

代码语言:javascript
运行
复制
db.productSuppliers.find({product:<some ObjectId>},{_id:0,supplier:1})

现在,假设我们想在最大距离为10英里的MN科隆附近找到SuperFoo的所有供应商:

代码语言:javascript
运行
复制
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的数据建模文档。MongoDB的大多数问题源于对各自用例的错误数据建模。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26986634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档