CouchDB-连接数据的基本设计

CouchDB-连接数据的基本设计,couchdb,Couchdb,只是在玩CouchDb和CouchApp,多么神奇的技术!非常惊讶,接缝非常有力。在玩了很多,读了很多书之后,作为一个老的关系数据库用户,我仍然在问自己如何设计一些基本的东西 我的问题是: 1/我有“用户”类型的文档和“项目”类型的文档 2/My Couchdb包含以下文档: { "_id": "...", "type": "user", "email":"u1@gmail.com" ... } { "_id": "...", "type": "user", "email":"u2@gmail.

只是在玩CouchDb和CouchApp,多么神奇的技术!非常惊讶,接缝非常有力。在玩了很多,读了很多书之后,作为一个老的关系数据库用户,我仍然在问自己如何设计一些基本的东西

我的问题是:

1/我有“用户”类型的文档和“项目”类型的文档

2/My 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获取文档,其中包含每个用户的信息(创建者和修改者)

我在这里看到了一种模拟简单连接的方法:

但我不能适应两个连接,我从几个小时开始就在玩密钥格式,测试了很多东西,但都不起作用

我想,我错过了CouchDb map/reduce的一些重要功能,如果有人能提供帮助,我将不胜感激

PS:不要回答我在“项目”文档中插入“用户”文档。这不是我的问题

放松,放松…:-)

这里的“两个连接”是什么意思?这是“表A和表B在…和…”上吗

现在,我需要一个视图或其他东西,通过type=item和_id获取文档,其中包含每个用户的信息

这可以在没有两个或更多联接的情况下完成。
无论如何,我的建议是将数据分为两个数据库:items和users。上面的例子只适合少数简单的任务。但是当你的数据越来越大(比如说10万个用户和10万个项目)时,处理你的数据就变得非常困难,而且你所有的文档都只有一个字段,这有点糟糕。

我认为你应该把
\u id
放在
创建的
修改的
中:

{ "_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\u 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 });
  }
}
你可以阅读更多细节

作为旁注,我通常将类型放在
\u 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 });
  }
}

更新:由于存在错误,在
文档中使用
/
。\u id
可能会导致问题。根据您的使用情况,最好使用另一个分隔符,例如

对不起,我想您不明白我的问题,或者您不明白CouchDB如何为视图中的文档编制索引。但是谢谢你的帮助。请参阅此链接:我想用2个外键做同样的事情。谢谢你的回答,已经在玩你的提示了。:-)是的,很好,我已经用你的第一个解决方案做了很多测试。我缺少的关键是,我们可以在map函数中发出()进一步的文档。但是,根据您对type/id技巧的第二个想法,我不明白您如何获取包含“user”文档的“item”文档?很抱歉,我的英语很差。type/id技巧只是关于如何选择
\u id
s的建议。使用CouchDB而不是序列号。我还习惯于将文档类型添加到
\u id
,因为它有助于避免冲突。哦,我只知道一个键可读性技巧;)但是在CouchDB的参考资料中,他们说:“除非你仔细知道你在做什么,否则不要修改密钥格式!”似乎我是个新手…:-)