2009-11-04 47 views
3

看来您无法在CouchDB中嵌套数据库。人们如何解决这个限制?例如,假设我想创建一个博客引擎,其中每个域都有一个单独的数据库。在每个数据库中,我可能需要一个用户数据库,一个订单数据库等来包含各种用户文档,订单文档等等。CouchDB中的嵌套数据库

最显而易见的方法似乎是一个扁平结构,其中数据库名称标定数据库嵌套级别之间的人为边界用连字号:

myblog.com-users 
myblog.com-posts 
myblog.com-comments 
anotherblog.com-users 
anotherblog.com-posts 
anotherblog.com-comments 
...hundreds more... 

另一种解决办法是保持较低级别的数据库和标记每个与顶层值记录:

用户含有文档User1的数据库,与现场实例=“测试”或场domain =“myblog.com”

回答

6

我想你在滥用术语数据库这里。没有理由不能将用户,帖子和评论数据存储在单个couchdb数据库中。您的couchdb视图可以从评论文档中分离出帖子文档中的用户文档。

用于在数据库的CouchDB用户文档示例地图功能:

function(doc) { 
    if (doc.type = 'user') { // only return user documents 
    emit([doc.domain, doc.id], doc); // the returned docs will be sorted by domain 
    } 
} 

看到View Api各种方法来限制由域视图结果使用startkey和endkey与视图归类。

+1

其实,我认为你滥用术语数据库。从CouchDB:最终指导:“对于严格的,CouchDB是一个数据库管理系统(DMS),这意味着它可以容纳多个数据库,数据库是容纳'相关数据'的存储区。当我在我的问题中提及数据库时,我并不是指CouchDB DMS的多个实例,而是指多个存储区来存储相关数据。由于数据库(存储区)旨在保存相关数据,因此您可以为所有域中的订单设置存储桶,或者可以为单个域中的用户和订单设置存储区。 – rcampbell 2009-11-05 09:43:49

+0

除了术语之外,使用Views来分隔用户文档,发布文档和评论文档的建议绝对与我的想法一致,即为每个文档使用一个鉴别器键/值对。对我来说,只是感觉像一个黑客必须说Post.domain = MyApp,User.domain = MyApp,Comment.domain = MyApp等等。很多数据重复。另外,将所有客户端数据分组在一起,只是觉得安全明智。视图中的漏洞可能会将一个客户端暴露给另一个客户端的数据。 – rcampbell 2009-11-05 09:49:17

+2

可能是我的错误选择。我的观点是,如果你想在一个数据库中有帖子评论和用户都完美的话。每个域有一个数据库可能是一个好主意,但如果你想整理或加入帖子和评论文件说,那么如果你把它们全部放在同一个数据库中,它会更容易。 – 2009-11-05 15:30:39

3

我认为最好的解决方案是每个域有一个数据库,每个数据库存储特定于域的数据。