我有以下用例/应用程序:
一个TODO应用程序,用户可以:在TODO上CRUD(我正在使用pouchdb / couchdb同步)。几乎基于Josh Morony的tutorial
现在我想添加用户“分享”(仅发布,没有“编辑”/放置)他们的TODO项目与其他用户的能力,他们能够只查看(读取)那些(没有写访问权限)等)。
我正考虑添加一个单独的数据库(让我们称之为“共享TODO数据库”),我的服务器可以在其中编写,所有用户只能读取。 因此,任何用户都可能在该只读数据库中执行.find(),而在该服务器上发布时,仍然会受到服务器的控制,以便共享来自用户的TODO。
这是否有已知的模式(方法)?是否有任何真正的应用程序/示例已经这样做了?
答案 0 :(得分:9)
CouchDB没有提供这样做的好方法,但如果你的后端有维护大量共享数据库的工具(除了单用户数据库),我想你可以把它拉下来。
最初的冲动是使用连续过滤的复制到/来自中央主人"集线器,但这会给你带来两个问题:
您的分享是如何组织的?您可以做的是为每个" 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。
我不确定每用户数据库插件目前是否与2.XX版本一起工作但您可以通过某种应用程序进程自己完成(创建用户,然后创建数据库,然后管理新数据库的权限)