问题 对于拥有大量共享数据的用户,CouchDB每用户数据库方法是否可行?


我想实现一个webapp - 一个集成来自各种来源的数据并将其显示给用户的feed。用户应该只能看到他有权阅读的订阅源项(例如,因为它们属于他所属的项目)。但是,许多用户可能(并且将)可以看到提要项。

我真的很想使用CouchDB(主要是因为很酷的_changes feed和map / reduce视图)。我正在考虑将应用程序实现为纯粹的couchapp,但我遇到了权限模型的问题。 AFAIK,CouchDB中没有每个文档的权限,这通常使用每用户数据库和复制来实现。

但是当各个用户看到的内容之间存在很多重叠时,这会引入大量的开销......这些东西会在整个地方被复制并在许多数据库中重复出现。我喜欢这种方法的优雅,但是巨大的开销感觉就像一个交易破坏者...(假设我有50个用户,他们都看到相同的数据......)。

请问有什么想法吗?替代方案?


9607
2018-05-15 13:38


起源



答案:


您可以按照中所述强制执行读取权限 基于每个数据库的CouchDB授权

对于写入权限,您可以使用如上所述的验证功能 CouchDB的 权威指南 - 安全

您可以为每个项目创建数据库并在那里强制执行权限,然后在用户之间有效地共享所有数据。如果用户自己共享一个feed并且还需要权限,那么你可以让用户进入“项目”,这样就可以在任何地方应用相同的逻辑。

使用此设计,您可以为每个项目授予用户或一组用户(角色)。


7
2017-07-27 11:15



不幸的是,每个项目的权限模型对于我的需求来说不够精细(我需要一些用户才能看到属于某个项目的一些项目)。 - Tomas Brambora


答案:


您可以按照中所述强制执行读取权限 基于每个数据库的CouchDB授权

对于写入权限,您可以使用如上所述的验证功能 CouchDB的 权威指南 - 安全

您可以为每个项目创建数据库并在那里强制执行权限,然后在用户之间有效地共享所有数据。如果用户自己共享一个feed并且还需要权限,那么你可以让用户进入“项目”,这样就可以在任何地方应用相同的逻辑。

使用此设计,您可以为每个项目授予用户或一组用户(角色)。


7
2017-07-27 11:15



不幸的是,每个项目的权限模型对于我的需求来说不够精细(我需要一些用户才能看到属于某个项目的一些项目)。 - Tomas Brambora


除了(作为 victorsavu3 已建议)在您的应用程序和沙发之间的代理中处理您的读取身份验证,我只能想到其他两种选择。

首先是不关心,磁盘很便宜并且拥有多个数据副本可能看起来像是很多不必要的重复,但它大大简化了您的架构,并且您可以获得一些自动优势,例如轻松扩展以处理负载(通过移动一些您的用户的数据库关闭到其他服务器)。

其次是将共享数据拆分为不同的DB。这有时会限制你在视图中可以做的事情(例如,没有 “链接文件”)但在许多情况下这不是什么大问题。


4
2017-07-30 23:17



磁盘空间很便宜 - 是的,但在我的情况下,这最终会导致 地段 磁盘空间正在使用所以我决定不走这条路。拆分数据库 - 我也考虑过这一点......但我相信这会使这种方法比在处理身份验证的CouchDB上运行瘦服务器更复杂。 - Tomas Brambora
是的,这也是一个很好的解决方案。 - smathy