如何处理许多用户更新文件驱动的nosql数据库

时间:2013-08-02 11:07:20

标签: nosql couchbase

问题

从nosql文档数据库开始我发现了许多新的可能性,但是,我看到了一些陷阱,我想知道如何处理它们。

假设我有产品,并且此产品可以在许多地区销售负责每个区域(可访问CMS)。每个负责相应地修改产品区域法律和规则。

由于 Join 功能不受支持,因为我们在关系数据库上知道它,文档的设计应该包含构建我们的选择语句和选择结果所需的所有信息 避免往返到数据库。

所以我的第一个问题是设计一个或多或少遵循这种结构的文档:

{
   type : "product",
   id : "product_id",
   title : "title",
   allowedAge : 12,
   regions : {
      'TX' : {
         title : "overriden title",
         allowedAge : 13
      },
      'FL' : {
         title : "still another title"
      }
   }
}

但我的印象是这种方法会在更新文档时产生冲突。假设我们有很多用户通过CMS更新大量文档。更新同一文档时,上次更新会覆盖之前完成的更新,即使用户只能修改此文档的片段(在这种情况下,负责人应该只能修改区域数据)。

如何处理这种情况?

我想到的一个可能的解决方案是部分文档更新。 肯定:减少来自不同操作的数据覆盖,否定:会失去乐观锁定功能,因为如果对文档进行锁定而不是这样的片段,则会失去锁定功能。

是否有另一种解决问题的方法?

2 个答案:

答案 0 :(得分:5)

在这种情况下,您可以使用3种解决方案:

  1. 保留当前文档结构并始终在更新操作中检查CAS值。如果CAS不匹配 - 再次调用存储功能。 (但正如你所说,如果你有很多用户,那可能会很慢)。

  2. 可以单独更新几个部分的文档,然后在应用程序端将它们组合在一起。这将导致增加视图调用(一个用于获取主文档,另一个用于获取即区域等)。如果你有许多“部件”,它也会降低性能。

  3. 请参阅this doc。它是关于在couchbase中模拟连接。 @ example撰写的Tug Grall也很好。

答案 1 :(得分:1)

如果您没有使用Couchbase(从您的问题中不清楚它是否是一般的或特定的) - 请查看MongoDB。它支持文档的部分更新以及其他原子操作(如增量和数组操作),因此它可以更好地适应您的用例(在mongo上检查可能的更新操作 - http://docs.mongodb.org/manual/core/update/