CouchDB中的嵌套数据库

CouchDB中的嵌套数据库,couchdb,Couchdb,您似乎无法在CouchDB中嵌套数据库。人们如何克服这一限制?例如,假设我想创建一个博客引擎,其中每个域都有一个单独的数据库。在每个数据库中,我可能需要一个用户数据库、订单数据库等来包含各种用户文档、订单文档等等 显而易见的方式似乎是一种扁平结构,其中数据库名称用连字符分隔数据库嵌套级别之间的人工边界: myblog.com-users myblog.com-posts myblog.com-comments anotherblog.com-users anotherblog.com-posts

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

显而易见的方式似乎是一种扁平结构,其中数据库名称用连字符分隔数据库嵌套级别之间的人工边界:

myblog.com-users
myblog.com-posts
myblog.com-comments
anotherblog.com-users
anotherblog.com-posts
anotherblog.com-comments
...hundreds more...
另一种解决方案是保留较低级别的数据库,并用顶级值标记每个文档:


用户包含文档User1的数据库,带有field instance=“Test”或field domain=“myblog.com”

我认为您在这里误用了术语数据库。没有理由不能将用户、帖子和评论数据存储在单个couchdb数据库中。您的couchdb视图可以将用户文档从posts文档、comments文档中分离出来

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
  }
}

有关使用startkey和endkey以及视图排序限制按域查看结果的方法,请参阅。

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

实际上,我认为您误用了术语数据库。来自CouchDB:明确的Guid:“严格来说,CouchDB是一个数据库管理系统(DMS)。这意味着它可以容纳多个数据库。数据库是一个存储“相关数据”的存储桶。“当我在我的问题中提到数据库时,我指的不是CouchDB DMS的多个实例,而是多个存储桶来保存相关数据。因为数据库(bucket)是用来保存相关数据的,所以您可以为所有域的订单设置一个bucket,也可以为单个域的用户和订单设置一个bucket。除了术语,您建议使用视图来分隔用户文档、post docs、,注释文档完全符合我的想法,即为每个文档使用鉴别器键/值对。对我来说,不得不说Post.domain=MyApp、User.domain=MyApp、Comment.domain=MyApp等等,感觉就像是一个黑客。大量的数据重复。此外,将所有客户机数据分组在一起会让人感觉不安全。视图中的漏洞可能会将一个客户端暴露给另一个客户端的数据。我可能用词不当。我的观点是,如果你想把帖子、评论和用户都放在一个数据库中,那就太好了。每个域都有一个数据库可能是一个好主意,但是如果你想整理或加入帖子和评论文档,那么如果你把它们都放在同一个数据库中会更容易。“但是如果你想整理或加入帖子和评论文档”,这是一个非常好的观点