2010-11-22 62 views
4

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

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

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

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

回答

2

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

+0

TokenMacGuy,外键,你的意思是这篇文章的 “_id” 属性可以说仍与结构
实现的呢? 为了方便起见,您会将重复数据存储在评论对象中? 试图用Backbone.js实现,所以我真的在为Backbone的CRUD操作做准备。 – AndrewHenderson 2013-01-29 07:31:58

+0

是的,您可以通过将父项的ID添加到子项的属性来关联这两个文档。但不是,反规范化非常不方便,通常是为了表现; couchDB可能会将您保存在这里,但是有意见。 – SingleNegationElimination 2013-01-29 13:09:11

0

就干什么“加入” CouchDB中:

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

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

我已经在全面详细登载了这里的另一个问题:Couch DB Join operations like RDBMS

对于结构应用在CouchDB中,贾森我在玩同样的问题。 CouchDB提供了很多灵活性,所以我不太确定是否应该使用显示和列表来显示数据,或者只是编写客户端代码来执行此操作,或许使用backbone,然后使用couchdb视图来提供模型。让我知道你提出了什么,我会很好奇。

0

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

不要将它们存储在不同的数据库中。您将失去视图的力量,并且不得不使用大量的HTTP请求来收集数据。

-

退房http://www.cmlenz.net/archives/2007/10/couchdb-joins。它真的为我阐明了这个问题。在another question中分享链接Costa

虽然本文使用无处不在的博客示例,但我相信具有“视图归类”的方法#2是您想要的。

作为另一文档子项的文档将通过父项的“_id”属性进行关联。此外,您将为文档提供“类型”属性,以便在视图中返回时对其进行排序。例如:

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。在我看来,这正是你想要的。

您可以将相同的方法应用于具有一对多或多对一关系的任何事物。

希望这会有所帮助!

0

http://www.cmlenz.net/archives/2007/10/couchdb-joins中的示例模型对理解结构很有帮助,但对于文档ID使用博客主题的方法我有一点评论。如果两个用户拥有相同的博客标题,则会导致冲突。我是couchdb的新手,但似乎doc id和doc title应该是分开的,尽管可以使用/ blogName加载博客。 {:6377738426gdjjsb,_rev:1 hsusubsvh6377,标题:BLOGNAME,AUTHORNAME:shakespeareND5 _id}