【问题标题】:How to design product category and products models in mongodb?如何在mongodb中设计产品类别和产品模型?
【发布时间】:2015-07-08 19:31:25
【问题描述】:

我是 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 中),我不明白为什么,请解释一下。谢谢

【问题讨论】:

    标签: mongodb database


    【解决方案1】:

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

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

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

    Product = { _id = "productId1", name : "SomeProduct", price : "10", category : { ObjectId("111"), name:"productCat1" }
    

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

    这是一个来自 MongoDB 的链接,它解释了一对多场景的数据库设计,就像你有很好的例子一样,你会意识到有更多的方法可以做到这一点,还有很多其他的事情需要考虑。

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

    【讨论】:

      【解决方案2】:

      这完全取决于您的想法。

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

       // products
       {_id:"aabbcc", name:"foo", category:"bar"}
      

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

      // categories
      {_id:"bar", products=["aabbcc"]}
      

      请记住,您不能同时更新 productscategories 数据库(MongoDB 最终是一致的),但您可以偶尔运行批处理作业,以确保所有类别都已更新 -迄今为止。

      我建议考虑我经常需要什么样的信息,而不是如何规范化/非规范化这些数据,并让您的收藏反映你真正想要的。

      【讨论】:

      • 感谢您的回复,所以您的意思是我描述的两种模型中的任何一种都可能是正确的,这取决于最适合我的应用程序?在我的应用中,一个产品只能属于一个类别,一个类别有很多产品。一对多。如果我在每个产品类别中嵌入产品数组,那么通过查询类别我也有所有产品,如果我添加一个订单文档,我也可以在订单中嵌入产品。 // { .订单日期_:xxx,。产品:[产品arrar]。 } 这样就完成了我心目中的设计,这是不是一个正确的nosql设计
      • 没有 NoSQL设计;这一切都取决于你需要什么。如果您对查询的性能感到满意,那么它与其他任何事情一样正确
      猜你喜欢
      • 2012-09-16
      • 1970-01-01
      • 2018-07-23
      • 2015-09-23
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多