如何在couchdb文档中生成部分唯一且连续的字段?

时间:2017-08-17 08:33:16

标签: couchdb pouchdb

我对couchdb很新,我想知道如何创建看起来像的ID。

Employee:DBX-**0001**-SP

数字部分 0001 必须是唯一且顺序的。我怎样才能在couchdb中实现这样的功能?我搜遍了所有,我找不到任何简单的解决方案。

最好是我可以在couchdb中而不是在客户端生成顺序部分,以避免在复制过程中发生冲突。

我当前的解决方案是我在检索时获取一个我存储的文档,看起来像这个{“_ id”:“EmployeeAutoIncrement”,值:1}我增加值并将其发送回服务器,如果这些成功然后我返回新的递增值并将其用作我的自动增量值作为ID员工的一部分:DBX- AUTO_INCREMENT_VALUE_HERE -SP

这个问题是,如果有两个人同时向EmployeeAutoIncrement发出请求并且他们都更新它会不会导致冲突?此外,如果一个人发出请求并且他们离线然后他们又回到网上那么那也不会发生冲突吗?

2 个答案:

答案 0 :(得分:2)

使用多个客户端时,客户端无法满足所有要求,其中一些客户端可能处于脱机状态。

以下是结果以单调递增ID的过程:

  1. 每个客户端都会保存一个具有唯一ID的记录。该记录应包括将该记录标记为临时的标志。
  2. 构建一个external process,监听标记为临时的记录changes feed。更改源以“应用程序的时间顺序”输出记录。
  3. 外部进程应该使用正确的id创建一个新记录,将其标记为永久性。由于只有该进程创建“永久”记录,因此它可以读取和写入EmployeeAutoIncrement值而不会发生冲突。
  4. 然后,外部流程可以删除临时记录。
  5. 数据库的记录数量会增加一倍,因此如果空间有问题,它会更快地增长并需要更快地进行压缩。员工记录上的任何视图/查询都需要检查永久标志,以防在外部进程添加新记录时运行查询。

答案 1 :(得分:1)

它可以(有点)完成,虽然我建议您考虑一下您的设计选择以及为什么要在分布式数据库上完成这些操作 - 它可能在您可以控制序列化的客户端上做得更好你的序列发生器。

如果您想在服务器上至少部分地执行此操作,则需要实现所谓的CRDT计数器,如下文所述:

http://hal.upmc.fr/docs/00/55/55/88/PDF/techreport.pdf

您可以在这里找到其中一些想法的Ruby实现:

https://github.com/aphyr/meangirls

和一个简单的Couch特定的计数器实现(你需要的)和一个集合:

https://github.com/drsm79/couch-crdt

后者虽然是用Python编写的,但如果按照以下示例中所示的模式执行,则几乎完全符合您的要求:

https://github.com/drsm79/couch-crdt/blob/master/examples/counter.py

会给你单调的序列。从那里,创建您的文档_id。

翻译成JavaScript和PouchDB留给读者练习。