首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储购物车规则的mongodb模式设计

问存储购物车规则的mongodb模式设计
EN

Stack Overflow用户
提问于 2015-10-15 10:18:26
回答 1查看 1.2K关注 0票数 0

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

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

到目前为止,这就是我的模式:

代码语言:javascript
复制
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

这给了我一份文件,比如:

代码语言:javascript
复制
> 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进行比较?

任何建议都很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-15 11:20:04

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

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

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

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

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

代码语言:javascript
复制
coupons: [
    {
        coupon: "Y3E3TL-3FE00W-DDR7PP-RR27Y8",
        hits: 10,
        ...
        //additional fields
    },

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

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

代码语言:javascript
复制
coupons: [
    {
        couponRef: ObjectId("561e53dfa7e6f5f91c63e32d"),
        hits: 10
    },

    {
        couponRef: ObjectId("427e53dfa7e6f5f91c63e32d"),
        hits: 9
    }
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33145873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档