我有一个问题已经尝试了一段时间,但无法弄清楚:
您如何设计或划分CouchDB文档?
以博客文章为例。
半“关系”方式是创建一些对象:
- 发布
- 用户
- 评论
- 标签
- 片段
这很有意义。但是我正在尝试使用couchdb(出于出色的所有原因)对同一件事进行建模,这非常困难。
那里的大多数博客文章都为您提供了一个简单的示例。他们基本上以相同的方式对其进行划分,但是说您可以在每个文档中添加“任意”属性,这绝对不错。因此,您在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"
}
}
}
看起来非常好,而且很容易理解。我也理解如何编写视图,该视图仅从所有Post文档中提取注释,以将它们放入Comment模型中,与Users and Tags相同。
但是后来我想:“为什么不将我的整个网站都放在一个文档中呢?”:
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
}
}
...但是随后它开始看起来更像一个关系数据库。通常,我继承一些看起来像“文档中的整个站点”的东西,因此使用关系进行建模更加困难。
我已经阅读了很多有关如何/何时使用关系数据库与文档数据库的内容,所以这不是这里的主要问题。我只是想知道,在CouchDB中对数据建模时,有什么好的规则/原则适用。
另一个示例是XML文件/数据。一些XML数据的嵌套深度超过10层,我想使用与从ActiveRecord,CouchRest或任何其他Object Relational Mapper渲染JSON相同的客户端(例如,Ajax on Rails或Flex)来可视化它。有时,我会得到庞大的XML文件,这些文件是整个网站结构的一部分,如下图所示,我需要将其映射到Value Objects以在Rails应用程序中使用,因此我不必编写另一种序列化/反序列化数据的方法:
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
因此,一般的CouchDB问题是:
- 您使用什么规则/原则来划分文档(关系等)?
- 可以将整个站点合并为一个文档吗?
- 如果是这样,您如何处理具有任意深度级别的序列化/反序列化文档(例如上面的大json示例或xml示例)?
- 还是不将它们转换为VO,是否只是确定“这些嵌套的对象与关系图太嵌套,因此我将仅使用原始XML / JSON方法访问它们”?
非常感谢您的帮助,关于如何使用CouchDB划分数据的问题让我很难说“这是我从现在开始应该做的事情”。我希望能尽快到达那里。
我研究了以下站点/项目。
...但是他们仍然没有回答这个问题。