2017-08-17 52 views
6

我很新的CouchDB的,我想知道我怎麼可以創建ID的那個樣子。如何在couchdb文檔中生成部分唯一且順序的字段?

Employee:DBX-**0001**-SP

數部必須是唯一的和順序的。我如何在couchdb中實現這樣的功能?我搜索了所有,我找不到任何簡單的解決方案。

這將是最好的,如果我可以生成在CouchDB中在客戶機側的連續部分,而不是避免複製過程中的碰撞。

我現在的解決方案是我檢索存儲的文檔,看起來像這樣{「_id」:「EmployeeAutoIncrement」,value:1}檢索時,我遞增值並將其發送回服務器if這些都是成功的話,我返回新增加值,並把它作爲我的自動遞增值是ID員工的一部分:DBX- AUTO_INCREMENT_VALUE_HERE -SP

這樣做的問題是,如果兩個人做出的請求EmployeeAutoIncrement在同一時間,他們都更新它會不會導致衝突?另外,如果一個人提出請求而他們離線,他們又回到網上,那麼這不會導致衝突嗎?

+0

如果我是你,我會嘗試通過'JSON.stringify(new Date())'作爲自動增量使用UTC日期。這是獨特的,連續的,作爲獎勵存儲創建的日期。我不確定在服務器端如何做到這一點,所以可能會有多個客戶端試圖在同一毫秒內創建文檔的問題。如果由於已經存在_id而導致失敗,那麼您可以重試一次,這應該解釋大多數情況。 –

+0

對不起,但我不明白如何從中得到序列號。它應該是像0001 0002 0003 0004 0005這樣的順序。請詳細說明JSON.stringify(new Date())會給我帶來怎樣的結果0001 0002 ... –

+0

它不會給你一個沒有間隙的序列,但它很容易被排序按照升序排列,如果這就是你所需要的 –

回答

1

它可以(在某種程度上)來完成,但我建議你考慮一下你的設計選擇,你爲什麼要這樣做了分佈式數據庫 - 它可能是客戶端,你可以控制序列化到你的序列上做得更好發電機。

如果你想這樣做,至少部分地在服務器上,您將需要一個所謂的CRDT計數器的實現,如下面的文件中提出:

http://hal.upmc.fr/docs/00/55/55/88/PDF/techreport.pdf

你可以找到一個Ruby實現的一些這些想法在這裏:

https://github.com/aphyr/meangirls

和一個簡單的具體沙發的實現計數器(一個你需要的)和一個設置在這裏:

https://github.com/drsm79/couch-crdt

後者,而用Python寫的,會做一切你想要什麼,如果你遵循下面的示例所示的模式:

https://github.com/drsm79/couch-crdt/blob/master/examples/counter.py

,這將給你你的單調序列。從那裏,創建你的文檔_id。

翻譯成JavaScript和PouchDB作爲練習留給讀者。使用多個客戶,其中一些可能是離線時

+0

雖然我還沒有很好的解決方案,但您確實提供了很多有用的鏈接,這些鏈接爲我提供了一些想法。因此我選擇給你賞金的原因。非常感謝! (y)的 –

2

所有的要求不能得到滿足的客戶端。

這是一個過程,導致在單調增加ID:

  1. 每個客戶節省了一個獨特的ID的記錄。記錄應該包括一個標記爲臨時記錄的標誌。
  2. 建立一個external process,它會監聽changes feed中標記爲臨時的記錄。按「應用程序的時間順序」更改feed輸出記錄。
  3. 外部過程應使用正確的標識創建新記錄,並將其標記爲永久標記。由於只有該進程會創建「永久」記錄,因此它可以讀寫EmployeeAutoIncrement值而不會產生衝突。
  4. 外部進程可以刪除臨時記錄。

數據庫的記錄數會增加一倍,所以它的增長速度會更快,如果空間有問題,就需要儘快壓縮。如果在外部進程添加新記錄時運行查詢,則員工記錄上的任何查看/查詢都需要檢查永久標誌。

相關問題