2015-10-15 60 views
0

我對使用MongoDB中存儲數據的電子商務網站合作。其中一個模塊將是價格/購物車規則,其中用戶將獲得優惠券,他們可以在結賬時將其放置以獲得折扣。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進行比較?

任何意見非常讚賞。

回答

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

*「通常情況下,在MongoDB中,建議嘗試和嵌入文檔作爲儘可能多「。*這個斷言是錯誤的,特別是對於無界數組。 –

+0

我刪除了這個斷言,以免混淆人。感謝您的評論。 –

+0

@VladZ。感謝這一點,在某些情況下,優惠券將在用戶之間共享,所以我會參考用戶內的優惠券。 – khinester