类型属性是在CouchDB中存储不同数据实体的正确方法吗?

时间:2012-12-07 22:07:35

标签: couchdb data-modeling

我正试图绕过CouchDB。我正试图关闭MongoDBCouchDB因为我认为views的概念对我更有吸引力。在CouchDB中,所有记录都存储在单个数据库中。没有集合概念或任何东西,例如MongoDB。因此,在存储不同的数据实体(如用户,博客帖子,评论等)时,如何在地图缩减功能中区分它们?我正在考虑使用某种type属性,对于每个项目,我只需要确保始终指定type。当我阅读CouchDB食谱网站时,这种思路有点强化,其中一个例子做同样的事情。

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

1 个答案:

答案 0 :(得分:7)

创建type时,使用views非常方便快捷。或者,您可以考虑使用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)被广泛接受。

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