多个远程数据库,单个本地数据库(花式复制)
Multiple remote databases, single local database (fancy replication)
我有一个管理用户的 PouchDB 应用程序。
用户有一个本地 PouchDB 实例,它使用单个 CouchDB 数据库进行复制。很简单。
这就是事情变得有点复杂的地方。我将 "groups" 的概念引入到我的设计中。组将是不同的 CouchDB 数据库,但在本地,它们应该是用户数据库的一部分。
我在 pouchDB 网站上阅读了一些关于 "fancy replication" 的内容,这似乎是我想要的解决方案。
现在,我的问题是,我该怎么做?更具体地说,如何从多个远程数据库复制到一个本地数据库?一些代码示例会很棒。
从我的下图中,您会注意到我基本上需要根据用户所在的组动态添加数据库。对我的设计提出批评也将不胜感激。
流程应该是这样的:
- 将所有用户文档从 his/her 数据库检索到
localUserDB
var groupDB = new PouchDB('remote-group-url');
groupDB.replicate.to(localUserDB);
(多个 pouchdb 实例有任何性能问题 0_0?)
- 在本地,当用户进行与特定组相关的更改时,我们确定相应的数据库并通过执行以下操作进行复制:
localUserDB.replicate.to(groupDB)
(我需要过滤复制吗?)
从许多远程数据库复制到本地数据库:
remoteDB1.replicate.to(localDB);
remoteDB2.replicate.to(localDB);
remoteDB3.replicate.to(localDB);
// etc.
然后执行从本地数据库到应该接收更改的远程数据库的过滤复制:
localDB.replicate.to(remoteDB1, {
filter: function (doc) {
return doc.shouldBeReplicated;
}
});
为什么过滤复制?因为您的本地数据库包含来自多个来源的文档,并且您不想将所有内容都复制回一个远程数据库。
为什么要过滤函数?由于您是从 从 本地数据库复制,因此使用设计文档、视图等不会提高性能。只需传入一个过滤器函数;它更简单。 :)
希望对您有所帮助!
编辑: 好的,听起来用户所属的组名称实际上包含在第一个数据库中,这就是你的意思 "iterate over." 不,你可能不应该这样做。 :) 您正试图绕过 CouchDB 的内置 authentication/privilege 系统。
相反,您应该使用 CouchDB 的内置 roles,将这些角色应用到用户,然后使用 "database per role" 方案来确保用户只能访问他们的适当的组数据库。用户可以随时查询 _users
API 以查看他们属于什么角色。简单!
有关详细信息,请阅读 pouchdb-authentication README。
我有一个管理用户的 PouchDB 应用程序。
用户有一个本地 PouchDB 实例,它使用单个 CouchDB 数据库进行复制。很简单。
这就是事情变得有点复杂的地方。我将 "groups" 的概念引入到我的设计中。组将是不同的 CouchDB 数据库,但在本地,它们应该是用户数据库的一部分。
我在 pouchDB 网站上阅读了一些关于 "fancy replication" 的内容,这似乎是我想要的解决方案。
现在,我的问题是,我该怎么做?更具体地说,如何从多个远程数据库复制到一个本地数据库?一些代码示例会很棒。
从我的下图中,您会注意到我基本上需要根据用户所在的组动态添加数据库。对我的设计提出批评也将不胜感激。
流程应该是这样的:
- 将所有用户文档从 his/her 数据库检索到
localUserDB
var groupDB = new PouchDB('remote-group-url');
groupDB.replicate.to(localUserDB);
(多个 pouchdb 实例有任何性能问题 0_0?)- 在本地,当用户进行与特定组相关的更改时,我们确定相应的数据库并通过执行以下操作进行复制:
localUserDB.replicate.to(groupDB)
(我需要过滤复制吗?)
从许多远程数据库复制到本地数据库:
remoteDB1.replicate.to(localDB);
remoteDB2.replicate.to(localDB);
remoteDB3.replicate.to(localDB);
// etc.
然后执行从本地数据库到应该接收更改的远程数据库的过滤复制:
localDB.replicate.to(remoteDB1, {
filter: function (doc) {
return doc.shouldBeReplicated;
}
});
为什么过滤复制?因为您的本地数据库包含来自多个来源的文档,并且您不想将所有内容都复制回一个远程数据库。
为什么要过滤函数?由于您是从 从 本地数据库复制,因此使用设计文档、视图等不会提高性能。只需传入一个过滤器函数;它更简单。 :)
希望对您有所帮助!
编辑: 好的,听起来用户所属的组名称实际上包含在第一个数据库中,这就是你的意思 "iterate over." 不,你可能不应该这样做。 :) 您正试图绕过 CouchDB 的内置 authentication/privilege 系统。
相反,您应该使用 CouchDB 的内置 roles,将这些角色应用到用户,然后使用 "database per role" 方案来确保用户只能访问他们的适当的组数据库。用户可以随时查询 _users
API 以查看他们属于什么角色。简单!
有关详细信息,请阅读 pouchdb-authentication README。