我正在尝试通过简单的RSS阅读器Web应用程序来学习CouchDB。要求是:
对于每个Feed,维护数据库中最近50篇文章的列表
每次订阅的Feed都会向用户添加新内容时,用户应获得更新。
在阅读了各种指南之后,Principles for Modeling CouchDB Documents这是一个很好的相关问题,这就是我想象它的结构:
饲料
文章
用户
然后对于每个用户,我将创建一个包含Feed的文章的视图,并将标签添加到其中以便在ui中显示它。
我在这里走在正确的轨道上吗?你会如何构建这个?
答案 0 :(得分:0)
我认为您的设计不适合CouchDB。特别是,因为在我看来,你需要更新用户文档(主要是更新文章标签),用户文档会随着时间的推移而变得非常大。
RSS阅读器模型中的交互实际上使这个问题不适合CouchDB。您必须保留每个用户标签,并且您(a)不希望将它们保留在用户文档中,因为您必须始终更新用户文档,并且(b)不希望将它们保留在文章中文档,因为您必须始终更新文章文档。
我认为我的理想解决方案将涉及每用户数据库;这将使问题容易处理。您有饲料文档和文章文档,您可以在文章文档中保留用户标记。有很多重复(因为你必须在每个用户数据库中存储文章),但至少它很容易(并且相对快速)查询。
答案 1 :(得分:0)
正如您可能已经看到的,NoSQL完全基于使用场景的妥协。在某些时候,您将不得不编写视图和查询,并且没有一种设计适合所有人。
在您的方案中,您已经说过每个Feed只会包含最新的50篇文章,因此文章将很快变得无关紧要(与之相关的任何数据也是如此)。因此,如果您将标记存储在用户模型中,则必须三次更新用户对象:用户标记文章时为1
,用户删除标记时为2
,3
当文章变得陈旧并被删除时。 3
是不可避免的。
最好在文章中存储标签,以便将它们与文章一起删除。
饲料
文章
用户
您可以看到我正在存储按用户分组的标签。如果您认为这有助于处理(根据您的过滤要求),您也可以执行反向{ "user1" : "tag1", "user2" : "tag1", "user3" : "tag2", "user4" : "tag2", ... }
。