如何处理文档驱动的nosql数据库上的多用户更新 问题

如何处理文档驱动的nosql数据库上的多用户更新 问题,nosql,couchbase,Nosql,Couchbase,从nosql文档数据库开始,我发现了许多新的可能性,但是,我看到了一些陷阱,我想知道如何处理它们 假设我有一个产品,这个产品可以在很多地区销售。每个区域都有一个负责访问CMS的人。各负责人根据区域法律和规则修改产品 由于连接功能在关系数据库上不受支持,因此文档的设计应该包含构建选择语句和选择结果所需的所有信息,以避免往返数据库 所以我的第一个想法是设计一个或多或少遵循这种结构的文档: { type : "product", id : "product_i

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

假设我有一个产品,这个产品可以在很多地区销售。每个区域都有一个负责访问CMS的人。各负责人根据区域法律和规则修改产品

由于连接功能在关系数据库上不受支持,因此文档的设计应该包含构建选择语句和选择结果所需的所有信息,以避免往返数据库

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

{
   type : "product",
   id : "product_id",
   title : "title",
   allowedAge : 12,
   regions : {
      'TX' : {
         title : "overriden title",
         allowedAge : 13
      },
      'FL' : {
         title : "still another title"
      }
   }
}
但我的印象是,这种方法在更新文件时会产生冲突。假设我们有很多用户通过CMS更新了很多文档。当更新同一文档时,最后一次更新将覆盖以前所做的更新,即使用户也可以只修改此文档的片段。在这种情况下,负责人应该能够只修改区域数据

如何处理这种情况? 我认为一个可能的解决方案是部分文档更新。正面:减少不同操作的数据覆盖;负面:失去乐观锁定功能,因为如果对文档而不是文档片段执行锁定


有其他解决问题的方法吗?

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

保留当前文档结构,并在更新操作时始终检查CAS值。如果CAS不匹配-再次调用存储函数。但正如你所说,如果你有很多用户,它可能会非常慢

将文档分成几个可以独立更新的部分,然后在应用程序端将它们组合在一起。这将导致越来越多的视图调用,一个用于获取主文档,另一个用于获取区域等。。如果你有很多零件,它也会降低性能

见医生。这是关于模拟couchbase中的连接。也有好的作者@


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

保留当前文档结构,并在更新操作时始终检查CAS值。如果CAS不匹配-再次调用存储函数。但正如你所说,如果你有很多用户,它可能会非常慢

将文档分成几个可以独立更新的部分,然后在应用程序端将它们组合在一起。这将导致越来越多的视图调用,一个用于获取主文档,另一个用于获取区域等。。如果你有很多零件,它也会降低性能

见医生。这是关于模拟couchbase中的连接。也有好的作者@


如果您不一定要使用Couchbase,那么从您的问题中不清楚它是通用的还是专用的,也可以查看MongoDB。它支持文档的部分更新和其他原子操作,如增量和数组操作,因此它可能更好地适合您的用例,检查mongo上可能的更新操作-

如果您不一定要使用Couchbase,您的问题不清楚它是通用的还是专用的-也可以查看MongoDB。它支持文档的部分更新和其他原子操作,如增量和数组操作,因此它可能更好地适合您的用例,以便在mongo-