您将如何设计此 MongoDB 架构?

How would you design this MongoDB Schema?

这是一个相当普遍的问题,在刚开始使用 MongoDB 之后,我试图找出哪个是该模式设计的更好选择。

假设我们有这些实体:ProductCategoryOrder

在 SQL 场景中,这将是模式的传统方法:

类别 -> 产品 -> 订单详情 <- 订单 (一个类别 有很多 产品,并且每个产品 只有一个 类别 | 一个产品在很多订单中,一个订单 有许多 产品,因此我们创建一个 OrderDetails 加入 table)

如何在 MongoDB 架构中使用相同的方法? 假设一个类别 只有 most 10 到 12 产品。

场景 1:将产品嵌入到类别中:

类别:



{
        "_id" : Category_ID,
        "name" : "Category description"
        "products" : [ { "product_name": "First product", "price": 500  }, { "product_name": "Second product", "price": 150  } ] 
}

订单:


{
        "_id" : Order_ID,
        "order_total" : 500
        "products" : [ { "product_name": "First product", "price": 500 }] 
}

场景 B:将类别嵌入到产品中并在订单中包含产品引用数组

产品

{
        "_id" : First product,
        "price" : 500
        "category" :  { "category_name": "First category name", "description": "some random description"  } 
}

订单


{
        "_id" : Order_ID,
        "order_total" : 500
        "products" : [ product id1, product id2] 
}

根据每个类别有多少产品,将产品嵌入类别可能是一个理想的方案(文档有 16MB 的限制),并且根据使用模式,例如,您是否总是获得一个类别并展示里面的产品?还是每次获取产品的使用模式?

要问的另一个问题是,类别是否需要自己的标识,您是否有一个页面列出有关类别的更多信息?或者一个类别只是一个描述?如果是这样的话,那么我个人会将其更多地视为一个标签,请参见下面的示例:

{
  "_id" : id,
  "name" : "Product name",
  "description" : "Product name",
  "price" : 500
  "categories" : [ "Category name 1", "Category name 2" ]
}

关于订单文件,我会把整个产品复制到订单中,你总是会看到类似的模式,比如SQL,这是因为如果产品的价格或名称发生变化,你希望订单在下订单时有产品的快照。您不希望订单价格在客户付款并发货后发生变化。

{
  "_id" : Order_ID,
  // "order_total" : 500 * this would be calculated
  "products" : [
  {
    "_id" : id,
    "name" : "Product name 1",
    "description" : "Product name 1",
    "price" : 500
    "categories" : [ "Category name 1", "Category name 2" ]
  },
  {
    "_id" : id,
    "name" : "Product name 2",
    "description" : "Product name 2",
    "price" : 500
    "categories" : [ "Category name 1", "Category name 2" ]
  }
  ]
}

我知道这不是一个实际的纯粹答案,更像是一堆问题,但是,我希望它能为您的架构设计提供一些指导。