【问题标题】:Is a type property the correct way to store different data entities in CouchDB?类型属性是在 CouchDB 中存储不同数据实体的正确方法吗?
【发布时间】:2012-11-26 03:28:06
【问题描述】:

我正试图绕过CouchDB。我正在尝试将MongoDB 关闭为CouchDB,因为我认为views 的概念对我更有吸引力。在CouchDB 中,看起来所有记录都存储在一个数据库中。没有集合或任何东西的概念,例如MongoDB。那么,当存储不同的数据实体(如用户、博客文章、cmets 等)时,您如何在 map reduce 函数中区分它们?我正在考虑只使用某种type 属性,并且对于每个项目,我只需要确保始终指定type。当我阅读 CouchDB 食谱网站时,这种思路得到了一定程度的强化,其中一个示例做了同样的事情。

这是最可靠的方法,还是有更好的方法?我正在考虑替代方案,我认为唯一的其他替代方法基本上是尽可能多地嵌入到逻辑文档中。就像,数据库中的直接记录都是User 记录,每个User 都有一个Posts 数组,您只需将所有Posts 添加到其中。这里的缺点是嵌入式文档不会获得自己的id 属性,对吗?

【问题讨论】:

    标签: couchdb data-modeling


    【解决方案1】:

    在创建views 时使用type 方便快捷。或者,您可以考虑使用 JSON 文档的一部分。即,而不是定义:

    {
        type: "user",
        firstname: "John",
        lastname: "Smith"
    }
    

    你会:

    {
        user: {
            firstname: "John",
            lastname: "Smith"
        }
    }
    

    然后在视图中用于发出包含user信息的文档,而不是使用:

    function (doc) {
        if (doc.type === "user") emit(null, doc);
    }
    

    你会写:

    function (doc) {
        if (doc.user) emit(null, doc);
    }
    

    如您所见,差别不大。正如您已经意识到第一种方法是最广泛使用的,但第二种(afaik)被广泛接受。

    关于将一个User 中的所有Posts 存储在一个文档中的问题。取决于您计划如何更新文档。请记住,每次更新时都需要编写整个文档(除非您使用attachments)。这意味着每次用户编写新的Post 时,您都需要检索包含Postsarray 的文档,添加/修改一个元素并更新文档。可能太多(重)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 2022-08-13
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 2020-01-25
      相关资源
      最近更新 更多