CouchDB-我应该将_id用于关联和_changes

时间:2019-01-21 03:16:53

标签: couchdb cloudant

我一直是reading a lotbest practices,我应该如何embrace the _id。老实说,如果我在开始扩展我的应用程序时不这样做,我可能会遇到种种偏执。

目前,每个数据库有大约5万个文档。只有几个月的大量使用。我希望这会增长很多。我做了很多.find()芒果查询,没有很多索引;坦白地说,要处理关系样式的文档结构。

例如:

  • 首先从ID获取项目。
  • 然后执行以下查找查询:
    • 将所有type:signature劫持到project_id: X
    • 将所有type:revisions劫持到project_id: X

原因是我非常努力地不更新文档。其中许多文档都是脱机创建的,因此一次写一次工作流程对于我避免冲突非常重要。

由于日程安排越来越紧张,我目前无处可退。如果我想改变现在的做事方式,那是疯狂之前的最佳时机。

我很想听听您关于使用_id进行数据结构设计和人们的想法的想法。

这样的_all_docs通话能力很吸引我:

{
  "include_docs": true,
  "startkey": "project:{ID}",
  "endkey": "project:{ID}:\ufff0"
}

如何设置一种类型的文档的示例如下:

主要文档

{
    _id: {COUCH_GENERATED_1},
    type: "project",
    ..
    .
}

签名文档

{
    _id: {COUCH_GENERATED_2},
    type: "signature",
    project_id: {COUCH_GENERATED_1},
    created_at: {UNIX_TIMESTAMP}
}

更改为主文档

{
    _id: {COUCH_GENERATED_3},
    type: "revision",
    project_id: {COUCH_GENERATED_1},
    created_at: {UNIX_TIMESTAMP}
    data: [{..}]
}

我想知道人们的意见正在做这样的事情:

主要文档_id: project:{kuuid_1}

签名文档_id: project:{kuuid_1}:signature:{kuuid_2}

更改为主文档_id: project:{kuuid_1}:rev:{kuuid_3}

我只是试图以一种将来不会惹恼我的方式来建立数据库。我知道会出现问题,但是如果可以避免的话,我不希望对结构进行大的改动。

我正在考虑的另一个原因是,我在数据库中监视_changes并能够知道正在经历什么类型,而不必每次文档更改时都获得每个文档听起来也很吸引人。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

设置数据库结构以使数据检索更容易 是一种好习惯。在我看来,您有一些选择:

  1. 如果感兴趣的文档中有一个名为project_id的字段,则可以在project_id上创建一个索引,使您可以廉价地获取与已知project_id相关的所有文档。参见CouchDB Find
  2. 创建一个以project_id为键的MapReduce索引,例如if (doc.project_id) { emit(doc.project_id)}。由此产生的索引将允许您在查询视图时明智地使用start_keyend_key来通过已知的project_id获取文档。参见Introduction to views
  3. 正如您所说,将更多信息打包到_id字段中,可以在_all_docs端点上执行范围查询。

如果您选择以下关键设计:

project{project_id}:signature{kuuid}

然后,数据库的主索引将单个项目的所有文档分组在一起。将project_id 放在之前是':'字符,是为即将推出的CouchDB功能(称为“分区数据库”)做准备,该功能将逻辑上相关的文档分组在各自的分区中,从而使在单个查询上执行查询变得更快,更容易分区,在您的情况下为项目。此功能尚未准备就绪,但{partition_key}:{document_key}字段可能具有_id格式,因此,在文档_ids着陆时为它准备好它没有任何危害(请参阅{{3} }!同时,将对_all_docs进行范围查询。