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

时间:2015-10-15 10:18:27

标签: mongodb schema nosql

我正在使用mongodb来存储数据的电子商务网站。其中一个模块将是价格/购物车规则,用户将获得一张优惠券,他们可以在结账时放置以获得折扣。

这样做很好并且是标准的,我不确定的是如何最好地跟踪用户使用该优惠券的次数以及用于存储该优惠券的集合?

这是我到目前为止的模型:

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进行比较集合?

任何建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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
    }
]