繁体   English   中英

CouchDB 和 PouchDB 之间的过滤同步

[英]Filtered Sync between CouchDB and PouchDB

我目前正在考虑在我想编写的下一个应用程序中使用 CouchDB 2 和 PouchDB 7。 基本上,我将在中央存储中拥有一个 CouchDB,而 Web 客户端和移动应用程序将启动一个会思考的 PouchDB。 基本上这就像一个魅力。

但是......如果过滤器应该基于文档所有权来完成,我如何在 CouchDB 和 PouchDB 之间进行过滤同步?

我知道每个用户数据库的解决方案。 但是我的文档将由文档的创建者和他/她添加为读者或作者的人共享访问。

2018 年有什么解决方案可以解决这个问题? 早在 2016 年,我无法解决这个问题并放弃了应用程序的想法。

您应该在文档中包含限制对文档、所有权、授权用户的访问所需的信息。

根据这些信息,CouchDB 和PouchDB之间的过滤复制定义有两个选项(检查过滤选项)。

  1. 基于 CouchDB 设计文档中定义的 JavaScript 过滤器函数。 过滤器函数允许您实现过滤逻辑,该逻辑接受在请求期间提供的参数作为 URL 参数或通过 req 参数在 CouchDB 中进行身份验证的用户。

    这种方法的主要问题是,只要您的数据库增长,您就会注意到性能下降。 过滤器应用于数据库中的每个文档,甚至是删除的文档,以产生结果。 因此,如果您预见到数据库中将有大量文档,我不推荐这种过滤机制。 这里有此类问题的示例。

    对这个性能问题的一个小小的改进是用 Erlang 编写过滤逻辑,这比 JS 选项要复杂一些,在我的测试中,我没有设法获得很大的收益。

  2. 在 CouchDB 2.x 中有使用选择器执行过滤复制的选项。 选择器可以被索引和据报道,它比 JS 过滤器快 10 倍。 选择器完全由客户端定义,不基于数据库中的身份验证上下文。 此选项的扩展性比前一个要好得多。

在任何情况下,过滤都允许您在复制过程中进行一些数据库分段,但它不是文档级读取权限的安全机制。

使用验证文档更新功能可以实现文档写入权限。


更新我重新审视了这个答案,试图提供关于数据库过滤机制的更精确的信息。 我已经测试了试图确认答案陈述的不同过滤方法的性能。

我加载了一个包含 9000 个文档的数据库,并使用四种技术对 _changes 提要过滤进行了时间测量:JS 过滤、Erlang 过滤、Mango 选择器过滤和 Doc id 过滤,结果如下:

  • JS 过滤 9000 个文档 - 4.3 秒
  • Erlang 过滤 9000 个文档 - 2.3 秒
  • 9000 个文档的芒果选择器过滤 - 0.48 秒
  • 9000 个文档的文档 ID 过滤 - 0.01 秒

测试证实 JS 过滤是更糟糕的选择,因为它需要在引入额外开销的外部进程中评估过滤条件。 Erlang 和 Mango 表达式在过滤过程中进行评估,这代表了真正的性能提升。

为了验证文档数量对过滤的影响,我创建了一个包含 20.000 个文档的数据库,并使用以下结果执行了相同的测试:

  • JS 过滤 20.000 个文档 - 10 秒
  • Erlang 过滤 20.000 个文档 - 5.45 秒
  • 芒果选择器过滤 20.000 个文档 - 1.07 秒
  • 20.000 个文档的文档 ID 过滤 - 0.01 秒

JS、Erlang 和 Mango 过滤时间增量与文档数量成线性关系。 这些过滤机制不使用索引。 Doc ids 过滤是恒定的,因为它基于 _id 索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM