我正在尝试为产品,供应商和制造商设计架构:
我查看了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"
}
处理供应商的最佳方式是什么(与许多产品和许多制造商有关系),以至于“我避免使用可变的,不断增长的数组”?
答案 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的大多数问题源于各个用例的错误数据建模。