数据结构设计

MongoDB 是一个 NoSQL 数据库,为快速开发以及开发非标准数据结构应用提供灵活的数据存储服务。由于数据的灵活性以及通用性,在设计数据结构时也需要根据数据之间的关系来决定如何存储。

MongoDB 不是一个关系型数据库,但您看到的数据之间都是有关联关系的,那他们之间的关系应该怎么进行存储呢?阅读以下案例了解存储方式。

电商平台案例

电商平台的核心数据一般有三部分:产品,用户,购物车以及订单。订单是由用户购买产品产生的,订单就可以认为是产品和用户之间的关联关系产生的。在订单产生之前,产品和用户之间的关联关系是通过购物车来维持的。针对以上描述,数据应该怎么存储?

首先,产品信息应该存储在例如 products 的产品表里。在该表中存储以下信息:

  • 产品基础信息:包含展示信息,商品规格等。
  • 属性信息:属性都归属于一个产品,属于 N 对 1 的关系。因此作为子文档存储在 products 集合中较合适。
  • 库存及价格信息:库存不仅仅跟产品挂钩,更直接对应的是产品的属性。因此也应该放在 products 集合中。
    因此,得到了以下数据:
  1. {
  2. "id": 5573,
  3. "name": "Egg T恤",
  4. "desc": {
  5. "short": "限量版 Egg T恤,穿上它你离极客也不远了",
  6. "long": "这是一段非常长的描述",
  7. "category": {
  8. "_id": "48bf43a..29e90bc",
  9. "name": "上衣",
  10. },
  11. },
  12. "attributes": [
  13. {
  14. "id": 1151,
  15. "name": "尺寸",
  16. "values": [
  17. {
  18. "id": 3871,
  19. "value": "S",
  20. },
  21. {
  22. "id": 3874,
  23. "value": "M",
  24. },
  25. {
  26. "id": 3875,
  27. "value": "L",
  28. }
  29. ],
  30. },
  31. {
  32. "id": 1151,
  33. "name": "性别",
  34. "values": [
  35. {
  36. "id": 3872,
  37. "value": "男",
  38. },
  39. {
  40. "id": 3873,
  41. "value": "女",
  42. }
  43. ],
  44. }
  45. ],
  46. "sku": [
  47. {
  48. "id": 1153,
  49. "stock": 30,
  50. "attributeIds": [ 3871, 3872 ],
  51. "attributes": [
  52. {
  53. "key": "尺寸",
  54. "value": "S",
  55. },
  56. {
  57. "key": "性别",
  58. "value": "女",
  59. }
  60. ],
  61. },
  62. ]
  63. }

然后,查看购物车数据。跨表查询在各个数据库中都是一个消耗资源的的操作。MongoDB 推荐的方式是通过冗余的存储数据来减少跨表查询带来的性能下降。

  1. {
  2. "userId": "c94477ea-7b12-4da5-8179-5a03defb01af",
  3. "skus": [
  4. {
  5. "id": 1153,
  6. "quantity": 1,
  7. "attributes": [
  8. {
  9. "key": "尺寸",
  10. "value": "S",
  11. },
  12. {
  13. "key": "性别",
  14. "value": "女",
  15. }
  16. ],
  17. }
  18. ],
  19. "desc": {
  20. "long": "这是一段非常长的描述",
  21. "short": "限量版 Egg T恤,穿上它你离极客也不远了",
  22. "category": {
  23. "_id": "48bf43a..29e90bc",
  24. "name": "上衣",
  25. },
  26. },
  27. }

当然,这也会导致数据更新不及时,应用可以选择在每次数据更新时或提交订单时更新数据。

原文: https://docs.alipay.com/mini/cloud-service/mzohw3