我有一个问题,我一直想回答一段时间了,但不能弄明白:
How do you design, or divide up, CouchDB documents?
以一篇博客文章为例。
半“关系”的方法是创建一些对象:
这就说得通了。但是我正在尝试使用 couchdb (出于所有这些原因,它很棒)来建模同样的事情,这是非常困难的。
大多数的博客文章都给出了一个简单的例子来说明如何做到这一点。它们基本上以相同的方式划分,但假设您可以向每个文档添加“任意”属性,这绝对是好的。所以在 CouchDB 中会有这样的东西:
有些人甚至会说你可以把评论和用户放进去,这样你就有了:
编号: 123412804910820
标题: 《我的职位》
主体: “许多内容”
Html: “ < p > 许多内容 ”
作者:
姓名: 兰斯
年龄: “23”
}
tags: ["sample", "post"]
意见{
评论{
编号: 93930414809
“有趣的帖子”
}
评论{
编号: 19018301989
body: "I agree"
}
}
}
That looks very nice and is easy to understand. I also understand how you could write views that extracted just the Comments from all your Post documents, to get them into Comment models, same with Users and Tags.
但随后我又想,“为什么不把我的整个网站放到一个单独的文档中呢?”:
域名: 「 www.blog.com 」
主人: “我”
页{
页{
标题: “博客”
职位{
后{
编号: 123412804910820
标题: 《我的职位》
主体: “许多内容”
html: "<p>Lots of Content</p>"
作者:
姓名: 兰斯
年龄: “23”
}
标签: [“ sample”,“ post”]
意见{
comment {
编号: 93930414809
“有趣的帖子”
}
评论{
编号: 19018301989
我同意
}
}
}
后{
id: 18091890192984
标题: “第二职位”
...
}
}
}
}
}
您可以很容易地使视图找到您想要的东西。
那么我的问题是,你如何决定什么时候把文档分成更小的文档,或者什么时候在文档之间建立“关系”?
我认为如果像这样划分的话,它会更加“面向对象”,并且更容易映射到值对象:
职位{
后{
编号: 123412804910820
标题: 《我的职位》
主体: “许多内容”
Html: “ < p > 许多内容 ”
Author _ id: “ Lance1231”
标签: [“ sample”,“ post”]
}
}
作者
author {
编号: Lance1231
姓名: 兰斯
年龄: “23”
}
}
comments {
评论{
Id: “ comment1”
“有趣的帖子”
Post _ id: 123412804910820
}
comment {
Id: “ comment2”
我同意
Post _ id: 123412804910820
}
}
但后来看起来更像是关系数据库。而且通常我继承的东西看起来像“文档中的整个站点”,所以用关系建模它更加困难。
我读过很多关于如何/何时使用关系数据库和文档数据库的文章,所以这不是主要问题。我更想知道的是,在 CouchDB 中建模数据时应用什么样的好规则/原则。
另一个例子是 XML 文件/数据。一些 XML 数据有10多个层次的嵌套,我想使用相同的客户端(例如,Ajax on Rails,或 Flex)可视化,我想呈现来自 ActiveRecord,CouchRestor 任何其他对象关系映射器的 JSON。有时候我会得到一个巨大的 XML 文件,它们是整个站点的结构,就像下面这个,我需要将它映射到 Value Objects,以便在我的 Rails 应用程序中使用,这样我就不必编写另一种序列化/反序列化数据的方法:
<pages>
<page>
< 子页 >
< 子页 >
< 图片 >
< 图片 >
< 网址/>
</image>
</page>
页 >
所以一般的 CouchDB 问题是:
非常感谢您的帮助,如何在 CouchDB 中划分数据的问题让我很难说“从现在开始我就应该这样做”。我希望很快就能到那儿。
我研究了以下网站/项目。
...but they still haven't answered this question.