我是mongo db数据库设计的新手, 我目前正在设计餐馆产品系统,我的设计类似于简单的电子商务数据库设计,其中每个产品类别都有产品,因此在关系数据库系统中,这将是许多产品的一个(产品类别)。 我做过一些研究,我确实理解在文档数据库中。 非国有化是可以接受的,它可以加快数据库读取速度。 因此,在基于nosql文档的数据库中,我可以这样设计我的模型
//product
{
name:'xxxx',
price:xxxxx,
productcategory:
{
productcategoryName:'xxxxx'
}
}
我的问题是,不是在每个产品中嵌入类别,为什么我们不将产品嵌入到productcategory中,然后我们可以在查询类别后获得所有产品,从而生成此模型。
//ProductCategory
{
name:'categoryName',
//array or products
products:[
{
name:'xxxx',
price:xxxxx
},
{
name:'xxxx',
price:xxxxx
}
]
}
我已在此页http://www.slideshare.net/VishwasBhagath/product-catalog-using-mongodb和此处http://www.stackoverflow.com/questions/20090643/product-category-management-in-mongodb-and-mysql对此问题进行了研究发现使用我描述的第一个模型(即他们将productCategory嵌入产品内而不是在productCategory中嵌入产品数组),我不明白为什么,请解释。谢谢
答案 0 :(得分:1)
对于数据库设计,您必须在设计基础时考虑基数(一对多,一对多和一对一)以及数据访问模式(频繁查询,更新)数据库架构,以确保您的操作获得最佳性能。 从您的方案看,每个产品看起来都有一个类别,但是您也需要查询以查找每个类别的产品。 所以,在这种情况下,你可以做类似的事情:
Product = { _id = "productId1", name : "SomeProduct", price : "10", category : ObjectId("111") }
ProductCategory = { _id = ObjectId("111"), name : "productCat1", products : ["productId1", productId2", productId3"]}
正如我所说的数据访问模式,如果你总是阅读类别名称和“类别名称”是经常更新的东西,那么你可以通过添加产品类别来进行这种双向引用的非规范化 - 产品中的名称:
Product = { _id = "productId1", name : "SomeProduct", price : "10", category : { ObjectId("111"), name:"productCat1" }
因此,通过嵌入文档,如果不需要连接,则特定查询会更快,但是您需要将嵌入式详细信息作为独立实体访问的其他查询将很困难。
这是来自MongoDB的链接,它解释了一对多场景的数据库设计,就像你有非常好的例子,你会发现有很多方法可以做到这一点以及许多其他需要考虑的事情。 / p>
http://blog.mongodb.org/post/88473035333/6-rules-of-thumb-for-mongodb-schema-design-part-3(还包含第1部分和第2部分的链接) 此链接还描述了专业人员和每个方案的缺点使您能够缩小数据库模式设计。
答案 1 :(得分:0)
这完全取决于您的想法。
假设产品只能属于一个类别,并且一个类别适用于许多产品。然后,如果您希望与产品一起检索该类别,则直接存储它是有意义的:
// products
{_id:"aabbcc", name:"foo", category:"bar"}
如果您希望查询给定类别中的所有产品,那么创建单独的集合
是有意义的// categories
{_id:"bar", products=["aabbcc"]}
请记住,您无法自动更新products
和categories
数据库(MongoDB 最终一致),但您偶尔可以运行批处理作业,这将确保所有类别是最新的。
我建议用来考虑我经常需要什么样的信息,而不是如何规范化/非规范化这些数据,并使你的馆藏反映出来你真正想要的是什么。