我有一个问题,我一直在努力,现在回答了一段时间,但无法弄清楚:原则建模的CouchDB文档
如何设计,或瓜分,CouchDB的文件呢?
以博客文章为例。
半 “关系” 的方式做到这一点是创建几个对象:
- 后
- 用户
- 评论
- 标签
- 片段
这非常有道理。但我正在尝试使用couchdb(出于所有原因,它很棒)来模拟相同的事情,这非常困难。
大部分的博客文章给你一个简单的例子,如何做到这一点。他们基本上以相同的方式划分它,但是说你可以为每个文档添加'任意'属性,这绝对是很好的。所以你必须在CouchDB中是这样的:
- 后(与标签和片断“伪”车型在DOC)
- 评论
- 用户
有些人甚至会说你可以扔在那里的评论和用户,所以你有这样的:
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个层次,我想用相同的客户端(例如Rails上的Ajax或Flex)可视化我将从ActiveRecord,CouchRest或任何其他对象关系映射器呈现JSON的情况。有时我会得到整个站点结构的巨大XML文件,就像下面的文件一样,我需要将它映射到Value Objects以在我的Rails应用程序中使用,因此我不必编写其他序列化/反序列化数据的方式:
<pages> <page> <subPages> <subPage> <images> <image> <url/> </image> </images> </subPage> </subPages> </page> </pages>
所以一般CouchDB的问题是:
- 什么规则/原则,你用瓜分你的文件(关系等)?
- 可以将整个网站放入一个文档吗?
- 如果是这样,你如何处理具有任意深度级别的序列化/反序列化文档(如上面的大json示例或xml示例)?
- 或者您是否将它们转化为VO,您是否决定“这些内容过于嵌套到对象关系映射,因此我只能使用原始XML/JSON方法访问它们”?
非常感谢您的帮助,关于如何使用CouchDB分隔数据的问题一直很难说“这就是我应该从现在开始做的事情”。我希望很快到达那里。
我研究了以下网站/项目。
- Hierarchical Data in CouchDB
- CouchDB Wiki
- Sofa - CouchDB App
- CouchDB The Definitive Guide
- PeepCode CouchDB Screencast
- CouchRest
- CouchDB README
...但他们还没有回答这个问题。
哇你在这里写了一篇文章... :-) – Eero 2009-10-07 10:46:35
嘿,这是一个很好的问题 – elmarco 2009-10-07 19:43:29