每个用户db(pouchdb / couchdb)&共享数据 - 可行吗?

时间:2017-09-21 19:04:48

标签: couchdb pouchdb

我有以下用例/应用程序:

一个TODO应用程序,用户可以:在TODO上CRUD(我正在使用pouchdb / couchdb同步)。几乎基于Josh Morony的tutorial

现在我想添加用户“分享”(仅发布,没有“编辑”/放置)他们的TODO项目与其他用户的能力,他们能够只查看(读取)那些(没有写访问权限)等)。

我正考虑添加一个单独的数据库(让我们称之为“共享TODO数据库”),我的服务器可以在其中编写,所有用户只能读取。 因此,任何用户都可能在该只读数据库中执行.find(),而在该服务器上发布时,仍然会受到服务器的控制,以便共享来自用户的TODO。

这是否有已知的模式(方法)?是否有任何真正的应用程序/示例已经这样做了?

2 个答案:

答案 0 :(得分:9)

CouchDB没有提供这样做的好方法,但如果你的后端有维护大量共享数据库的工具(除了单用户数据库),我想你可以把它拉下来。

最初的冲动是使用连续过滤的复制到/来自中央主人"集线器,但这会给你带来两个问题:

  • 除非删除文档,否则复制无法删除文档!即过滤后的复制无法确定目标中 > 目标。这样做的结果是你可以分享,但你不能分享。
  • 这种复制不会扩展。对于N个用户数据库,您需要保持同步,对中央数据库的每次更改都会强制所有N次复制独立地处理该更改。现在考虑在中央数据库上发生的变化量M几乎与N成正比(即,您拥有的用户越多,所有这些用户都必须处理对中央数据库的更改!)您可以在某种程度上减轻这种影响通过添加更多层(从一个中心集线器扩展到半共享集线器到各个数据库),但这也增加了实际的复杂性。

您的分享是如何组织的?您可以做的是为每个" share"设置一个共享的数据库。组合

当用户A想要与用户B共享文档D时,"移动"将文档放入新的数据库AB中。实际上这意味着:将D的内容复制到新文档D'在数据库AB中,然后从数据库A中删除原始D。

这是如何同步的?

请记住,PouchDB客户端可以复制到多个源数据库,因此用户A将从A和AB复制,而用户B从B和AB复制。诀窍是在相反方向使用过滤复制,返回服务器数据库:

现在共享的文件D'永远不应该去数据库A或数据库B,同样,非共享文档X永远不应该转到数据库AB。像这样:

┌───────────────────────┐                                  
│  server:5984/user_a   │                                  
└───┬───────────────▲───┘                                  
    └─┐           ┌─┘    ┌──────────────────────────────┐  
      │           ●──────│ if (doc.shared_with == null) │  
    ┌─▼───────────┴─┐    └──────────────────────────────┘  
    │     local     │                                      
    └──▲──────────┬─┘                                      
     ┌─┘          └─┐      ┌──────────────────────────────┐
     │              ●──────│ if (doc.shared_with == 'ab') │
 ┌───┴──────────────▼────┐ └──────────────────────────────┘
 │ server:5984/shares_ab │                                 
 └───────────────────────┘              

因此,假设已经设置了共享数据库,当本地客户端想要共享某些数据时,它实际上将_deleted:true添加到原始(非共享)文档并创建新的(共享)文档。已删除的原始文件将传播到服务器上的user_a数据库,并且创建的副本将传播到shares_ab。

然后,取消共享工作几乎相同:客户端将_deleted:true添加到共享文档,并在新的非共享副本中重新创建数据。从B&B的角度来看,该文件一旦出现在shares_ab中就出现了,现在已经消失了,因为它已从shares_ab中删除。

(而不是用户"对"您可以将其扩展到特定的用户组,或者将其简化为用户已经在的特定组,或者诸如此类的。具体的想法是创建一个需要每个唯一共享上下文的共享数据库。)

答案 1 :(得分:2)

因此,对于此类项目,每用户数据库是数据库的推荐模式。

基本上,你将拥有:

  • 每个用户一个私人数据库(具有写入/读取权限)
  • 一个中央数据库只读

对于中央数据库,您需要它是只读的,并且您还需要仅允许共享文档。你需要某种应用程序代理。您基本上可以在中央数据库之上构建API,并且只允许访问共享文档。

然后,您可以设置从每个用户数据库到中央数据库的复制,并在_replicator数据库中保留de replication。

couchperuser

我不确定每用户数据库插件目前是否与2.XX版本一起工作但您可以通过某种应用程序进程自己完成(创建用户,然后创建数据库,然后管理新数据库的权限)