【发布时间】:2017-08-17 08:33:16
【问题描述】:
我对 couchdb 很陌生,我想知道如何创建看起来像这样的 ID。
Employee:DBX-**0001**-SP
数字部分 0001 必须是唯一且连续的。我怎样才能在 couchdb 中实现这样的目标?我搜索了所有内容,但找不到任何简单的解决方案。
如果我可以在 couchdb 中而不是在客户端生成顺序部分,那将是最好的,以避免在复制过程中发生冲突。
我目前的解决方案是我获取一个我存储的文档,看起来像这样 {"_id": "EmployeeAutoIncrement", value: 1} 在检索时我增加值并将其发送回服务器,如果那些成功然后我返回新的增量值并将其用作我的自动增量值以成为 ID Employee:DBX-AUTO_INCREMENT_VALUE_HERE-SP
的一部分这样的问题是,如果两个人同时向 EmployeeAutoIncrement 发出请求并且他们都更新它会不会引起冲突?另外,如果一个人提出请求,然后他们下线了,那么他们又回来了,那不会也产生冲突吗?
【问题讨论】:
-
如果我是你,我会尝试通过
JSON.stringify(new Date())使用 UTC 日期作为自动增量。它是唯一的、连续的,并且作为奖励存储创建的日期。我不确定如何在服务器端完成此操作,因此多个客户端尝试在同一毫秒内创建文档可能会出现问题。如果由于 _id 已经存在而失败,您可以重试一次,这应该占大多数情况。 -
抱歉,我不明白如何从中获取序列号。它应该像 0001 0002 0003 0004 0005 这样的顺序。请详细说明 JSON.stringify(new Date()) 将如何给我 0001 0002 ...
-
它不会给你一个没有间隙的序列,但如果你需要的话,它可以很容易地按升序排序
-
是的,我就是这么想的。好主意,但是...我确实需要一个没有间隙的序列,因为这是要求。顺便说一句,您的意思是我必须使用 unix 时间戳作为序列还是完整的 UTC 日期字符串?
-
@ManiMuridi 如果你想显示正确的数字并有分区的客户端,你试图违反 CAP 定理。你必须找出你的要求的优先级。