如何在mongodb中设计产品类别和产品模型?

Yus*_*elo 6 database mongodb

我是 mongo db 数据库设计的新手,我目前正在设计一个餐厅产品系统,我的设计类似于简单的电子商务数据库设计,其中每个产品类别都有产品,因此在关系数据库系统中,这将是一个(产品类别)到许多产品。我做了一些研究,我确实在文档数据库中了解了这一点。非国家化是可以接受的,它可以加快数据库读取速度。因此在基于 nosql 文档的数据库中我可以这样设计我的模型

    //product
     {
        name:'xxxx',
        price:xxxxx,
        productcategory:
        {
          productcategoryName:'xxxxx'

        }
     }
Run Code Online (Sandbox Code Playgroud)

我的问题是,我们为什么不将产品嵌入到productcategory中,而不是将类别嵌入到每个产品中,那么一旦我们查询类别,我们就可以拥有所有产品,从而产生这个模型。

    //ProductCategory
    {
       name:'categoryName',
       //array or products
       products:[
                 {
                  name:'xxxx',
                  price:xxxxx
                  },
                   {
                  name:'xxxx',
                  price:xxxxx
                  }
                ]
    }
Run Code Online (Sandbox Code Playgroud)

我在此页面http://www.slideshare.net/VishwasBhagath/product-catalog-using-mongodb和这里http://www.stackoverflow.com/questions/20090643/product-category-management-研究了这个问题in-mongodb-and-mysql 我发现这两个例子都使用我描述的第一个模型(即它们将productCategory嵌入到product中,而不是在productCategory中嵌入产品数组),我不明白为什么,请解释一下。谢谢

ani*_*ish 5

对于数据库设计,在设计数据库模式时,必须考虑基数(一对少、一对多和一对亿)以及数据访问模式(频繁查询、更新)确保您的运营获得最佳性能。从您的场景来看,每个产品似乎都有一个类别,但是您似乎也需要查询才能找到每个类别的产品。所以,在这种情况下,你可以这样做:

Product = { _id = "productId1", name : "SomeProduct", price : "10", category : ObjectId("111") }
ProductCategory = { _id = ObjectId("111"), name : "productCat1", products : ["productId1", productId2", productId3"]}
Run Code Online (Sandbox Code Playgroud)

正如我所说的关于数据访问模式,如果您总是阅读类别名称并且“类别名称”很少更新,那么您可以通过在中添加产品类别名称来使用这种双向引用进行非规范化产品:

Product = { _id = "productId1", name : "SomeProduct", price : "10", category : { ObjectId("111"), name:"productCat1" }
Run Code Online (Sandbox Code Playgroud)

因此,通过嵌入文档,如果不需要联接,则特定查询会更快,但是需要将嵌入详细信息作为独立实体访问的其他查询会很困难。

这是来自 MongoDB 的链接,它解释了一对多场景的数据库设计,就像您所拥有的非常好的示例,在这些示例中您会意识到有更多的方法可以实现这一点,并且还有许多其他需要考虑的事情。

http://blog.mongodb.org/post/88473035333/6-rules-of-thumb-for-mongodb-schema-design-part-3(还有第 1 部分和第 2 部分的链接)此链接还描述了优点和每个场景的缺点使您能够缩小数据库模式设计的范围。


Esc*_*alo 2

这完全取决于您的想法。

假设一种产品只能属于一个类别,而一个类别适用于多种产品。然后,如果您希望将类别与产品一起检索,则直接存储它是有意义的:

 // products
 {_id:"aabbcc", name:"foo", category:"bar"}
Run Code Online (Sandbox Code Playgroud)

如果您希望查询给定类别中的所有产品,那么创建一个单独的集合是有意义的

// categories
{_id:"bar", products=["aabbcc"]}
Run Code Online (Sandbox Code Playgroud)

请记住,您无法自动更新productscategories数据库(MongoDB最终是一致的),但您偶尔可以运行批处理作业,以确保所有类别都是最新的。

我建议考虑我经常需要什么类型的信息,而不是如何规范化/非规范化这些数据,并使您的集合反映您真正想要的内容。