使用 PouchDB / CouchDB 架构设计的 Cordova Web 应用程序

Cordova Web App using PouchDB / CouchDB Schema Design

我想将 PouchDB 与 CouchDB 一起使用,因为我的 Web 应用程序具有出色的同步和复制功能,但很难找到为我需要做的事情建模数据的最佳方法。

该应用程序允许用户在日历中创建活动,这些活动只能与他们选择的用户共享。与该事件关联的用户可以添加评论并对该事件进行更改。

1) 据我所知,如果所有用户都存储在一个数据库中,每个用户都应该有自己的数据库以避免访问其他用户的数据。如果是这种情况,如何更新或共享来自不同数据库的文档数据?

2) 是否应该在另一台服务器上使用 sql 数据库和 API 来管理用户登录?

任何指导将不胜感激!

斑马鱼

在这种情况下,最简单的做法可能是分配角色并使用 "one database per role" 模型(与 "one database per user" 模型相对)。

您不需要单独的数据库。 CouchDB 可以很好地处理它。但是,您将需要一些服务器端逻辑来管理用户权限、分配角色等。

如果一个事件可以有任意组合的用户,听起来你可能必须做类似 "one document per role," 的事情,转化为 "one document per database." 如果你希望用户创建很多,这可能是不可行的文档,但请记住,您始终可以将多个远程数据库同步到一个本地数据库(反之亦然,或您想要的任何组合)。祝你好运!

如果我对你的应用的理解正确,你的文档看起来像这样:

{
  "_id": "event-{timestamp/name/something}",
  "organizer": "alice",
  "attendees": [
    "alice", "bob", "charlie"
  ]
}

如果这大致正确,那么我会提出以下架构以使其与 PouchDB & CouchDB 的复制一起使用。

这里的目标是 "cut with the grain" CouchDB 的复制协议,将权限划分到容器中(数据库每个用户 database-per-share/relationship),并提供一个潜在友好的 sharing/distribution 模型......因为云有时会消失。 ;)

在下面的流程图中,您可以在左侧看到 Alice 的 "device"(或应用程序等)。 Alice 将事件保存在 private-user-space 数据库中。任何带有与会者的事件文档(如上面的文档)都会被复制(可能通过后台,过滤复制过程)以根据 attendees 键中使用的用户标识符共享数据库(或者你建模你的东西).

每个 share-with-* 数据库都被连续(理想情况下)复制到云托管(最有可能)CouchDB(或兼容)数据库。 Bob 和 Charlie 将他们的应用程序连接到相同的云托管 CouchDB(或兼容)数据库,并将 Alice 的事件复制到他们的 share-with-alice 数据库中。

然后应用程序将这些事件提供给 Bob 和 Charlie,让他们进行编辑,将这些更改复制回 share-with-alice 数据库,然后(最终;因为网络)备份到云端并返回给爱丽丝。

在所有这些中,云位是可选的。 ;) 根据部署情况,这些可能是同一网络上的三个设备以某种方式相互找到对方并在可用时进行复制。

根据我对您的应用程序的了解,此 应该 有效。 :) 您提到还有其他评论文档,它们需要以类似的方式建模——否则应用程序将利用它们与事件文档的关系对相关评论做正确的事情。

我很想知道这听起来是否可行,因为我自己正在为几个项目探索它。

无论如何,希望其中的内容对您有所帮助。 :)

我相信对于 CouchDB 生态系统中的任何类型的用例,总有一个完美的解决方案,但真正让我们远离它的是考虑关系复杂性和安全性减少的个人自由。最好的设计解决方案也是最简单的解决方案。我在 Couchdb/Pouchdb schema design

提到的导致每个用户设计的非循环数据库的安全问题的最简单解决方案