当前位置: 首页 > 知识库问答 >
问题:

在CouchDB上建模文档之间的关系?

东门茂实
2023-03-14

在阅读了关于EntityRelationship的CouchDB wiki之后,我确定设置关系文档可能是最好的解决方案

{
    "_id": "2600emu",
    "type": "game"
}
{
    "_id": 123,
    "title": "Emulators",
    "user_id": "dstaley",
    "type": "list"
}
{
    "_id": "98765456789876543",
    "type": "relationship",
    "list_id": 123,
    "game_id": "2600emu"
}

但是,据我所知,这不允许我在一个请求中获得列表的元数据和游戏的元数据。有什么建议吗?

共有1个答案

夏侯星洲
2023-03-14

很好的问题。您确定了使用“规范化”数据模型(带有链接的不同文档类型)是最佳模型的几个非常重要的原因:

  1. 用户<==>列表<==>游戏之间存在多对多关系。
  2. 一对多关系很容易在单个文档中表示,该文档对“多”部分使用容器,但它们会变得很大,并且可能会发生并发冲突。
  3. 扩展单文档模型以存储多对多关系是站不住脚的。
  4. 一般说来,文档不可变性非常适合并发系统。在CouchDB中,您完全按照您所提到的那样做,存储表示图中边的“write-once”文档,然后使用辅助索引重建所需的链接部分,并在单个API查询调用中获得所需的信息。

这里的解决方案是“地图端连接”(借用hadoop社区的说法),这也是对的。基本上,您希望使用映射输出中的不同行来表示不同的信息片段。然后,您可以使用范围查询(startkey/endkey)来查询所需的映射结果部分,以及“join”表的物化视图。然而,您在文档中没有发现的一个难题是:

以便视图行的排序如下:

["list_1"], null
["list_1", "game"], {"_id":"game_1234"}
["list_1", "game"], {"_id":"game_5678"}
["list_2"], null
["list_2","game"], {"_id":"game1234"}
["list_3"], null
...

将它与现有的数据模型放在一起,下面是一些(未经测试的)伪代码,应该可以实现这一目的:

function(doc) {
    if (doc.type=="list") {
        //this is the one in the one-to-many
        emit( [doc._id]),);
    }
    else if (doc.type=="relationship") {
        //this is the many in the one-to-many
        //doc.list_id is our foreign key to the list.  We use that as the key
        //doc.game_id is the foreign key to the game.  We use that as the value
        emit( [doc.list_id,'game'],  {'_id': doc.game_id});
    }
}   

最后,您可以使用startkey/endkey对其进行查询,以便获得所有您感兴趣的以list_id开头的行。它看起来像:

curl -g 'https://usr:pwd@usr.cloudant.com/db/_design/design_doc_name/_view/view_name?startkey=["123"]&endkey=["123",{}]&include_docs=true'
    null
 类似资料:
  • 主要内容:在CouchDB数据库中使用Fauxton创建文档,CouchDB使用cURL实用程序创建文档在CouchDB中,数据库的数据以文档的形式而不是表格存储。 在CouchDB数据库中使用Fauxton创建文档 要在CouchDB数据库中创建文档,请打开Fauxton url: 选择特定的数据库,假设在数据库:上创建文档,先点击数据库链接进入数据概览。 点击新文档(New Document),如下图所示: 然后就会打开一个页面,默认只有一个字段:,但是可以通点击”Add Field“来新增

  • 主要内容:CouchDB使用Fauxton删除文档,2. CouchDB使用cURL工具删除文档在本篇文章中,我们来学习如何删除 CouchDB 数据库中的文档。删除 CouchDB 数据库中的文档有两种方法,下面分别来看看如何操作。 CouchDB使用Fauxton删除文档 打开Fauxton url: 首先选择包含所有文档的数据库。这里是数据库“”中的所有三个文件: 选择要删除的文档,假设要删除ID为的文档,那么就点击ID为的这个文档进入详细信息,如下所示 - 在ID为的这个文档进入详细

  • 主要内容:1. 使用fauxton更新(编辑)文档,2. CouchDB使用cURL工具更新文档在本篇文章中,我们来学习如何编辑/修改 CouchDB 数据库中的文档。编辑/修改 CouchDB 数据库中的文档有两种方法,下面分别来看看如何操作。 1. 使用fauxton更新(编辑)文档 打开Fauxton url:http://127.0.0.1:5984/_utils 在创建文档后,还可以更新/更改/编辑文档。首先打数据库概览,里边有文档列表,如下表所示 - 点击想要修改的文档,例如点击

  • 我有3个模型:用户、宠物和诊所。 让我们假设表格:用户、宠物和诊所。关系是,一个用户可以有多个宠物,而一个宠物只有一个诊所。 在“Pets”表中,我有一个FK到用户id,另一个FK到诊所id。 我想做一些类似的事情: 在用户模型上,返回与用户关联的所有不同诊所。现在我只能做: 但我只想返回不同的诊所。 用户模态: 宠物模式: 有什么建议吗?

  • 模型(Model)之间存在各种各样的关系,如:一对一(One-To-One )、一对多(One-To-Many)等。模型间的关系本质上是对其代表的数据库中表之间的关系描述,通过这些关系可以实现数据库中表之间主/外键约束的创建。查询时也可以基于这些关系,生成在数据库中执行的连接查询或复合查询SQL语句。 关系/关联的使用 1.1 一对一(One-To-One)关联 1.2 一对多(One-To-Ma

  • 我是MongoDB的新手,我正在创建一个数据库来记录学生和学生在大学学习的课程。有三个集合,称为学生,科目和讲师。学生集合包含studentId、姓名、dob、email、Year。主题集合包含subjectId、subjectName、credits;讲师集合包含lecturerId、lectureName、speciliazation、contactNo、email。学生和学生收藏之间的关系是