CouchDB文档建模原则
我有一个问题,我已经尝试回答了一段时间了,但我想不出: 如何设计或划分CouchDB文档 以一篇博客文章为例 半“关系”方式是创建几个对象:CouchDB文档建模原则,couchdb,modeling,principles,Couchdb,Modeling,Principles,我有一个问题,我已经尝试回答了一段时间了,但我想不出: 如何设计或划分CouchDB文档 以一篇博客文章为例 半“关系”方式是创建几个对象: 职位 使用者 评论 标签 片段 这很有道理。但是我正在尝试使用couchdb(出于各种原因,它很棒)来建模同样的东西,这非常困难 大多数的博客文章都给出了一个简单的例子来说明如何做到这一点。他们基本上是用同样的方法来划分的,但是他们说你可以在每个文档中添加“任意”属性,这绝对不错。所以在CouchDB中会有类似的内容: Post(文档中带有“伪”模型
- 职位
- 使用者
- 评论
- 标签
- 片段
- Post(文档中带有“伪”模型的标记和代码片段)
- 评论
- 使用者
post{
身份证号码:123412804910820
标题:“我的帖子”
正文:“大量内容”
html:大量内容“
作者:{
姓名:“兰斯”
年龄:“23”
}
标签:[“样本”,“帖子”]
评论{
评论{
身份证号码:93930414809
正文:“有趣的帖子”
}
评论{
身份证号码:19018301989
正文:“我同意”
}
}
}
这看起来很好,很容易理解。我还了解如何编写视图,从所有帖子文档中提取评论,并将其放入评论模型中,用户和标记也是如此
但是我想,“为什么不把我的整个网站放在一个文档中呢?”
站点{
域名:“www.blog.com”
店主:“我”
页数{
页面{
标题:“博客”
职位{
职位{
身份证号码:123412804910820
标题:“我的帖子”
正文:“大量内容”
html:大量内容“
作者:{
姓名:“兰斯”
年龄:“23”
}
标签:[“样本”,“帖子”]
评论{
评论{
身份证号码:93930414809
正文:“有趣的帖子”
}
评论{
身份证号码:19018301989
正文:“我同意”
}
}
}
职位{
识别号:18091890192984
标题:“第二职位”
...
}
}
}
}
}
你可以很容易地制作视图,找到你想要的东西
那么我的问题是,您如何确定何时将文档划分为更小的文档,或者何时在文档之间建立“关系”
我认为如果这样划分的话,它会更“面向对象”,更容易映射到有价值的对象:
帖子{
职位{
身份证号码:123412804910820
标题:“我的帖子”
正文:“大量内容”
html:大量内容“
作者id:“Lance1231”
标签:[“样本”,“帖子”]
}
}
作者{
作者{
id:“1231”
姓名:“兰斯”
年龄:“23”
}
}
评论{
评论{
id:“评论1”
正文:“有趣的帖子”
邮政编码:123412804910820
}
评论{
id:“评论2”
正文:“我同意”
邮政编码:123412804910820
}
}
。。。但它开始看起来更像一个关系数据库。我经常会继承一些看起来像“文档中的整个站点”的东西,因此更难用关系来建模
我读过很多关于如何/何时使用关系数据库与文档数据库的文章,所以这不是本文的主要问题。我更想知道的是,在CouchDB中建模数据时,应用什么好的规则/原则
另一个例子是XML文件/数据。一些XML数据有10+层的嵌套深度,我想设想一下,使用与我从ActiveRecord、CouchRest或任何其他对象关系映射器呈现JSON相同的客户机(例如Rails上的Ajax或Flex)。有时我会得到整个站点结构的巨大XML文件,如下图所示,我需要将其映射到Rails应用程序中使用的值对象,这样我就不必编写其他序列化/反序列化数据的方法:
因此,CouchDB的一般问题是:
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
site {
domain: "www.blog.com"
owner: "me"
pages {
page {
title: "Blog"
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
post {
id: 18091890192984
title: "Second Post"
...
}
}
}
}
}
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author_id: "Lance1231"
tags: ["sample", "post"]
}
}
authors {
author {
id: "Lance1231"
name: "Lance"
age: "23"
}
}
comments {
comment {
id: "comment1"
body: "Interesting Post"
post_id: 123412804910820
}
comment {
id: "comment2"
body: "I agree"
post_id: 123412804910820
}
}
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
{"rows":[
{"key":["123412804910820", "post"], "value":null},
{"key":["123412804910820", "author", "Lance1231"], "value":{"_id":"Lance1231"}},
{"key":["123412804910820", "comment", "comment1"], "value":{"_id":"comment1"}},
{"key":["123412804910820", "comment", "comment2"], "value":{"_id":"comment2"}}
]}
?start_key=["123412804910820"]&end_key=["123412804910820", {}, {}]
?start_key=["123412804910820", "comment"]&end_key=["123412804910820", "comment", {}]
/db/_design/app/_list/posts/unified??start_key=["123412804910820"]&end_key=["123412804910820", {}, {}]&include_docs=true