2013-04-30 77 views
2

我有一個CouchDB數據庫,主要存儲文檔附件。Couchdb如何存儲重複的附件?

這些文件sored在DB與URL結構如下: /db-name/numeric-file-id/official-human-readable-file-name.ext

有永遠只有一個連接到一個文件。 今天我計算了所有文件的md5總和,似乎很多都是重複的。

我想知道如果couchdb知道重複的附件,並在內部只存儲某種指向文件的指針,並跟蹤引用計數,或只是簡單地存儲每個附件的原樣。

我的意思是,如果我把5個相同的100MB文件作爲附件,數據庫會使用100MB還是500MB?

回答

5

我也找不到一個直接的答案在文檔的CouchDB這個問題,所以我設計(使用CouchDB的1.4)一個簡單的實證檢驗:

實驗:

我逐漸加入3文件,每個文件具有幾個大的(多MB)附件,這些附件在文件之間是相同的。然後,我在每次插入文檔後檢查了生成的db.couch文件的磁盤大小。

結果:

的db.couch文件從8MB分別增加至16MB和24MB然後爲第一,第二和第三文件插入,。因此,CouchDB確實而不是似乎是在不同文檔上刪除相同的附件。在添加三個文檔後手動壓縮數據庫並沒有改變文件的大小,因此一些後臺維護過程不太可能會發現/修復這個問題。

缺乏固定的重複數據刪除是給出以下三點看法好奇遺漏:

  1. 作者而言足夠的瞭解有效地處理它們添加存儲附件的自動gzip壓縮大的附件(對於那些使用MIME指示某種文本內容的類型)。

  2. 添加附件會導致計算MD5摘要並與附件的元數據一起存儲。

  3. CouchDB的似乎刪除重複該仍被在DB(可能一個使用MD5摘要的)保持的相同文檔的多個轉數之間共享相同的附件。

考慮到這些因素,CouchDB在這方面並不更聰明,因爲這將是一個有價值的(可能)直接優化。