【问题标题】:Multiple remote databases, single local database (fancy replication)多个远程数据库,单个本地数据库(花式复制)
【发布时间】:2015-05-14 17:33:53
【问题描述】:

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

用户有一个本地 PouchDB 实例,该实例使用单个 CouchDB 数据库进行复制。很简单。

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

我在 pouchDB 网站上阅读了一些关于 “fancy replication” 的内容,这似乎是我所追求的解决方案。

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

从下面的图表中,您会注意到我需要根据用户所在的组动态添加数据库。我的设计也将受到批评。

流程应该是这样的:

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

【问题讨论】:

  • 你搞清楚角色系统了吗?
  • 是的,基本上在_users 数据库中,我最终为每个数据库使用了一个角色。我在每个用户文档的用户roles 数组中定义了用户可以访问的数据库名称。如果您有任何更具体的问题,请告诉我,我很乐意为您提供帮助,因为我为此花费了大量时间。
  • 您是如何设置用户数据库之间的同步的?
  • 如果您正在为此苦苦挣扎,请考虑使用与远程数据库一样多的 本地 数据库。只要您不是一次实时复制所有这些(HTTP 连接太多),就应该没问题。见sync with multiple databases

标签: couchdb pouchdb


【解决方案1】:

从多个远程数据库复制到本地数据库:

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 的内置 roles,将这些角色应用于用户,然后使用“每个角色的数据库”方案来确保用户只能访问其正确的组 DB。用户可以随时查询_users API 以查看他们属于哪些角色。简单!

更多详情,请阅读pouchdb-authentication README

【讨论】:

  • 诺兰!为了确保我理解正确,流程将是这样的:1)从他/她的数据库中检索所有用户文档 2)当遇到类型为组的文档时:var groupDB = new PouchDB('remote-group-url');(这里有任何性能问题 0_0 吗?)groupDB.replicate.to(localUserDB); 3)在本地,当用户进行与特定组相关的更改时,我们确定相应的数据库并通过执行以下操作进行复制:localUserDB.replicate.to(groupDB)(对于在这种情况下何时使用过滤复制有点困惑)我的流程是否有意义?谢谢大佬
  • 我为文本块道歉,但堆栈溢出似乎不允许在 cmets 中换行。此外,堆栈溢出显然不允许您在五分钟后编辑您的 cmets 0_0
  • 我在上面的问题本身中添加了我不可读的块注释图片下方,
  • 我不太明白你的问题。 :( 您绝对不想用allDocs() 遍历所有文档并尝试自己复制文档(例如使用put() 或其他一些手动方法)。只需使用replicate() API 在数据库之间复制,使用必要时过滤...
  • 如果您加入 Freenode PouchDB IRC 频道,可能会更容易提供帮助。
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多