mongodb 存储购物车规则的架构设计

mongodb schema design to store cart rule

我正在开发一个使用 mongodb 存储数据的电子商务网站。其中一个模块将是一个 price/cart 规则,用户将获得一张优惠券,他们可以在结账时使用该优惠券以获得折扣。

这工作正常并且是标准的,我不确定如何最好地跟踪用户使用该优惠券的次数以及将其存储在哪个集合中?

这是我目前拥有的模型:

schema = new mongoose.Schema
  name: 
    type: String
    required: true
  description: i18nString.schema
  coupon:
    type: String
    index: true
  type:
    type: String
    enum: ["cart", "price"]
    required: true
  quantity:
    type: Number
    default: 1
  user_qty:
    type: Number
    default: 1
  from: 
    type: Date
    required: true
  to: 
    type: Date
    required: true
  discount: 
    type: Number
    default: 0
    required: true
  log: [
    user:
      type: ObjectId
      ref: "User"
    updatedAt: Date
    status: String
  ]
  status:
    type: String
    enum: ["draft", "active", "archived"]
    default: "draft"
    required: true

这给了我一个像这样的文档:

> db.rules.find({}).pretty();
{
    "__v" : 3,
    "_id" : ObjectId("561e53dfa7e6f5f91c63e32d"),
    "coupon" : "Y3E3TL-3FE00W-DDR7PP-RR27Y8",
    "description" : {
        "en-UK" : "English description"
    },
    "discount" : 10,
    "quantity": 500,
    "user_qty": 5,
    "from" : ISODate("2015-10-13T23:00:00Z"),
    "log" : [
        {
            "user" : ObjectId("55848edda14c975ac907ad6d"),
            "updatedAt" : ISODate("2015-10-14T13:08:47.956Z"),
            "_id" : ObjectId("561e53dfa7e6f5f91c63e32e")
        },
        {
            "user" : ObjectId("55848edda14c975ac907ad6d"),
            "updatedAt" : ISODate("2015-10-14T13:09:11.592Z"),
            "_id" : ObjectId("561e53f7a7e6f5f91c63e32f")
        },
        {
            "user" : ObjectId("55848edda14c975ac907ad6d"),
            "updatedAt" : ISODate("2015-10-14T14:46:03.289Z"),
            "_id" : ObjectId("561e6aab4adfac513594bbe6")
        },
        {
            "user" : ObjectId("55848edda14c975ac907ad6d"),
            "updatedAt" : ISODate("2015-10-15T09:44:55.827Z"),
            "_id" : ObjectId("561f7597efe4eb424baac50f")
        }
    ],
    "name" : "Coupon name",
    "status" : "draft",
    "to" : ISODate("2015-10-23T23:00:00Z"),
    "type" : "cart"
}

我有一个用户集合,所以我应该将它存储在用户文档中还是最好有一个优惠券日志集合并计算用户使用特定优惠券的次数并将其与 user_qty 来自规则集合?

非常感谢任何建议。

我认为解决此问题的最佳方法是在每个用户记录中嵌入一个数组,并将所有优惠券及其独特属性存储在其中。这是因为即使您创建一个不同的集合来存储优惠券,您仍然必须在您的用户记录中存储对这些优惠券的引用,因此仍然会创建一个额外的字段。

不过,如果优惠券是共享的并且可以由多个用户同时使用,您可能需要创建一个不同的集合以避免数据重复。

一切都从用户交互模式开始 - 考虑到您的结构,我认为优惠券操作可能属于以下情况之一:

  • 优惠券可以被多个用户多次使用
  • 优惠券可多次使用,但仅限一个用户使用
  • 优惠券是唯一的,只能由多个用户使用一次
  • 优惠券是唯一的,只能由一个用户使用一次

因此,如果优惠券绑定到用户,我建议您嵌入一个具有类似于以下架构的数组:

coupons: [
    {
        coupon: "Y3E3TL-3FE00W-DDR7PP-RR27Y8",
        hits: 10,
        ...
        //additional fields
    },

    {
        coupon: "G547XW-F9JW04-RXFP77-7JJ0CE",
        hits: 9,
        ...
        //additional fields 
    }
]

否则,如果共享优惠券,我认为您最好将所有优惠券存储在他们自己的集合中并在您的用户记录中引用它们。因此,您的用户记录中可能只有优惠券和点击字段,而所有其他数据都存储在优惠券集合中:

coupons: [
    {
        couponRef: ObjectId("561e53dfa7e6f5f91c63e32d"),
        hits: 10
    },

    {
        couponRef: ObjectId("427e53dfa7e6f5f91c63e32d"),
        hits: 9
    }
]