如何在 pouchdb 中使用数据库

How to work with databases in pouchdb

我正在制作一个任务列表来学习如何使用 PouchDB / CouchDB,应用程序非常简单,需要身份验证并且用户可以创建他们的任务。

我的问题是关于如何在数据库中存储每个用户的信息。我应该为每个用户创建一个数据库来完成他们的任务吗?或者有没有办法将所有用户的所有任务放入一个名为 "Tasks" 的数据库中,并以某种方式过滤同步,以便 PouchDB 不同步服务器中的整个数据库(包括其他用户的任务)?

(pouchdb的文档我看了好几遍,一直没能定义这个,如果有文档,请告诉我在哪里。)

两种模式都有效。唯一的区别是,为了使用过滤复制,您需要提供对主数据库的访问权限。

因为它在 javascript 中,所以很容易获得凭据然后访问主数据库。这将使用户能够查看每个人的数据。

一种更安全的方法是使用 database-per-user 模式。每个数据库都将受到用户凭据的保护。

您可以使用这两种方法来实现您的用例:

每个用户的数据库

  • 每个用户一个数据库,是 CouchDB 中的 db-per-user 模式。每次用户在 CouchDB 中 created/deleted 时,CouchDB 可以处理数据库 creation/deletion。在这种情况下,每个 PouchDB 客户端将复制完整的用户数据库。
  • 您可以在服务器中启用它config
  • 如果用户数据是独立的并且您不需要在用户之间共享信息,那么这是一种合适的方法。在这种情况下,如果您需要将许多用户数据库与 CouchDB 中的另一个数据库同步,那么您可能会遇到一些可伸缩性问题。看到这个 post

每个用户一个数据库

  • 您需要使用 CouchDB/PouchDB 中的 filtered-replication 功能。 post 解释了如何使用它。
  • 通过这种方法,您可以在 PouchDB 中复制 CouchDB 数据库的一个子集
  • 因为你有一个单一的数据库更容易在用户之间共享信息
  • 但是,这种方法存在一些性能问题。过滤过程非常低效。因为它必须处理整个数据集,包括已删除的文档以确定要包含在复制中的文档集。这种过滤是在服务器的 couchdb 外部进程中完成的,这会增加进程的成本。
  • 如果您需要使用过滤方法,最好为此目的使用 Mango 选择器,因为它在 CouchDB 主进程中进行评估并且可以被索引。请参阅 PouchDB 复制过滤选项中的 options.selector

结论

哪个更好?取决于您的用例...无论如何,您都应该考虑两种情况下的可伸缩性问题:

  • 在过滤复制的情况下,如果您必须过滤整个数据集,随着文档数量的增加,您将面临一些问题。据报道,使用芒果选择器时速度提高了 10 倍。
  • 在 db-per-user 的情况下,当用户数量增长时,如果需要将不同的用户数据库合并到一个数据库中,将会遇到一些问题。