Rya*_*yan 3 couchdb data-modeling
我正试着把头包起来CouchDB.我试图关闭的开关MongoDB来CouchDB,因为我觉得这个概念views更吸引我.在CouchDB它看起来所有记录都存储在一个数据库中.没有集合或任何东西的概念,比如MongoDB.因此,在存储不同的数据实体(如用户,博客帖子,评论等)时,如何在地图缩减功能中区分它们?我正在考虑使用某种type属性,对于每个项目,我只需要确保type始终指定.当我阅读CouchDB食谱网站时,这种思路有点强化,其中一个例子做同样的事情.
这是最可靠的方法,还是有更好的方法?我正在考虑替代方案,我认为唯一的另一种方法是尽可能多地将其嵌入到逻辑文档中.比如,数据库里面的直接记录都是User记录,每个记录User都有一个数组Posts,你可以在其中添加所有的记录Posts.这里的缺点是嵌入式文档不会得到自己的id属性,对吗?
使用type非常方便和创建时快views.或者,您可以考虑使用JSON文档的一部分.即,而不是定义:
{
type: "user",
firstname: "John",
lastname: "Smith"
}
Run Code Online (Sandbox Code Playgroud)
你将会拥有:
{
user: {
firstname: "John",
lastname: "Smith"
}
}
Run Code Online (Sandbox Code Playgroud)
然后在视图中发出包含user信息的文档,而不是使用:
function (doc) {
if (doc.type === "user") emit(null, doc);
}
Run Code Online (Sandbox Code Playgroud)
你会写:
function (doc) {
if (doc.user) emit(null, doc);
}
Run Code Online (Sandbox Code Playgroud)
如你所见,没有太大的区别.正如您已经意识到第一种方法是使用最广泛但第二种方法(afaik)被广泛接受.
关于将所有Posts一个存储User在一个单一文档中的问题.取决于您计划如何更新文档.请记住,每次更新时都需要编写整个文档(除非您使用attachments).这意味着,用户每次写入一个新的Post,你需要检索包含该文件array的Posts,添加/修改一个元素和更新文档.可能太多(沉重).