我一直是reading a lot的best practices,我应该如何embrace the _id。老实说,如果我在开始扩展我的应用程序时不这样做,我可能会遇到种种偏执。
目前,每个数据库有大约5万个文档。只有几个月的大量使用。我希望这会增长很多。我做了很多.find()
芒果查询,没有很多索引;坦白地说,要处理关系样式的文档结构。
例如:
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
并能够知道正在经历什么类型,而不必每次文档更改时都获得每个文档听起来也很吸引人。
任何想法都会受到赞赏。
答案 0 :(得分:2)
设置数据库结构以使数据检索更容易 是一种好习惯。在我看来,您有一些选择:
project_id
的字段,则可以在project_id
上创建一个索引,使您可以廉价地获取与已知project_id相关的所有文档。参见CouchDB Find project_id
为键的MapReduce索引,例如if (doc.project_id) { emit(doc.project_id)}
。由此产生的索引将允许您在查询视图时明智地使用start_key
和end_key
来通过已知的project_id获取文档。参见Introduction to views _id
字段中,可以在_all_docs
端点上执行范围查询。如果您选择以下关键设计:
project{project_id}:signature{kuuid}
然后,数据库的主索引将单个项目的所有文档分组在一起。将project_id 放在之前是':'字符,是为即将推出的CouchDB功能(称为“分区数据库”)做准备,该功能将逻辑上相关的文档分组在各自的分区中,从而使在单个查询上执行查询变得更快,更容易分区,在您的情况下为项目。此功能尚未准备就绪,但{partition_key}:{document_key}
字段可能具有_id
格式,因此,在文档_ids着陆时为它准备好它没有任何危害(请参阅{{3} }!同时,将对_all_docs进行范围查询。