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

问题描述:

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

唯一确定的方法是创建一个具有唯一值的文档作为文档ID。

+0

Hmmmm,所以它会工作,每当我设置字段,首先生成密钥(所以在上面的例子中'会员 - 电子邮件 - 亨里克@雅虎的规范版本。 com),然后用这个名字创建一个空文档,然后在字段改变的时候删除它? – Malvolio

+0

是的,这种方法将工作 –

正如其他答案所指出的,CouchDB中唯一保证唯一的字段是_id。

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

“_id”:MD5(source.host + source.port + target.host + target.port)

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

就你而言,你可以使用电子邮件地址作为你的ID。

更改这些字段之一是一个两步过程,但仍然保持唯一性属性。

  1. 该文件拷贝到其新的ID(http://wiki.apache.org/couchdb/HTTP_Document_API#COPY)
  2. 如果成功的话,删除旧的(http://wiki.apache.org/CouchDB的/ HTTP_Document_API#DELETE)

步骤1和2将离开老文件就可以了地方,所以你不妨参考的新文档中添加旧文档之间的碰撞。然后,您可以创建这些反向引用的视图并定期执行清理扫描。所有这一切说,CouchDB故意只支持一个唯一的字段,而不是一个典型的RDBMS,它可以支持精心设计的关系约束,以便解决方案在集群中顺畅地扩展(c.f,BigCouch)。在你的情况下,电子邮件地址必须是唯一的,我说过的大部分内容都应该工作(电子邮件地址不会经常改变),但显然这是上游游戏程度的一种。

HTH, B.

+0

我目前的计划是使用*临时*唯一性表,它使用电子邮件地址作为关键和当前时间作为唯一值。步骤是(a)创建唯一性条目,(b)通过电子邮件搜索主条目(无论如何我都需要该视图),(c)创建新的主条目,(d)删除唯一性条目。正确处理每个故障案例仅供读者参考。 – Malvolio

+0

如果你不做(d),那么你也不需要做(b)。 – OrangeDog