我正试图为产品、供应商和制造商设计一个模式
我查看了这页面,其中10 the表示“为了避免可变的、不断增长的数组,将publisher引用存储在图书文档中”。在我的示例中,我认为product-->manufacturer关系与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"
} 什么是最好的方法来处理供应商(与许多产品和许多制造商的关系),使我“避免可变的,不断增长的阵列”?
发布于 2014-11-19 01:12:11
注:,这是一种建模方法。数据建模与用例和您想问的相关问题有很大关系。您的用例可能需要一个不同的模型。
我可能会像这样做模型
制造商
{
_id:"ACME",
name: "ACME Corporation"
…
}产品
{
_id:ObjectId(...),
manufacturer: "ACME",
name: "SuperFoo",
description: "Without SuperFoo, you can't bar or baz!",
…
}现在问题来了。由于可能的话,如果我们将所有产品嵌入到一个供应商文档中,或者反之亦然,那么我们可以很容易地打破16‘d的大小限制,所以我会使用另一种方法:
供应商:
{
_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英里的MN科隆附近找到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的大多数问题源于对各自用例的错误数据建模。
https://stackoverflow.com/questions/26986634
复制相似问题