雖然關系型數(shù)據(jù)庫系統(tǒng)RDBMS在安裝和使用上仍然占有主要地位,但毋庸置疑,非關系型數(shù)據(jù)庫NoSQL技術已經(jīng)成為今天發(fā)展最快的數(shù)據(jù)庫技術。
NoSQL是對數(shù)據(jù)庫系統(tǒng)的總稱,在某種程度上,它的性能和用途可能完全不同。NoSQL一詞最早產(chǎn)生于上世紀九十年代,意思是No SQL(沒有SQL語言),后來隨著時間和技術的發(fā)展,SQL界面仍然作為處理數(shù)據(jù)的方式存在,所以NoSQL又有了新的詮釋,即Not Only SQL(不只是SQL語言)。今天,NoSQL數(shù)據(jù)庫憑借著其非關系型、分布式、開源和橫向擴展等優(yōu)勢,被認為是下一代數(shù)據(jù)庫產(chǎn)品。
四種主要的NoSQL數(shù)據(jù)庫和它們主要的應用場景
鍵值數(shù)據(jù)庫:當數(shù)據(jù)以鍵的形式訪問時,比如通過國際標準書號ISBN找一本書,鍵值數(shù)據(jù)庫是最理想的。在這里,ISBN是鍵,書籍的其他信息就是值。必須知道鍵才能查詢,不過值是一堆無意義的數(shù)據(jù),讀取之后必須經(jīng)過翻譯。
文檔存儲數(shù)據(jù)庫:該數(shù)據(jù)庫以文檔的形式管理和存儲數(shù)據(jù)。有點類似于鍵值數(shù)據(jù)庫,但文檔數(shù)據(jù)庫中的數(shù)據(jù)有結構。與鍵值數(shù)據(jù)庫中值是一堆無意義的數(shù)據(jù)不同,文檔數(shù)據(jù)庫中數(shù)據(jù)以文檔的結構被描述,典型的是JavaScript Object Notation (JSON)或XML.文檔存儲數(shù)據(jù)庫中的數(shù)據(jù)可以通過定義的任何模式進行查詢,但鍵值數(shù)據(jù)庫只能通過它的鍵進行查詢。
列式數(shù)據(jù)庫:也被稱為列式存儲或?qū)捔写鎯Γ桓闹靶惺酱鎯Φ姆绞?,對?shù)據(jù)進行列式存儲。在傳統(tǒng)關系型數(shù)據(jù)庫中,數(shù)據(jù)經(jīng)常以行來訪問。以列式管理記錄的NoSQL數(shù)據(jù)庫可以管理大規(guī)模的動態(tài)列。因為沒有固定的模式,所以列名和鍵可以變換。列式數(shù)據(jù)庫適用于不經(jīng)常寫的情況,要滿足ACID(原子性、一致性、隔離性和持久性)的要求并不難,而且模式是變化的。
圖型數(shù)據(jù)庫:圖型數(shù)據(jù)庫關注值與值之間的關系,用圖型的數(shù)學概念存儲數(shù)據(jù)。圖型數(shù)據(jù)庫用帶有點、邊緣和屬性的圖的結構表示和存儲數(shù)據(jù)。在圖型數(shù)據(jù)庫中,每一個元素都包含一個直接的指向它毗鄰元素的點,所以也就不需要索引查找。
NoSQL數(shù)據(jù)庫在網(wǎng)頁擴展、大數(shù)據(jù)和分析部署等方面越來越流行。每一個種類的NoSQL數(shù)據(jù)庫都有適用的不同類型的應用程序和用例,這就涉及到一個NoSQL社區(qū)常用的一個話題,即多樣持久性,或者說根據(jù)數(shù)據(jù)庫處理應用程序需求的不同,使用不同的數(shù)據(jù)庫系統(tǒng),用于不同的應用程序和用例。
因此,使用NoSQL最重要的是使用正確的數(shù)據(jù)庫,滿足具體的需求,哪怕是要引入一種新的數(shù)據(jù)庫系統(tǒng)。
NoSQL的優(yōu)勢和劣勢
那么,為什么考慮用NoSQL數(shù)據(jù)庫替代傳統(tǒng)數(shù)據(jù)庫呢?也許,前者最大的有點在于它的去中心化、可擴展、容錯能力等屬性。很多公司應用NoSQL數(shù)據(jù)庫技術是考慮了它的可擴展能力。
用NoSQL數(shù)據(jù)庫,你可以為每一個特殊的用例定制化你的數(shù)據(jù)管理解決方案。關系型數(shù)據(jù)庫可以通過不同的用例廣泛地應用于實踐。通過考慮多樣持久性,組織可以選擇最能適應特殊應用場景的數(shù)據(jù)庫技術。
另外,大多數(shù)NoSQL產(chǎn)品都是輕量級的,因此花費比較少。自從NoSQL產(chǎn)品被設計用來滿足特殊的用例和解決特殊的問題,它的功能也就比大多數(shù)關系型數(shù)據(jù)庫少,因為后者要應用于更廣泛的領域。因此,NoSQL數(shù)據(jù)庫需要的代碼更少,這也是和復雜的關系型數(shù)據(jù)庫相比具備的一項優(yōu)勢。
當然,NoSQL也有它的缺點。ACID協(xié)議是關系型數(shù)據(jù)庫的標準,但很多NoSQL數(shù)據(jù)庫做不到。如果ACID支持很關鍵,你必須要確定你選的NoSQL數(shù)據(jù)庫是否提供ACID。
NoSQL數(shù)據(jù)庫的另一個缺點是不支持SQL語言。經(jīng)過40多年的發(fā)展,SQL已經(jīng)成為訪問數(shù)據(jù)的通用語言。一套數(shù)據(jù)庫系統(tǒng)不支持SQL語言就意味著要求開發(fā)者學習不同的訪問數(shù)據(jù)的語言。不過,像有的NoSQL支持ACID一樣,有的NoSQL數(shù)據(jù)庫也支持SQL語言,但不像傳統(tǒng)關系型數(shù)據(jù)庫那樣全面??傊?,想要不做重大更改就在NoSQL數(shù)據(jù)庫中運行SQL查詢是不可能的。
今天的NoSQL市場依然很混亂。嚴格來講,有上百種不同的NoSQL數(shù)據(jù)庫可供選擇。而且沒有像關系型數(shù)據(jù)庫一樣正規(guī)的數(shù)據(jù)模型,因此NoSQL數(shù)據(jù)庫之間也是各不相同的,即便是同一種類也有所不同。這種混亂給NoSQL的廣泛應用帶來了阻礙,如果沒有深度的投資和研發(fā),它很難成功。
NoSQL 數(shù)據(jù)庫用例
讓我們分別看一下不同NoSQL數(shù)據(jù)庫的用例: