多个远程数据库,单个本地数据库(高级复制)

10

我有一个管理用户的PouchDB应用程序。

用户有一个本地的PouchDB实例,与单个CouchDB数据库同步。相当简单。

这是事情变得有点复杂的地方。我在我的设计中引入了“群组”概念。群组将是不同的CouchDB数据库,但在本地,它们应该成为用户数据库的一部分。

我在PouchDB网站上阅读了一些关于“fancy replication”(高级复制)的内容,这似乎是我要解决的问题。

现在,我的问题是,我该怎么做?更具体地说,如何从多个远程数据库复制到单个本地数据库?一些代码示例会很棒。

从下面的图表中可以看出,我需要根据用户所在的群组动态添加数据库。我也希望对我的设计进行评论。

enter image description here

流程是否应该像这样:

  1. 从用户的数据库中检索所有用户文档到localUserDB中。
  2. var groupDB = new PouchDB('remote-group-url'); groupDB.replicate.to(localUserDB);
    (多个PouchDB实例会有任何性能问题吗? 0_0?)
  3. 在本地环境中,当用户进行与特定群组相关的更改时,我们通过执行以下操作确定相应的数据库并进行复制:
    localUserDB.replicate.to(groupDB) (我需要筛选复制吗?)

你弄清楚角色系统了吗? - Erik Kaplun
是的,基本上在“_users”数据库中,我最终使用了每个数据库一个角色的方式。我在每个用户文档的“roles”数组中定义了用户可以访问的数据库名称。如果您有任何更具体的问题,请告诉我,因为我在这方面花费了相当多的时间,我很乐意帮助您。 - dipole_moment
你是如何设置用户数据库之间的同步的? - Erik Kaplun
如果你遇到了困难,考虑使用与远程数据库一样多的本地数据库。只要你不同时实时复制所有数据库(太多HTTP连接),那么你应该没问题。请参见使用多个数据库进行同步 - AdrianoFerrari
1个回答

11
从多个远程数据库复制到您的本地数据库:
remoteDB1.replicate.to(localDB);
remoteDB2.replicate.to(localDB);
remoteDB3.replicate.to(localDB);
// etc.

然后在本地数据库和接收变更的远程数据库之间进行过滤复制
localDB.replicate.to(remoteDB1, {
  filter: function (doc) {
    return doc.shouldBeReplicated;
  }
});

为什么要使用过滤复制?因为您的本地数据库包含来自许多来源的文档,您不希望将所有内容都复制回一个远程数据库。
为什么要使用过滤函数?因为您正在从本地数据库复制,所以使用设计文档、视图等并不能提高性能。只需传递一个过滤函数即可,这样更简单。 :)
希望这可以帮助您!
编辑:好的,听起来用户所属组的名称实际上包含在第一个数据库中,这就是您所说的“迭代”。不,您可能不应该这样做。 :) 您正试图规避CouchDB内置的身份验证/特权系统。
相反,您应该使用CouchDB内置的角色,将这些角色应用于用户,然后使用“每个角色一个数据库”的方案,以确保用户只能访问其正确的组DB。用户始终可以查询_users API以查看他们所属的角色。简单!

如需更多详细信息,请阅读pouchdb-authentication README


Nolan! 为确保我理解正确,流程应该是这样的: 1)从用户的数据库中检索所有用户文档 2)当遇到类型为group的文档时: var groupDB = new PouchDB('remote-group-url');(这里有任何性能问题吗0_0?)groupDB.replicate.to(localUserDB);3)在本地,当用户对特定组进行相关更改时,我们通过执行以下操作确定相应的数据库并进行复制: localUserDB.replicate.to(groupDB)(在这种情况下有点困惑何时使用过滤复制)我的流程是否合理?谢谢 - dipole_moment
非常抱歉这段文字太长了,但是 Stack Overflow 似乎不允许在评论中换行。此外,Stack Overflow 显然不允许您在五分钟后编辑评论 0_0。 - dipole_moment
我在图片下方的问题本身中添加了我的难以阅读的块注释。 - dipole_moment
1
我真的不太理解你的问题。:( 你绝对不想使用 allDocs() 迭代所有文档,并尝试自己复制文档(例如使用 put() 或其他手动方法)。只需使用 replicate() API 在数据库之间进行复制,如果需要可以进行过滤... - nlawson
如果您加入Freenode PouchDB IRC频道,那么寻求帮助可能会更容易。 - nlawson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接