2012-04-02 50 views
2

我想要生成使用CouchDB使用的ID。我希望这些ID可以按时间上升,以便我可以在不保留单独的时间戳字段的情况下对id进行排序。我知道CouchDB将使用此属性生成id,但我不希望查询数据库的性能受到影响,我宁愿只在我的服务器上运行算法。除非结果不符合词汇提升,否则我会去执行rfc 4112。有没有什么好的理由我不应该这样做:生成lexographically上升的唯一ID

(Date.now()) + 'x' + Math.round(Math.random() *1E18) 

(我正在使用nodejs)。使用非标准uuid还是依赖于内建的随机函数的javascript会有什么代价?

回答

2

你有一些选择,当涉及到的UUID。

第一个选择是如果希望_id生成的客户端侧(节点,浏览器,等等。),或通过床。这听起来像你想在客户端生成你自己的uuid。没事儿。只需将你的函数的结果粘贴到保存到couchdb的doc文件的_id字段中即可。沙发只会使用它。

你可以有沙发创建ID。如果您不为自己选择一个,Couchdb将只生成一个_id。 Couchdb默认使用'顺序'uuid生成算法。您可以通过futon和config将算法更改为其他算法。有一个名为'uuids'的部分,带有'算法'键。你可以看到源在这里这些算法:

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功能非常相似,你的建议。但是如果你想要自己的,如果你认为你可以在服务器端添加算法并重新编译沙发。

你问题的第二部分是关于如何选择不同的算法的性能。我会从一个用户列表后引述戴夫Cottlehuber:

的CouchDB将有最好的插入时,当你的文档ID是 不断增加,因为这减少重写到B〜树。这个 也将有助于 您的视图编译时间出于同样的原因,也尽量减少浪费的文档空间,尽管这也可以在压缩期间恢复。

所以你的算法和utc_random都应该罚款,因为他们DOC IDS不断提高做的时间看似有用的一个方向。

0

我会建议与CouchDB的为您生成的UUID坚持,但你可以配置为使用utc_random将前缀时间戳,你可以通过你的记录进行排序的服务器。

http://wiki.apache.org/couchdb/HttpGetUuids

+0

有什么理由,但?这真是我的问题 - 什么是CouchDB(或任何其他)的实现正确,如果我自己离开,我可能会搞砸了? (我真的不想使用CouchDB的工具,因为这意味着很多额外的往返行程,特别是因为我可能在浏览器中生成ID) – josh 2012-04-03 13:04:34