在couchdb中创建文档ID时的最佳做法是什么?

and*_*yuk 27 database-design couchdb

我们都知道,对于关系数据库,最好使用数字ID作为主键.

在couchdb中,生成的默认ID是UUID.最好是坚持使用默认值,还是使用用户在应用程序中使用的易于识别的标识符?

例如,如果您在couchdb中设计stackoverflow.com数据库,您是否会使用问题slug(例如,what-is-best-practice-when-creating-document-ids-in-couchdb)或每个文档的UUID ?

and*_*yuk 18

我不是沙发专家,但在做了一点研究后,这就是我发现的.

简单的答案是,使用UUID,除非你有充分的理由不这样做.

答案越长,取决于:

更改ID V的成本ID更改的可能性

更改成本低且可能更改ID

这方面的一个例子可能是具有非规范化设计的博客,例如jchris的博客(git hub上提供的沙发代码).

每当另一个网站链接到博客帖子时,这是对id的另一个引用,因此更改id的成本会增加.

更改ID和永远不会更改的ID的高成本

这方面的一个例子是任何使用自动增量ID进行高度规范化的数据库设计.Stackoverflow.com是一个很好的例子,它可以在每个URL中看到自动递增的问题ID.由于每个外键都需要更新,因此更改ID的成本非常高.

id会有多少引用或"外键"(关系数据库语言)?

任何"外键"都会大大增加更改ID的成本.必须更新其他文档是一个缓慢的操作,绝对应该避免.

ID有多大可能改变?

如果您不想使用UUID,您可能已经知道要使用的ID.

如果可能发生变化,更改ID的成本应该很低.如果不是,请选择其他ID.

想要使用容易记忆的ID的动机是什么?

不要说表现.

基准测试显示 "CouchDB的视图键查找几乎,但不完全,与直接文档查找一样快".这意味着必须进行搜索才能找到记录并不是什么大问题.不要仅仅因为您可以直接查找文档而选择友好ID.

你会做很多批量插入吗?

如果是这样,最好使用增量UUID以获得更好的性能.

查看有关批量插入的帖子.Damien Katz评论并说:

"如果你想拥有最快的插入时间,你应该给出_id的升序值,所以得到一个UUID并将其递增1,这样它总是插入索引中的相同位置,并且一旦你是处理大于RAM的文件.为了更容易地做同样的事情,只需按顺序对文件进行编号,然后使用填充使其固定长度,以便它们正确排序,例如"0000001"而不是"1".

  • 这个答案似乎取决于冲突避免总是可取的观念; 然而,有时冲突是问题领域的自然组成部分,而不是简单地避免,它们应该被主动检测和解决.在这种情况下,自然ID是一个很好的选择.例如,不要在大型​​多用户系统上使用博客文章的标题作为ID,但在建模DNS地址记录时请使用完全限定的域名和IP地址. (5认同)
  • 我知道这个答案很旧,当时是部分正确的。但现在这与推荐的相反。您不应该使用 UUID,除非您有充分的理由使用它们。如果您没有在多用户环境中创建大量文档,那么 new Date().toISOString() 是一个很好的默认值。 (3认同)

Tim*_*olo 6

从关系数据库的角度来看,我花了一些时间弄清了couchdb。但是事实与接受答案相反。

代替使用默认的uuid,生成智能ID可以极大地帮助您检索和排序数据。

假设您有一个数据库电影。所有文档都可以在URL / movies下的某个位置找到,但是究竟在哪里?

如果将带有_id Jabberwocky({“ _id”:“ Jabberwocky”})的文档存储到电影数据库中,则该文档将在URL / movies / Jabberwocky下可用。因此,如果将GET请求发送到/ movies / Jabberwocky,则将取回构成文档的JSON({“ _id”:“ Jabberwocky”})。

http://guide.couchdb.org/draft/documents.html

性能提示:如果您只是使用随机生成的文档ID,那么您不仅会错失获得免费索引的机会,而且还会增加建立索引的开销,而这些索引永远都不会使用。因此,请使用并滥用您的文档ID!

https://pouchdb.com/2014/05/01/secondary-indexes-have-landed-in-pouchdb.html

  • 这应该是公认的答案。如果您巧妙地利用“_id”进行查询,则无需创建会降低性能的额外索引。例如,如果您有具有唯一“uid”的不同“type”文档,并且还需要通过时间戳对它们进行排序,请创建一个“_id”,例如“${type}_${timestamp}_${uid}” 。 (2认同)