我想生成用于 CouchDB 的 ID。我希望 ID 按时间顺序升序,以便我可以对 id 进行排序,而无需维护单独的时间戳字段。我知道 CouchDB 将生成具有此属性的 ids,但我不希望查询数据库的性能受到影响,我宁愿只在我的服务器上运行算法。我会采用 rfc 4112 的实现,除非结果不是按字典顺序升序。我有什么充分的理由不应该这样做:
(Date.now()) + 'x' + Math.round(Math.random() *1E18)
(我使用的是nodejs)。使用非标准 uuid 或依赖 javascript 内置随机函数是否会产生任何成本?
最佳答案
对于 uuid,您有一些选择。
第一个选择是如果您想要客户端( Node 、浏览器等)或沙发生成 _id。听起来您想在客户端生成自己的 uuid。没事儿。只需将函数的结果粘贴到保存到 couchdb 的文档的 _id 字段中即可。沙发只会用它。
您可以让 couch 创建 ID。如果您没有为自己选择一个 _id,Couchdb 只会生成一个 _id 。 Couchdb 默认使用“顺序”uuid 生成算法。您可以通过 futon 和 config 将算法更改为其他算法。有一个名为“uuids”的部分,其键为“algorithm”。您可以在此处查看这些算法的来源:
https://github.com/apache/couchdb/blob/master/src/couchdb/couch_uuids.erl
这里有关于它们的描述:
http://wiki.apache.org/couchdb/HttpGetUuids?highlight=%28utc%5C_random%29
如您所见,utc_random 函数与您的建议非常相似。但如果您想要自己的算法,如果您愿意,您可以在服务器端添加算法并重新编译沙发。
您问题的第二部分是关于选择不同算法的性能。我将引用 Dave Cottlehuber 在用户列表帖子中的一段话:
CouchDB will have best insert time when your doc ids are continually increasing, as this minimises rewrites to the b~tree. This will also help your view build time for the same reason, and also minimises wasted doc space, although that would also be recovered during compaction.
因此,您的算法和 utc_random 都应该没问题,因为它们的文档 ID 不断增加,以实现看似有用的时间方向。
关于node.js - 生成按字典顺序升序的唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982538/