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

Ser*_*nko 7 couchdb pouchdb

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

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

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

我正在考虑添加一个单独的数据库(我们称之为"共享TODO数据库"),我的服务器可以在其中编写,所有用户只能读取.因此,任何用户都可能在该只读数据库中执行.find(),而在此处发布时,仍然会在请求共享来自用户的TODO时由服务器进行管理.

这有一种已知的模式(方法)吗?有没有真正的应用程序/示例已经这样做了?

nat*_*evw 9

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

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

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

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

当用户A想要与用户B共享文档D时,将文档"移动"到新的数据库AB中.实际上这意味着:将D的内容复制到数据库AB中的新文档D',然后从数据库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 ?                                 
 ?????????????????????????              
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ale*_*ôté 5

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

主意

所以基本上,你将有:

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

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

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

沙发使用者

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