如何选择性地复制CouchDB数据库的私有部分和共享部分



我们正在研究使用CouchDB/CouchCocoa将数据复制到我们的移动应用程序中。

我们的系统有大量用户。数据库的一部分对每个用户都是私有的,例如他们的任务。这些我已经能够使用筛选复制毫无问题地进行复制。

问题是。。。该数据库还包括共享信息,其中只有一些信息属于给定用户。我如何选择性地复制共享信息?例如,用户的任务可能引用特定的共享文档。是否有方法确保这些文档包含在复制中,而不包含所有共享文档?

从文档中可以看出,将doc_ids添加到复制(或添加另一个具有这些文档ID的复制)可能是一种解决方案。有人试过这个吗?还有其他解决方案吗?

编辑:考虑到用户数量,将每个共享文档标记为所有共享文档的用户似乎不切实际,但也许这是唯一的方法?

最终解决方案主要取决于您的文档结构,但目前我看到两个用例:

  1. 当您将所有内容都保存在一个数据库中时,可能您已经设置了一些字段来识别,那个文档是共享的还是私有的,对吧?示例:

    所有者:"Mike"

    参与者:[]//若并没有人提及,文档看起来像是私有的(?)

    因此,您只需要一些只处理私人文档和共享文档的过滤器:通过标记、参与者数量、引用或其他方式。

    此外,如果您需要仅为特定用户复制某些文档(例如,仅为Mike复制),则需要特殊视图来处理所有这些文档,是的,可以使用文档ID复制,但这不是一个原子请求:您需要一些服务脚本来处理这些步骤。如果共享文档是由对它们的引用定义的,那么唯一的解决方案是相同的:一些服务脚本,查看生成的文档引用树,并按文档进行复制_身份证。

  2. 回顾您的体系结构。拥有每个用户的数据库是CouchDB的正常用例,并遵循数据分区和隔离的方式。因此,您可以创建每个用户的数据库,该数据库只对该用户是私有的。对于共享文档,您可以创建其他数据库,与安全选项的数据库成员一起使用。每个"共享"数据库将只按名称或组处理一定数量的参与者,因此不会有任何数据泄露,除非这不是CouchDB错误(:

    这种方法乍一看太奇怪了,但您所需要的一切都是创建一些管理脚本来处理数据库的创建和发布,复制将尽可能简单,用户数据是安全的。

附言:我认为"共享"操作使文档不是对每个人都可见,而是对某些用户可见。如果我错了,"共享"状态意味着"公共"状态,而不是p2。将更简单:N个用户数据库+1个公共数据库。

最新更新