您如何保证CouchDB文档中字段的唯一性?

时间:2011-08-27 00:54:02

标签: couchdb

正如它在锡上说的那样。我有一堆(比方说的)会员文件,我希望每个用户能够将他的文档上的电子邮件字段设置为他想要的任何内容,例如另一个文档中存在的电子邮件。如果我只是做一个检查插入,我很容易受到竞争条件的影响。是否存在“锁定”或插入然后检查的习惯用法?

2 个答案:

答案 0 :(得分:2)

唯一可靠的方法是创建一个具有唯一值作为doc id的文档。

答案 1 :(得分:1)

正如另一个答案所指出的那样,CouchDB中唯一保证唯一的字段是_id。

你可以在这里借用复制器的技巧。为了在同一个两台主机之间快进第二次复制,它会写一个检查点文档,该文档记录它最后到达的更新顺序。但是它如何在未来找到检查点文件?像这样;

“_ id”:md5(source.host + source.port + target.host + target.port)

可以提取一般模式,其中您的唯一字段构成了ID本身的一部分。通过md5运行它们可以保证固定长度的标识符。

在您的情况下,您可以使用电子邮件地址作为您的身份。

更改其中一个字段是一个两步过程,但仍保留唯一性属性。

  1. 将文档复制到新ID(http://wiki.apache.org/couchdb/HTTP_Document_API#COPY)
  2. 如果成功,请删除旧的(http://wiki.apache.org/couchdb/HTTP_Document_API#DELETE)
  3. 步骤1和步骤2之间的崩溃将保留旧文档,因此您可能希望在新文档中添加对旧文档的引用。然后,您可以创建这些反向引用的视图,并定期执行清理扫描。

    所有这一切,CouchDB故意只支持一个唯一字段,而不是典型的RDBMS,它可以支持精细的关系约束,以便解决方案在集群中干净地扩展(c.f,BigCouch)。在您的情况下,电子邮件地址必须是唯一的,我所说的大部分内容都应该有效(电子邮件地址不会经常改变),但显然这是在一定程度上向上游游泳。

    HTH, 乙