如何构造CouchDB的示例

时间:2010-11-22 23:19:54

标签: couchdb structure

我正在寻找关于如何在CouchDB中存储和构建数据的良好示例/实践。

比权威指南中的博客应用程序更复杂一些。

让我们想象一下像Stack Overflow这样的应用程序。

  • 如何存储基本部分 - 用户,问题,答案,评论,标签,投票?
  • 您认为将数据划分到不同的数据库是个好主意吗?例如,将用户放在单独的数据库...或投票/标签上?
  • 或者不是因为在视图中你无法组合来自不同数据库的数据?

4 个答案:

答案 0 :(得分:2)

适用于在Relational数据库中构建数据的概念对于文档存储数据库同样有效。唯一真正改变的是,通常通过关系数据库上的连接完成的查询在NoSQL数据库中通常很麻烦。这意味着通常使用RDBM上的连接解决的一对多关系通常会在NoSQL数据库上涉及更多的非规范化。在一对多关系的典型示例中,例如该帖子上的博客帖子和评论,而不是在帖子的评论中有外键,您实际上会将帖子中的一些数据复制到评论中以避免额外的查询,你还会在帖子中保留一个评论ID列表(也可能是最近的10个评论团体)。

答案 1 :(得分:1)

我建议您将各个部分(用户,问题,答案,评论,标签,投票)作为单独的文档存储在一个数据库中。

没有。不要将它们存储在单独的数据库中。您将失去视图的力量,并且必须发出指数量的HTTP请求来收集数据。

-

结帐http://www.cmlenz.net/archives/2007/10/couchdb-joins。它真的为我讲述了这个问题。感谢Costa分享another question中的链接。

虽然这篇文章使用了无处不在的博客示例,但我相信方法#2带有“查看整理”是你想要的。

作为其他文档的子文档的文档将通过父级的“_id”属性进行链接。此外,您还将为文档提供“type”属性,以便在视图中返回时对其进行排序。例如:

function(doc) {
  if (doc.type == "post") {
    map([doc._id, 0], doc);
  } else if (doc.type == "comment") {
    map([doc.post, 1], doc);
  }
}

您将返回的是:

{
 "total_rows": 5, "offset": 0, "rows": [{
  "id": "myslug",
  "key": ["myslug", 0],
  "value": {...}
}, {
  "id": "ABCDEF",
  "key": ["myslug", 1],
  "value": {...}
}, {
  "id": "DEFABC",
  "key": ["myslug", 1],
  "value": {...}
}, {
  "id": "other_slug",
  "key": ["other_slug", 0],
  "value": {...}
}, {
  "id": "CDEFAB",
  "key": ["other_slug", 1],
  "value": {...}
}]
}

现在,您在一个HTTP请求中返回了所有数据,父级和子级。另外,您可以直接通过REST API对这些文档进行CRUD。在我看来,这正是你想要的。

您可以对具有一对多或多对一关系的任何内容应用相同的方法。

希望这有帮助!

答案 2 :(得分:0)

关于做'加入'在couchdb:

实际上,重复数据可能更有意义。这是我在couchdb中创建的视图示例:http://wamoyo.iriscouch.com/_utils/database.html?ideageneration/_design/IdeaGeneration/_view/challengesAndIdeas

这个简单的应用程序让人们进入挑战,然后让他们收集有关如何解决这些挑战的想法。它很好地转化为博客示例:挑战将是博客帖子,想法将是适合每篇博文的评论。

我已将此详细发布到此处的另一个问题:Couch DB Join operations like RDBMS

关于在couchdb中构建应用程序,Jason I正在玩同样的问题。 CouchDB提供了很大的灵活性,因此我不太确定是否应该使用节目和列表来显示数据,或者只是编写客户端代码来执行此操作,可能使用主干,然后只使用couchdb视图来提供模型。让我知道你提出了什么,我非常好奇。

答案 3 :(得分:0)

http://www.cmlenz.net/archives/2007/10/couchdb-joins中举例说明的模型有助于理解结构,但我对使用doc id的博客主题的方法有一点评论。如果两个用户具有相同的博客标题,则会导致冲突。我是couchdb的新手,但似乎doc doc和doc title应该是分开的,尽管能够使用/ blogName加载博客的挑战。这仍然可以通过结构来实现     {_id:6377738426gdjjsb,_rev:1- hsusubsvh6377,标题:BLOGNAME,AUTHORNAME:shakespeareND5}