我正在寻找关于如何在CouchDB中存储和构建数据的良好示例/实践。
比权威指南中的博客应用程序更复杂一些。
让我们想象一下像Stack Overflow这样的应用程序。
答案 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}