你如何设计或划分CouchDB文档? 以博客文章为例。
半“关系型”的方法是创建几个对象:
- 帖子
- 用户
- 评论
- 标签
- 片段
这非常有道理。 但是我正在尝试使用CouchDB(因为它的很多优点)来模拟相同的东西,结果非常困难。
大多数博客文章都会给你一个简单的示例。 它们基本上以相同的方式分割它,但是说您可以向每个文档添加“任意”属性,这绝对很好。 因此,在CouchDB中会有类似以下内容:
- 帖子(包含文档中的标签和片段“伪”模型)
- 评论
- 用户
有些人甚至会说,您可以将评论和用户放在其中,这样就会得到以下内容:
<code>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"
}
}
}</code>
那看起来非常漂亮,而且易于理解。 我还了解到,您可以编写视图,从所有帖子文档中提取评论,以将它们转换为评论模型,与用户和标签一样。但是我又想,"为什么不把我的整个网站放在一个文档中呢?"
<code>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"
...
}
}
}
}
}</code>
你可以很容易地使用这个来创建视图以查找想要的内容。那么我现在的问题是,如何确定将文档分成更小的文档,或者何时创建文档之间的“关系”?
如果按照这样的方式进行分割,它会更符合“面向对象”的设计,并且更容易映射为值对象:
<code>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
}
}</code>
...但是它开始看起来更像关系型数据库。而且通常我会继承一些看起来像“整站在一个文档中”的东西,所以用关系来建模更加困难。我已经阅读了很多关于何时使用关系数据库与文档数据库的文章,所以这不是主要问题。我更想知道,在建模CouchDB数据时应该应用什么样的良好规则/原则。
另一个例子是XML文件/数据。有些XML数据嵌套深度超过10级,我想使用相同的客户端(例如Ajax on Rails或Flex)来可视化它,就像渲染JSON从ActiveRecord、CouchRest或任何其他ORM一样。有时我会得到整个站点结构的大型XML文件,例如下面的文件,我需要将其映射到值对象中,以便在我的Rails应用程序中使用,这样我就不必编写另一种序列化/反序列化数据的方式:
<code><pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages></code>
所以一般的CouchDB问题是:
- 您使用什么规则/原则来划分文档(关系等)?
- 将整个站点放入一个文档中是否可以?
- 如果可以,您如何处理具有任意深度级别的序列化/反序列化文档(例如上面的大型JSON示例或XML示例)?
- 还是您不将它们转换为VO,只是决定“这些太嵌套了无法使用对象关系映射,因此我将使用原始的XML / JSON方法访问它们”?
非常感谢您的帮助,对于如何使用CouchDB划分数据的问题一直困扰着我,希望能尽快解决。
我研究了以下网站/项目。
...但它们仍未回答此问题。