PouchDB:一個開源的 JS 數據庫
PouchDB 是一個受 Apache CouchDB 啟發的開源JavaScript數據庫,可以完美運行在瀏覽器中。設計初衷是,幫助Web開發者構建能在本地離線運行的App,一如在線時運行的一樣。
它能讓應用程序離線時存儲數據,并在回到線上時與服務器兼容,同步數據,保持用戶數據的同步。
什么是PouchDB?
PouchDB是 CouchDB 的JavaScript實現,目標是實現可以和CouchDB相媲美的API,可以在瀏覽器和Node.js運行。
什么是CouchDB?
CouchDB是由Damien Katz于2015年寫的NoSQL數據庫,現在由Apache軟件基金會負責維護。如果你是一個JavaScript開發者,你可能每天都在用CouchDB,因為它的核心技術驅動著 npm 。
Couchbase、CouchDB等都是什么?
現在,有兩個數據庫的血緣可以追溯到CouchDB:Couchbase,和Cloudant。他們都是從CouchDB分離出來的產品。
然而,這三種數據庫都是使用了相同的CouchDBsync協議。這意味著PouchDB可與這三個數據庫配合使用。
換句話說,這些數據庫像是電話運營商,而CouchDB同步協議是底層的基礎技術。
CouchDB的優勢:HTTP和sync
現在已經有這么多SQL、NoSQL數據庫了:MongoDB、PostgreSQL、MySQL等。那么為什么我們選擇實現CouchDB,而不是別的呢?
CouchDB的優勢有兩點:HTTP和sync。
HTTP:小而簡單的協議
當我們使用數據庫時,經常需要在數據庫和客戶端的應用之間寫類似轉換層的東西,將數據庫的查詢語句轉化成RESTful的HTTP調用。這些工作在編寫的每一個App中被一次次開發重復著。
CouchDB將我們拯救了出來!通過我們的客戶端App,可以直接和數據庫通訊。它使用HTTP作為主要的通訊方式,沒有特殊的協議,沒有特殊的驅動:只有REST和HTTP。你可以通過你的瀏覽器,curl或像Postman這樣的REST客戶端直接和CouchDB連接。
換句話說,CouchDB是真正“為Web而生的數據庫”。
Sync:CouchDB的殺手級特性
CouchDB另一個特性是,它從底向上都被設計成完全同步友好的數據庫。
舉個例子,如果你擔心客戶端應用的潛在危險,你可以直接在歐洲設一個CouchDB,再在北美搞一個,亞洲搞一個。在這些數據庫之間開啟雙向復制之后,客戶端就可以使用其中任何一個。
PouchDb使這一切都可以運行在你的瀏覽器里。
討論
PaulMest:我已經使用PouchDB作為React Native應用的數據庫6個月了,用SQLite數據庫作為后端的存儲,這樣我們就可以使用設備更多的存儲空間,而不只是50M。它工作得非常好,在一個離線緩存中維護數據,然后再同步到Digtal Ocean上的CouchDB 2.0。 讓它在React native里工作非常有挑戰性。讓我們的系統跟上PouchDB的更新也非常有挑戰性。實際上我們使用PouchDB 5.4.5,因為6.x版本中有breaking change,我還沒有時間去搞明白哪里不兼容。PouchDB社區(尤其是Nolan lawson)非常活躍,給出示例、聽取反饋回答問題等都非常積極。
ojanik:我們已經在產品環境中使用PouchDB大約15個月了。當初選擇它是因為這是一個綠色軟件,它給了我們兩個優勢:簡單的離線支持、實時同步功能,配合后端的程序很方便。因為這個東西實際上就是一個帶有本地緩存的Web App,部署新版本非常簡單。
在架構方面,我們有大約有250個用戶,每個都有獨立的Couch數據庫。我們還沒有評估Couch 2.0,使用的還是Couch 1.6.
然而,我們在使用的過程中,還是遇到了一些問題:
- 載入時間問題。當你從0開始載入一個數據庫時,非常耗時。初始化一個20-30M的數據庫大約會花15-30分鐘的時間,我們必須周期性地存儲dump的文件,這樣節省了一些時間。不過我覺得Couch2.0的同步協議已經解決了這個問題;
- 瀏覽器限制。當我們超過了瀏覽器的容量顯示(通常是iOS的Safari,50M),我們就不得不采取一些具有創造性的做法。現在我們的方案是,為每一個客戶運行兩個數據庫,一個是完整版本的數據庫,另一個只存在7-8天。Pouch向后者同步數據。我們在完整數據庫和臨時數據庫之間周期性地進行過濾復制。在客戶端,如果一個客戶需要7天之前的數據,就將Pouch切換到在線模式,作為一個庫從在線數據庫中取得數據;
- 處理沖突。因為CouchDB/PouchDB是分布式的,所以當用戶基于相同的數據版本做了更新時,得當心沖突;
- 自定義后端邏輯。因為Pouch直接與Couch連接,所以不能在需要時完自定義后端邏輯。我們必須引入一個REST后臺通道,以確保我們的后端在需要時運行額外的邏輯。
來自:http://blog.jobbole.com/109134/