Mongo数据库设计

时间:2016-02-20 15:16:55

标签: mongodb

我正在设计一个人们可以预订活动的网站。我设计的模式有一些并发问题。让我先说明架构:

{
  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)
  3. 由于两者都驻留在同一个对象中,我认为将来我会遇到很大的并发问题,因为如果我保存可用性并且同时用户预订相同的事件,booked号码可能不正确

    有更好的解决方案吗?

1 个答案:

答案 0 :(得分: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}}
    )
}

更新已预订的

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

编辑使用批量操作的示例

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();