CouchDB博客应用程序
我已经阅读了《CouchDB-权威指南》和网上的许多文章。 我已经了解沙发是如何工作的,但一些问题仍在我脑海中 假设使用一个简单的博客应用程序: 在post页面中,我想显示post的数据和作者的数据。 所以我想我必须把所有的东西都放在同一份文件里。 好啊 如果我只需要在一个页面中显示作者的数据,我可以使用视图来完成。 嗯 但是如果作者更新了他的数据,我需要更新作者出现的每个文档吗? 还是我错了 我真的很想理解这个逻辑CouchDB博客应用程序,couchdb,Couchdb,我已经阅读了《CouchDB-权威指南》和网上的许多文章。 我已经了解沙发是如何工作的,但一些问题仍在我脑海中 假设使用一个简单的博客应用程序: 在post页面中,我想显示post的数据和作者的数据。 所以我想我必须把所有的东西都放在同一份文件里。 好啊 如果我只需要在一个页面中显示作者的数据,我可以使用视图来完成。 嗯 但是如果作者更新了他的数据,我需要更新作者出现的每个文档吗? 还是我错了 我真的很想理解这个逻辑 提前感谢。是的,您需要更新每个文档。这样的想法是,像这样的大更新是罕见的,所以
提前感谢。是的,您需要更新每个文档。这样的想法是,像这样的大更新是罕见的,所以即使它们在计算上很昂贵,你也不应该做很多 一些信息可以留在同一个文档中,在大多数情况下,这些信息都可以正常工作
{
"title": "Blog Article Title",
"content": "... blah blah blah ...",
"author": {
"name": "someguy",
"email": "someguy@foo.bar"
},
"type": "post"
}
其他时候,您可以使用另一个文档的\u id
,在这两个文档之间创建链接
{
"_id": "...",
"title": "Blog Article Title",
"content": "... blah blah blah ...",
"author": "someguy",
"type": "post"
}
{
"_id": "someguy",
"name": "Some Guy",
"email": "someguy@foo.bar",
"type": "author"
}
乍一看,您需要两个单独的查询来检索这两个实体。然而,视图查询可以公开一个很好的小技巧
function (doc) {
if (doc.type === "post") {
emit([doc.title, 0], null); // output the main post
emit([doc.title, 1], { _id: doc.author }); // output the author
}
}
您的视图将输出此结果:(注意视图的排序方式)
这并不是很有用,但如果将include\u docs=true
添加到视图URL,您将得到以下结果:
{ ...
"rows": [
{
"key": ["Blog Article Title", 0],
"value": null,
"doc": {
"_id": "...",
"title": "Blog Article Title",
"content": "... blah blah blah ...",
"author": "someguy",
"type": "post"
},
},
{
"key": ["Blog Article Title", 1],
"value": { "_id": "someguy" },
"doc": {
"_id": "someguy",
"name": "Some Guy",
"email": "someguy@foo.bar",
"type": "author"
}
}
]
}
现在这两个实体都包含在1个查询中。:)
查看CouchDB中有关实体关系的更多信息。Ok,谢谢。将作者的数据存储在一个单独的文档中并单独加载是否有意义?(在post文档中仅存储作者的id-SQL样式)
{ ...
"rows": [
{
"key": ["Blog Article Title", 0],
"value": null,
"doc": {
"_id": "...",
"title": "Blog Article Title",
"content": "... blah blah blah ...",
"author": "someguy",
"type": "post"
},
},
{
"key": ["Blog Article Title", 1],
"value": { "_id": "someguy" },
"doc": {
"_id": "someguy",
"name": "Some Guy",
"email": "someguy@foo.bar",
"type": "author"
}
}
]
}