[英]MongoDB many-to-many relationship logic
我正在尝试为产品 , 供应商和制造 商设计模式:
我查看了该页面,其中10gen指示“为避免可变的,增长的数组,请将出版商的参考文献存储在书本文档中”。 在我的示例中,我认为产品->制造商关系与书籍->发布者关系相同。 因此,我将这样做:
{
_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"
}
处理供应商(与许多产品和许多制造商有关系)以便避免“可变的,不断增长的阵列”的最佳方式是什么?
注意:这是建模的一种方法。 数据建模与用例和您要提出的相应问题有很大关系。 您的用例可能需要其他模型。
我可能会像这样建模
生产厂家
{
_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的数据建模文档 。 MongoDB的大多数问题源于相应用例的错误数据建模。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.