我有一个问题,我一直试图回答一段时间,但无法弄清楚:
您如何设计或分割 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 文档中提取评论的视图,以将它们放入评论模型中,与用户和标签相同。
但后来我想,“为什么不把我的整个网站放在一个文档中呢?”:
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 层,我想使用相同的客户端(例如 Ajax on Rails 或 Flex)来可视化它,我将从 ActiveRecord、CouchRest 或任何其他对象关系映射器呈现 JSON。有时我会得到整个站点结构的巨大 XML 文件,如下所示,我需要将其映射到值对象以在我的 Rails 应用程序中使用,这样我就不必编写另一种序列化/反序列化数据的方式:
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
所以一般的 CouchDB 问题是:
- 您使用什么规则/原则来划分文件(关系等)?
- 可以将整个网站放在一个文档中吗?
- 如果是这样,您如何处理具有任意深度级别的序列化/反序列化文档(如上面的大型 json 示例或 xml 示例)?
- 或者你不把它们变成 VO,你只是决定“这些太嵌套到对象关系映射,所以我将使用原始 XML/JSON 方法访问它们”?
非常感谢您的帮助,如何用 CouchDB 划分数据的问题让我很难说“从现在开始我应该这样做”。我希望能尽快到达那里。
我研究了以下站点/项目。
...但他们仍然没有回答这个问题。