CouchDB - 连接数据的基本设计

时间:2011-04-17 18:00:47

标签: couchdb

只是玩弄CouchDb和CouchApp,这是多么神奇的技术!非常惊讶,接缝非常强大。经过阅读和阅读后,由于我是一位古老的关系数据库用户,我仍然质疑自己如何设计一些基本的东西。

这是我的问题:

1 /我有一个'用户'类型的文件和'item'类型的文件

2 /我的Couchdb包含以下文件:

{ "_id": "...", "type": "user", "email":"u1@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u2@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u3@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u4@gmail.com" ... }

{ "_id": "...", "type": "item", "title":"My title",
  created_by:"u1@gmail.com", modified_by:"u3@gmail.com" }

3 /现在我希望通过type = item和_id为每个用户(创建者和修饰符)提供信息来获取视图或其他东西

我在这里看到了一种模拟简单连接的方法:http://www.cmlenz.net/archives/2007/10/couchdb-joins

但是我不能适应它的两个连接,我几个小时就玩关键格式,测试很多东西,但没有任何作用。

我想,我错过了CouchDb map / reduce的重要内容,如果有人有帮助我会很感激。

PS:请勿回答我在'item'文档中插入'user'文档。这不是我的问题。

放松,放松......: - )

2 个答案:

答案 0 :(得分:2)

我认为你应该将_id放入created_bymodified_by

{ "_id": "u1", "type": "user", "email":"u1@gmail.com" ... }
{ "_id": "u2", "type": "user", "email":"u2@gmail.com" ... }
{ "_id": "u3", "type": "user", "email":"u3@gmail.com" ... }
{ "_id": "u4", "type": "user", "email":"u4@gmail.com" ... }

{ "_id": "anitem", "type": "item", "title":"My title",
  created_by:"u1", modified_by:"u3" }

因此您可以使用以下地图功能并使用?key="anitem"&include_docs=true进行查询:

function(doc) {
  if (doc.type === "item") {
    emit(doc._id, 1);
    emit(doc._id, { _id: doc.created_by });
    emit(doc._id, { _id: doc.modified_by });
  }
}

您可以阅读Jan Lehnardt's post about it了解详情。

作为旁注,我通常会将类型放在_id中,以便更容易获得唯一键,如果您只想按类型过滤,则不需要视图:

{ "_id": "user/username1", "email":"u1@gmail.com" ... }
{ "_id": "user/username2", "email":"u2@gmail.com" ... }
{ "_id": "user/username3", "email":"u3@gmail.com" ... }
{ "_id": "user/username4", "email":"u4@gmail.com" ... }

{ "_id": "item/itemid1", "title":"My title",
  created_by:"user/username1", modified_by:"user/username3" }

并且地图功能是

function(doc) {
  if (doc._id.slice(0, 4) === "item/") {
    emit(doc._id, 1);
    emit(doc._id, { _id: doc.created_by });
    emit(doc._id, { _id: doc.modified_by });
  }
}

更新:由于错误COUCHDB-1229,在/中使用doc._id可能会导致问题。根据您的使用情况,最好使用其他分隔符,例如:_

答案 1 :(得分:0)

你在这里说“两个连接”是什么意思?这是“tableA join tableB ON ...... AND ...”?

  

现在我想要一个视图或者其他东西来获取type = item和_id以及每个用户的信息来获取文档

这可以在没有两个/更多连接的情况下完成。 无论如何,我的建议是将您的数据分成2个数据库:items&用户。上面的例子只适合几个简单的任务。但是,当您的数据变得越来越大(比如10K用户和100K项目)时,处理您的数据变得非常困难,而且只有一个字段,所有文档彼此不同,这有点糟糕。