Couchdb架构:视图或文档?

时间:2013-05-12 18:16:00

标签: database database-design architecture couchdb rss-reader

我正在尝试通过简单的RSS阅读器Web应用程序来学习CouchDB。要求是:

  • 允许每个用户将X Feed导入其列表
  • 用户可以为每个Feed添加标签
  • 对于每个Feed,维护数据库中最近50篇文章的列表

  • 每次订阅的Feed都会向用户添加新内容时,用户应获得更新。

在阅读了各种指南之后,Principles for Modeling CouchDB Documents这是一个很好的相关问题,这就是我想象它的结构:

  • 饲料

    • 名称
    • 上次更新
  • 文章

    • FeedId
    • 标题
    • 文本
  • 用户

    • ID
    • 供稿:[feed1,feed2]
    • 标签:{funny:[article,article2]} //也许是一个带有#userid #articleid #tagname的新数据库?

然后对于每个用户,我将创建一个包含Feed的文章的视图,并将标签添加到其中以便在ui中显示它。

我在这里走在正确的轨道上吗?你会如何构建这个?

2 个答案:

答案 0 :(得分:0)

我认为您的设计不适合CouchDB。特别是,因为在我看来,你需要更新用户文档(主要是更新文章标签),用户文档会随着时间的推移而变得非常大。

RSS阅读器模型中的交互实际上使这个问题不适合CouchDB。您必须保留每个用户标签,并且您(a)不希望将它们保留在用户文档中,因为您必须始终更新用户文档,并且(b)不希望将它们保留在文章中文档,因为您必须始终更新文章文档。

我认为我的理想解决方案将涉及每用户数据库;这将使问题容易处理。您有饲料文档和文章文档,您可以在文章文档中保留用户标记。有很多重复(因为你必须在每个用户数据库中存储文章),但至少它很容易(并且相对快速)查询。

答案 1 :(得分:0)

正如您可能已经看到的,NoSQL完全基于使用场景的妥协。在某些时候,您将不得不编写视图和查询,并且没有一种设计适合所有人。

在您的方案中,您已经说过每个Feed只会包含最新的50篇文章,因此文章将很快变得无关紧要(与之相关的任何数据也是如此)。因此,如果您将标记存储在用户模型中,则必须三次更新用户对象:用户标记文章时为1,用户删除标记时为23当文章变得陈旧并被删除时。 3是不可避免的。

最好在文章中存储标签,以便将它们与文章一起删除。

  • 饲料

    • 名称
    • 上次更新
  • 文章

    • FeedId
    • 标题
    • 文本
    • 标签:{“tag-1”:[“user1”,“user2”,...],“tag2”:[“user3”,“user4”,...]}
  • 用户

    • ID
    • 供稿:[feed1,feed2]

您可以看到我正在存储按用户分组的标签。如果您认为这有助于处理(根据您的过滤要求),您也可以执行反向{ "user1" : "tag1", "user2" : "tag1", "user3" : "tag2", "user4" : "tag2", ... }