2016-02-20 49 views
1

我正在設計一個人們可以預訂活動的網站。我設計的模式存在一些併發問題。首先,我要表明的模式:Mongo數據庫設計

{ 
    title: String, 
    pricing: { [ 
    data: Date, 
    package: String, 
    price: Number 
    ] }, 
    availability: { [ 
    date: Date, 
    capacity: Number, // Number of users a vendor can take. 
    booked: Number // Number of users booked the event for the date. 
    ] } 
} 

現在事件的價格是唯一由DatePackage。因此,如果包裝不同,同一日期可以有多個價格。

只有Date纔可用。所以我必須爲此創建一個單獨的對象。

問題

的問題是,我有兩個不同的調用。

  1. 保存可用性(節省了一次所有日期的能力。這是一個全部刪除和插入新呼叫類型,但保持booked相同的值)
  2. 預訂(增加booked由1一個特定的日期)

由於兩個駐留在同一個對象,我想我會在未來的一個大的併發問題,因爲,如果我救的可用性,並在同一時間使用者的書籍,同樣的事件,在booked號可能不正確。

有沒有更好的解決方案?

回答

1

我假設你的崗位上更新來自客戶端的能力是一樣的東西

{ 
    id: ObjectId //Your event Id 
    updates [ 
     {date: Date, capacity: newCapacity}, 
     {date: Date, capacity: newCapacity} 
    ] 
} 

你可以保持他們目前是如何的陣列,但你應該嘗試的目標只是容量的屬性,而不是覆蓋整個文檔。下面的查詢將遍歷帖子,並更新availablity數組,只針對數組中與查詢匹配的第一項。我假設javascript作爲後端,但這個想法是一樣的。如果你有大量的更新,我會看的到使用bulkUpdate性能

for(var i = 0; i < updates.length; i++) { 
    var update = updates[i]; 
    db.collection.update(
     { 
      _id: update.id, 
      "availability.date": update.date 
     }, 
     {$set: {"availability.$.capacity": update.capacity}} 
    ) 
} 

更新使用批量操作

var bulk = db.collection.initializeUnorderedBulkOp(); 
for(var i = 0; i < updates.length; i++) { 
    var update = updates[i]; 
    bulk.find(
     { 
      _id: update.id, 
      "availability.date": update.date 
     }).update({$set: {"availability.$.capacity": update.capacity}}) 
    ) 
} 
bulk.execute(); 
+0

是預訂

for(var i = 0; i < updates.length; i++) { var update = updates[i]; db.collection.update( { _id: update.id, "availability.date": update.date }, {"availability.$.booked": {$inc : 1}} ) } 

編輯例如,你的假設有關我的帖子更新是正確的。 我也想到了這個,但是你不覺得這也是個壞主意嗎? 如果我有100個元素在數組中,它會打100個電話到數據庫? –

+0

正如我現在寫的是。但研究bulk.find.update。我已經對具有數千條記錄的類似場景使用批量操作,並且表現非常出色。 – ThrowsException

+0

謝謝,看看貓鼬上如何做到這一點! :) –