我们正在研究使用CouchDB / CouchCocoa将数据复制到我们的移动应用程序。
我们的系统拥有大量用户。数据库的一部分对每个用户都是私有的 - 例如他们的任务。这些我使用filtered replication能够毫无问题地复制。
这是捕获...数据库还包括仅与给定用户有关的共享信息。如何有选择地复制该共享信息?例如,用户的任务可能引用特定的共享文档。有没有办法确保复制中包含这些文档而不包括所有共享文档?
从文档中可以看出,将doc_ids
添加到复制(或添加带有这些doc ID的另一个复制)可能是一种解决方案。有没有人试过这个?还有其他解决方案吗?
编辑:鉴于用户数量,用共享它的所有用户标记每个共享文档似乎是不切实际的,但也许这是唯一的方法吗?
答案 0 :(得分:2)
最终解决方案主要取决于您的文档结构,但目前我看到两个用例:
当您将所有内容保存在单个数据库中时,可能您有一些字段设置为可识别,该文档是共享的或文档是私有的,对吧?示例:
所有者:“迈克”
参与者:[] //如果没有人提到,文档看起来像私人(?)
所以你只需要一些只能处理私人文件而只能处理共享文件的过滤器:标签,参与者数量,参考文献或某种方式。
此外,如果您需要仅为特定用户复制某些文档(例如仅针对Mike),则需要特殊视图来处理所有这些文档,是的,使用文档ID复制,但这不是原子请求:您需要一些服务脚本来处理这些步骤。如果共享文档是通过对它们的引用来定义的,那么唯一的解决方案是相同的:一些服务脚本,生成文档引用树的视图以及doc._id的复制。
查看您的架构。拥有每个用户数据库是CouchDB的正常用例,并遵循数据分区和隔离的方式。因此,您可以创建仅对该用户私有的每个用户数据库。对于共享文档,您可以使用安全选项的数据库成员创建其他数据库。每个“共享”数据库将按名称或组处理特定数量的参与者,因此除非不是CouchDB错误,否则不会有任何数据泄漏(:
这种方法从一见钟情看起来太奇怪了,但是你需要的所有东西都是创建一些管理脚本来处理数据库的创建和发布,复制很容易,用户数据也是安全的。
P.S。我认为“共享”操作使文档不是针对每个人都可见,而是针对某些用户。如果我错了,“共享”状态意味着“公共”状态而不是p2。将更简单:N个用户数据库+ 1个公共数据库。