最近更新: 2011-01-25

NoSQL 是資料庫觀念的復興運動

日前公司同事接觸了 CouchDB, MongoDB 這幾套標榜 NoSQL 的資料庫系統。還有江湖傳言道:「RDBMS 落伍了,以後要用 NoSQL 資料庫」。這就在公司內引起了一場討論,到底 RDBMS 是不是落伍了。就我個人觀點,CouchDB, MongoDB 確實很有用,但要說 RDBMS 落伍了,我卻不以為然。

就我所見,NoSQL 其實是資料庫使用觀念的復古運動、正確觀念的復興運動。

現在的程序員在處理資料儲存的問題時,出現了一個偏差方向,就是不管什麼資料都往關聯式資料庫塞,而不考慮資料存取特性。 最常見的例子,就是 PHP 的程式,幾乎是不分資料內容,全部往 MySQL 資料庫放。例如程式組態這種鍵值結構的資料也放進關聯式資料表格。如果問那些程序員能不能用其他方式儲存,他們還未必答得出來。

但是以前不是這樣的。十年前,我們在學資料儲存方式時,要從循序存取、隨機存取等儲存方式開始學起。我們要學著根據資料的使用特性,選擇適當的儲存機制。關聯式資料庫並不是唯一且最適的解法。

NoSQL 在觀念上所帶來的衝擊(我是沒啥感覺啦),就是把近來出現偏差的資料儲存解法,重新拉回基礎:「根據資料的使用特性,選擇適當的儲存機制」。Not Only SQL。 在這個基礎觀念下,當我們有適合關聯式處理的資料時,我們還是會把它存入RDBMS。故所謂 RDBMS 落伍的說法,其實並不成立。

我們來看看這篇《未來新的Web資料庫「NoSQL」》提到的 NoSQL 資料庫種類。作者 Merriman 將 NoSQL 資料庫分為以下三種:

  • Key/Value型 - 存放Key/Value成對的簡單構造。分散Cache的memcached以及米Amazon.com的Amazon Dynamo採用的資料模式。
  • 列指向的表形式型 - 具有能夠處理列方向的構造。像米國Google的BigTable、Apache Incubator專案之一的Cassandra等。
  • 文件指向型 - 轉換成XML、JSON等文件形式保存方式。像美國10gen公司的MongoDB,Apache的CouchDB等。

像我這種老派的程序員,一看就覺得很熟悉,這不是我們以前一開始就學的資料庫處理策略嗎?文件指向型資料庫,請看 Unix 系統的 /etc 目錄,裡面都是文件指向型資料庫。Key/Value型,請看 Unix 系統的 dbm, gdbm 等。

真要說那些 NoSQL 資料庫有什麼不同的話,也應著重於它們具有將資料分散儲存在不同主機的能力,亦即規模的伸縮性(scalability)。但規模伸縮性和 NoSQL 字眼又扯不上什麼關係,於是大家應該注意的焦點就被這個字眼模糊了。好像還在用關聯式資料庫的程式就是在地上爬泥吃土;用了一套 NoSQL 資料庫,我們的程式就能騰雲駕霧了。

我在網路上看到一篇文章《NOSQL 背後的共通原則》,作者老魚的見解與我相同。推薦各位一讀。

最後,小老頭我又要發一下牢騷。 NoSQL 實在不應該說 NoSQL,而應稱為 NoRDB (Not Only Relational DataBase) 才對。 其一、因為 NoSQL 資料庫的共同特徵是不使用關聯式資料庫的 schema 。其二、SQL 之意為「結構化查詢語言」,它跟關聯式資料庫沒有必然的相依性。就算不是關聯式資料庫,也可以提供 SQL 作為資料查詢語言。而事實上,也確實有許多 NoSQL 資料庫提供 SQL 查詢方式。因此 Not Only RDB 才是正確的說法吧。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/15009431.html

樂多舊回應
未留名 (#comment-21617223)
Tue, 22 Feb 2011 11:42:12 +0800
不好意思
想請教一下
「例如程式組態這種鍵值結構的資料也放進關聯式資料表格」
為什麼不能放在資料庫?
雖然我都是隨程式包個ini或properties之類的程式組態檔
至於為什麼實在不太了解
請問有相關的討論嗎?
未留名 (#comment-21625801)
Mon, 28 Feb 2011 03:27:00 +0800
不是不能放,而是沒必要放進「關聯式資料庫」中。

你放到ini或properties,就是放進一個基於「鍵值」的循序存取資料庫中。這就比放進關聯式資料庫適合。

有很多理由可以說明這件事不該做,例如從關聯性,從易用性。

從關聯性看,請問程式組態的資料表有跟其他資料表相關聯嗎?既然沒有資料關聯性,那存在關聯式資料庫中就是小題大做了。

再者,你在查詢程式組態時,最常用的方式就是 id/key 相等的條件,其結果也僅有一筆記錄。
在這件事上,關聯式資料庫最擅長的資料結果集合能力又幫上我們什麼?不在效能上扯後腿就該偷笑了。


從易用性來說,你存在 ini 裡面,就表示你不需要為了它又多一項資料庫的設置需求。

程序員最直接的感受,還是在元件的使用經驗了。像你用 Java 寫程式,用 Properties class 總比用 JDBC 還方便吧?
von@vonstark.co(Von) (#comment-22702674)
Tue, 04 Dec 2012 20:43:25 +0800
Hi. 對於 NoSQL 有興趣的朋友, 歡迎到 NoSQL 討論群組跟我們討論.
http://fb.nosql.org.tw/

我們也定期辦活動. 目前已經辦到 #8, 加總約超過 15 位講者和我們分享各式 nosql.
接下來也會繼續努力, 社群需要大家的參與. :)
jerry@conicsoft.com(jerry) (#comment-24778928)
Wed, 25 Jun 2014 13:49:41 +0800
就我的角度, 本身是MS SQL Server的講師, 同意NOSQL應該比較向 RDBMS 在我看到的問題是, NoSQL 優點是查詢未經過正規化的巨量資料, 但是當必須將資料做寫入時, 卻又看不到任何優於RDBMS的好處, 除非只是單純的寫入Log(時間, 事件), 對於大多數企業而言, 這些巨量(或是所謂海量)的資料, 佔企業所需工作的比重實在有限(除非你是作搜尋引擎的), 目前無法看到它有甚麼可以取代RDBMS成為新一代資料庫系統標準的跡象。不過也許未來會有新的技術也說不定就是了。
未留名 (#comment-25295063)
Sun, 15 Mar 2015 14:33:17 +0800
感謝您的分享,寫得很讚!