数据结构设计
MongoDB 是一个 NoSQL 数据库,为快速开发以及开发非标准数据结构应用提供灵活的数据存储服务。由于数据的灵活性以及通用性,在设计数据结构时也需要根据数据之间的关系来决定如何存储。
MongoDB 不是一个关系型数据库,但您看到的数据之间都是有关联关系的,那他们之间的关系应该怎么进行存储呢?阅读以下案例了解存储方式。
电商平台案例
电商平台的核心数据一般有三部分:产品,用户,购物车以及订单。订单是由用户购买产品产生的,订单就可以认为是产品和用户之间的关联关系产生的。在订单产生之前,产品和用户之间的关联关系是通过购物车来维持的。针对以上描述,数据应该怎么存储?
首先,产品信息应该存储在例如 products
的产品表里。在该表中存储以下信息:
- 产品基础信息:包含展示信息,商品规格等。
- 属性信息:属性都归属于一个产品,属于 N 对 1 的关系。因此作为子文档存储在
products
集合中较合适。 - 库存及价格信息:库存不仅仅跟产品挂钩,更直接对应的是产品的属性。因此也应该放在
products
集合中。
因此,得到了以下数据:
{
"id": 5573,
"name": "Egg T恤",
"desc": {
"short": "限量版 Egg T恤,穿上它你离极客也不远了",
"long": "这是一段非常长的描述",
"category": {
"_id": "48bf43a..29e90bc",
"name": "上衣",
},
},
"attributes": [
{
"id": 1151,
"name": "尺寸",
"values": [
{
"id": 3871,
"value": "S",
},
{
"id": 3874,
"value": "M",
},
{
"id": 3875,
"value": "L",
}
],
},
{
"id": 1151,
"name": "性别",
"values": [
{
"id": 3872,
"value": "男",
},
{
"id": 3873,
"value": "女",
}
],
}
],
"sku": [
{
"id": 1153,
"stock": 30,
"attributeIds": [ 3871, 3872 ],
"attributes": [
{
"key": "尺寸",
"value": "S",
},
{
"key": "性别",
"value": "女",
}
],
},
]
}
然后,查看购物车数据。跨表查询在各个数据库中都是一个消耗资源的的操作。MongoDB 推荐的方式是通过冗余的存储数据来减少跨表查询带来的性能下降。
{
"userId": "c94477ea-7b12-4da5-8179-5a03defb01af",
"skus": [
{
"id": 1153,
"quantity": 1,
"attributes": [
{
"key": "尺寸",
"value": "S",
},
{
"key": "性别",
"value": "女",
}
],
}
],
"desc": {
"long": "这是一段非常长的描述",
"short": "限量版 Egg T恤,穿上它你离极客也不远了",
"category": {
"_id": "48bf43a..29e90bc",
"name": "上衣",
},
},
}
当然,这也会导致数据更新不及时,应用可以选择在每次数据更新时或提交订单时更新数据。