我想生成用于CouchDB的ID。我希望ID按时间点按字母顺序递增,以便我可以在不保持单独的时间戳字段的情况下对id进行排序。我知道CouchDB将使用此属性生成id,但我不希望查询数据库的性能受到影响,我宁愿在我的服务器上运行算法。我将使用rfc 4112的实现,除了结果不是以词汇方式提升。我不应该这样做有什么好的理由:
(Date.now()) + 'x' + Math.round(Math.random() *1E18)
(我正在使用nodejs)。是否有使用非标准uuid或依赖javascript内置随机函数的成本?
答案 0 :(得分:2)
对于uuids,你有一些选择。
第一个选择是你想要_id生成的客户端(节点,浏览器等),还是沙发。听起来你想在客户端生成自己的uuid。那样就好。只需将函数的结果粘贴到保存到couchdb的doc的_id字段中即可。 Couch会使用它。
你可以让沙发创建id。如果您不为自己选择一个,则Couchdb仅生成_id。 Couchdb默认使用'顺序'uuid生成算法。您可以通过蒲团和配置将算法更改为其他人。有一个名为'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:
当您的文档ID出现时,CouchDB将具有最佳插入时间 不断增加,因为这最大限度地减少了对b~树的重写。这个 也会有所帮助 您的视图构建时间也是出于同样的原因,并且最大限度地减少了浪费的文档空间, 虽然在压实过程中也可以恢复。
所以你的算法和utc_random都应该没问题,因为他们的文档不断增加对看似有用的一个时间方向。
答案 1 :(得分:0)
我建议坚持使用CouchDB为您生成的UUID,但是您可以将服务器配置为使用utc_random,它将为您的记录排序时间戳前缀。