CouchDB文档建模原则

CouchDB文档建模原则,couchdb,modeling,principles,Couchdb,Modeling,Principles,我有一个问题,我已经尝试回答了一段时间了,但我想不出: 如何设计或划分CouchDB文档 以一篇博客文章为例 半“关系”方式是创建几个对象: 职位 使用者 评论 标签 片段 这很有道理。但是我正在尝试使用couchdb(出于各种原因,它很棒)来建模同样的东西,这非常困难 大多数的博客文章都给出了一个简单的例子来说明如何做到这一点。他们基本上是用同样的方法来划分的,但是他们说你可以在每个文档中添加“任意”属性,这绝对不错。所以在CouchDB中会有类似的内容: Post(文档中带有“伪”模型

我有一个问题,我已经尝试回答了一段时间了,但我想不出:

如何设计或划分CouchDB文档

以一篇博客文章为例

半“关系”方式是创建几个对象:

  • 职位
  • 使用者
  • 评论
  • 标签
  • 片段
这很有道理。但是我正在尝试使用couchdb(出于各种原因,它很棒)来建模同样的东西,这非常困难

大多数的博客文章都给出了一个简单的例子来说明如何做到这一点。他们基本上是用同样的方法来划分的,但是他们说你可以在每个文档中添加“任意”属性,这绝对不错。所以在CouchDB中会有类似的内容:

  • Post(文档中带有“伪”模型的标记和代码片段)
  • 评论
  • 使用者
有些人甚至会说,你可以把评论和用户放在那里,这样你就有了:


post{
身份证号码:123412804910820
标题:“我的帖子”
正文:“大量内容”
html:大量内容

“ 作者:{ 姓名:“兰斯” 年龄:“23” } 标签:[“样本”,“帖子”] 评论{ 评论{ 身份证号码:93930414809 正文:“有趣的帖子” } 评论{ 身份证号码:19018301989 正文:“我同意” } } }

这看起来很好,很容易理解。我还了解如何编写视图,从所有帖子文档中提取评论,并将其放入评论模型中,用户和标记也是如此

但是我想,“为什么不把我的整个网站放在一个文档中呢?”


站点{
域名:“www.blog.com”
店主:“我”
页数{
页面{
标题:“博客”
职位{
职位{
身份证号码:123412804910820
标题:“我的帖子”
正文:“大量内容”
html:大量内容

“ 作者:{ 姓名:“兰斯” 年龄:“23” } 标签:[“样本”,“帖子”] 评论{ 评论{ 身份证号码:93930414809 正文:“有趣的帖子” } 评论{ 身份证号码:19018301989 正文:“我同意” } } } 职位{ 识别号:18091890192984 标题:“第二职位” ... } } } } }

你可以很容易地制作视图,找到你想要的东西

那么我的问题是,您如何确定何时将文档划分为更小的文档,或者何时在文档之间建立“关系”

我认为如果这样划分的话,它会更“面向对象”,更容易映射到有价值的对象:


帖子{
职位{
身份证号码:123412804910820
标题:“我的帖子”
正文:“大量内容”
html:大量内容

“ 作者id:“Lance1231” 标签:[“样本”,“帖子”] } } 作者{ 作者{ id:“1231” 姓名:“兰斯” 年龄:“23” } } 评论{ 评论{ id:“评论1” 正文:“有趣的帖子” 邮政编码:123412804910820 } 评论{ id:“评论2” 正文:“我同意” 邮政编码:123412804910820 } }

。。。但它开始看起来更像一个关系数据库。我经常会继承一些看起来像“文档中的整个站点”的东西,因此更难用关系来建模

我读过很多关于如何/何时使用关系数据库与文档数据库的文章,所以这不是本文的主要问题。我更想知道的是,在CouchDB中建模数据时,应用什么好的规则/原则

另一个例子是XML文件/数据。一些XML数据有10+层的嵌套深度,我想设想一下,使用与我从ActiveRecord、CouchRest或任何其他对象关系映射器呈现JSON相同的客户机(例如Rails上的Ajax或Flex)。有时我会得到整个站点结构的巨大XML文件,如下图所示,我需要将其映射到Rails应用程序中使用的值对象,这样我就不必编写其他序列化/反序列化数据的方法:



因此,CouchDB的一般问题是:

  • 您使用什么规则/原则划分文档(关系等)
  • 将整个站点放在一个文档中可以吗
  • 如果是这样,您如何处理具有任意深度级别的序列化/反序列化文档(如上面的大型json示例或xml示例)
  • 或者,您是否不将它们转换为VO,而是决定“这些对象太过嵌套,无法进行对象关系映射,所以我将使用原始XML/JSON方法访问它们”
  • 非常感谢您的帮助,对于如何使用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"
            }
        }
    }
    
    
    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
        }
    }
    
    
    <pages>
        <page>
            <subPages>
                <subPage>
                    <images>
                        <image>
                            <url/>
                        </image>
                    </images>
                </subPage>
            </subPages>
        </page>
    </pages>
    {"rows":[
      {"key":["123412804910820", "post"], "value":null},
      {"key":["123412804910820", "author", "Lance1231"], "value":{"_id":"Lance1231"}},
      {"key":["123412804910820", "comment", "comment1"], "value":{"_id":"comment1"}},
      {"key":["123412804910820", "comment", "comment2"], "value":{"_id":"comment2"}}
    ]}
    
    ?start_key=["123412804910820"]&end_key=["123412804910820", {}, {}] ?start_key=["123412804910820", "comment"]&end_key=["123412804910820", "comment", {}] /db/_design/app/_list/posts/unified??start_key=["123412804910820"]&end_key=["123412804910820", {}, {}]&include_docs=true