Node.js 數據存儲方式的選擇


如何為你的 Node.js 應用挑選數據庫


Node.js 應用一般有三種方式保存數據。

  1. 不使用任何數據庫管理系統(DBMS),把數據保存在內存里或直接使用文件系統。
  2. 使用關系數據庫。例如 MySQL, PostgreSQL.
  3. 使用非關系數據庫。例如 Redis,MongoDB,CouchDB, PouchDB

無服務器數據存儲 (Serverless Data Storage)

從管理上來說,第一種方式是最方便易用的。不需要安裝任何數據庫,直接使用內存和文件就行了。

無需數據庫的內存存儲就是使用變量保存程序的計算結果或者狀態。簡單來說就是程序的變量。這種方式適合存儲一些小的使用頻率很高的數據,因為它的存取速度非常快。但是一旦程序重啟或者服務器重啟,這些數據就會丟失。

文件存儲就是直接使用服務器的文件系統來保存數據。通常應用程序的配置信息都是使用這種方式。程序或服務器重啟都不會影響到這些數據。但是這種方式有並行的問題。比如一個多用戶的系統,兩個用戶同時讀寫一個文件就會造成一個用戶的數據被另外一個覆蓋。這個時候就應該使用數據庫來存儲數據了,數據庫可以更好地處理並行的問題。

關系數據庫 (RDBMS)

關系數據庫適合復雜信息的存儲和查詢。很多內容管理(CMS),客戶關系管理(CRM)和網絡商店使用這類數據庫。

不過這類數據庫需要專門的管理知識。一般都要安裝在單獨的服務器上,由專人(DBA)來管理。開發人員還需要懂得 SQL 語言。雖然有開發庫提供關系對象映射(ORM))的 API 供開發人員調用,不用直接寫 SQL 語句,但是最好還是得懂 SQL。

這里要提一下:不要使用微軟的 SQL Server,如果你是在 Linux 上使用 Node.js 開發的話。假如是使用 SQL Server 的認證方式還好說,但是一旦 SQL Server 要求使用 Windows Authentication/domain/NTLM 之類的認證就很麻煩。因為在 Linux 上兩個對 SQL Server 支持最好的 Node.js 驅動模塊 tedious 和 node-tds 都不支持這類認證,只有使用 odbc 這個模塊來調用 FreeTDS,但是這個模塊又沒多少人用,更新也慢,很多操作都要自己寫,所以不適合快速開發。我被迫這樣搞過一次,當時不知道是坑,耽誤不少時間。

關系數據庫里,MySQL 是最流行的,Node.js 的支持也很好。另外一個流行的關系數據庫是 PostgreSQL, 穩定而且標准兼容性好。它和 MySQL 的主要區別就是, PostgreSQL 支持遞歸查詢和特別的數據類型,還支持 LDAP 和 GSSAPI 認證方式。不過 PostgreSQL 對 Windows 支持很差,Windows 上就不要用它了。

還有一個非常受歡迎的輕型關系數據庫 SQLite。C 寫的,異常小巧(400KB 左右),小到不用單獨的進程來運行,可直接運行在程序里。SQLite 是一種前面提到的無服務器(Serverless)存儲模式,不依賴外部庫,無需配置,所以使用很方便。Ghost 博客系統就是用的它,SQLite 非常適合個人博客的應用場景,基本上是小型數據庫的首選。

非關系數據庫(NoSQL Database)

其實在最早期一直是非關系數據庫的天下,后來關系數據庫逐漸流行開來變為主流。不過最近非關系數據庫因為簡單和可擴展性強又開始受歡迎。風水輪流轉啊。

關系數據庫犧牲了性能換來了可靠性。許多非關系數據庫一般是把性能作為首位,所以非關系數據庫可能更適合用於實時分析或即時消息的應用場景。另外,非關系數據庫通常不要求事先定義數據的 schema,因此更為靈活,特別適合保存層級 (hierarchy) 變化的數據,所以和 JSON 特別匹配。而且非關系數據庫的數據結構更類似程序里經常使用的數據結構,比如哈希表,鏈表和 鍵值對(key/value pair)等等,對開發更友好。

下面介紹幾個最受歡迎的 NoSQL 數據庫。

Redis

Redis 適合處理簡單而又不需要長期保存的數據,例如即時消息,游戲數據。 Redis 把數據保存在內存(RAM)里,同時也把變化記錄到硬盤上,一旦出問題可以從硬盤上重載數據。這樣做的缺點就是存儲量有限,因為一般內存也就幾個G或者幾十個G,遠不如硬盤動輒上T。不過優點也明顯,操作數據超快。

MongoDB

MongoDB 是一個通用的非關系數據庫。一般的應用場景和之前提到的關系數據庫類似,比如 CMS/CRM 和在線商店等。有一個專門的模塊 Mongoose 使得操作 MongoDB 簡單易上手。 MongoDB 是 MySQL 的一個有力競爭對手。

CouchDB

又叫 Apache CouchDB。號稱完全擁抱網絡的一款非關系數據庫。使用 JSON 存儲數據,JavaScript 作為查詢語言。還有 MapReduce 模式和利用 HTTP 作為 API。CouchDB 性能一般,據說讀寫速度比 MySQL 還慢,比較適合大數據應用。

PouchDB

一款運行在瀏覽器里的離線數據庫。應用程序把數據存儲在本地端,所以離線用戶用起來就和在線的感覺一樣,一旦在線,PouchDB 就可在不同客戶端之間同步數據,所以無論走到那里都可讀取到最新數據。

小結

希望到此你對各類數據庫有個大致了解。另外還有其他很多數據庫,比如 Oracle 的企業數據庫,性能超好,就是價格高。這里只是列出了常用到的一些開源數據庫。

總的來說,一個可以保存比較復雜的結構化數據,並且帶有完善查詢功能的數據庫都會犧牲些讀寫性能。性能最好的數據庫往往都是直接使用服務器內存,但是一旦服務器或者程序重啟數據就會丟失。

如何為你的 Node.js App 挑選數據庫:
如果只是內容或客戶管理,MySQL 和 MongoDB 都是不錯的選擇,可能 MySQL 會更穩定一點點,Join Table 更容易,但是 MongoDB 的擴展性更好,讀寫速度更快,也更靈活。這也是關系數據庫和非關系數據庫之間的區別。

單機或個人應用 SQLite 就足夠了。

稍大一些的網站都是混合使用這些數據存儲方式。例如網站的配置文件通常利用 JSON 文件保存,內容保存在 MongoDB 里,經常讀取和更新的數據利用 Redis 保存。 如果是做在線工具類,可以使用 PouchDB 作為離線數據庫,讓用戶有更好的體驗。我見過有人使用 PouchDB 做彈幕頁面,很有意思。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM