您将如何设计此 MongoDB 架构?
How would you design this MongoDB Schema?
这是一个相当普遍的问题,在刚开始使用 MongoDB 之后,我试图找出哪个是该模式设计的更好选择。
假设我们有这些实体:Product、Category 和 Order
在 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" ]
}
]
}
我知道这不是一个实际的纯粹答案,更像是一堆问题,但是,我希望它能为您的架构设计提供一些指导。
这是一个相当普遍的问题,在刚开始使用 MongoDB 之后,我试图找出哪个是该模式设计的更好选择。
假设我们有这些实体:Product、Category 和 Order
在 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" ]
}
]
}
我知道这不是一个实际的纯粹答案,更像是一堆问题,但是,我希望它能为您的架构设计提供一些指导。