CouchDB的按用户数据库方法是否适用于具有大量共享数据的用户?

12

我想实现一个Web应用程序——一个聚合来自各种来源的数据并向用户显示它们的动态信息流。一个用户只能看到他有权限阅读的动态内容(例如,因为这些内容属于他所在的项目)。然而,动态内容可能会被许多用户看到。

我真的很想使用CouchDB(主要是因为酷炫的_changes动态更新和map/reduce视图)。我考虑将应用程序作为纯couchapp实现,但我在权限模型方面遇到了问题。据我所知,CouchDB没有文档级的权限控制,通常使用基于每个用户数据库的复制来实现。

但当各个用户看到的内容之间存在很多重叠时,那就会引入大量开销......东西将被复制到各处,并在许多数据库中重复。我喜欢这种方法的优雅性,但是巨大的开销感觉像是一个不能接受的问题...(假设我有50个用户,他们都看到相同的数据...)

请问有什么解决方案吗?或者其他替代方案?

2个回答

8

您可以按照CouchDB基于数据库的授权中所述强制阅读权限。

对于写入权限,您可以使用验证函数,如CouchDB权威指南-安全性中所述。

您可以为每个项目创建一个数据库,并在那里执行权限,然后所有数据都有效地在用户之间共享。如果用户自己分享了一条信息,并且还需要对其进行权限控制,则可以将该用户变成“项目”,使相同的逻辑应用于任何地方。

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


很遗憾,按项目授权模型对我的需求来说不够细粒度(我需要一些用户仅能看到某个项目下的部分项目)。 - Tomas Brambora

4
除了(如victorsavu3已经建议的那样)在您的应用程序和couch之间使用代理处理读取授权外,我只能想到另外两个选择。
第一个选择是不要在意,磁盘很便宜,拥有多个数据副本可能看起来像是很多不必要的重复,但这极大地简化了您的架构,并且您可以获得一些自动好处,例如通过将一些用户的数据库移动到其他服务器来轻松扩展以处理负载。
第二个选择是将共享数据拆分为不同的数据库。这有时会限制您在视图中可以执行的操作(例如没有“链接文档”),但在许多情况下这并不是什么大问题。

1
磁盘空间很便宜 - 是的,但在我的情况下,这最终会导致使用大量的磁盘空间,所以我决定不走这条路。拆分数据库 - 我也考虑过这个问题...但我认为这会使这种方法比在CouchDB上运行一个轻量级服务器来处理身份验证更加复杂。 - Tomas Brambora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接