2012-04-02 152 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