雖然關系型數據庫系統RDBMS在安裝和使用上仍然占有主要地位,但毋庸置疑,非關系型數據庫NoSQL技術已經成為今天發展最快的數據庫技術。
NoSQL是對數據庫系統的總稱,在某種程度上,它的性能和用途可能完全不同。NoSQL一詞最早產生於上世紀九十年代,意思是No SQL(沒有SQL語言),後來隨著時間和技術的發展,SQL界面仍然作為處理數據的方式存在,所以NoSQL又有了新的诠釋,即Not Only SQL(不只是SQL語言)。今天,NoSQL數據庫憑借著其非關系型、分布式、開源和橫向擴展等優勢,被認為是下一代數據庫產品。
四種主要的NoSQL數據庫和它們主要的應用場景
鍵值數據庫:當數據以鍵的形式訪問時,比如通過國際標准書號ISBN找一本書,鍵值數據庫是最理想的。在這裡,ISBN是鍵,書籍的其他信息就是值。必須知道鍵才能查詢,不過值是一堆無意義的數據,讀取之後必須經過翻譯。
文檔存儲數據庫:該數據庫以文檔的形式管理和存儲數據。有點類似於鍵值數據庫,但文檔數據庫中的數據有結構。與鍵值數據庫中值是一堆無意義的數據不同,文檔數據庫中數據以文檔的結構被描述,典型的是JavaScript Object Notation (JSON)或XML.文檔存儲數據庫中的數據可以通過定義的任何模式進行查詢,但鍵值數據庫只能通過它的鍵進行查詢。
列式數據庫:也被稱為列式存儲或寬列存儲,一改之前行式存儲的方式,對數據進行列式存儲。在傳統關系型數據庫中,數據經常以行來訪問。以列式管理記錄的NoSQL數據庫可以管理大規模的動態列。因為沒有固定的模式,所以列名和鍵可以變換。列式數據庫適用於不經常寫的情況,要滿足ACID(原子性、一致性、隔離性和持久性)的要求並不難,而且模式是變化的。
圖型數據庫:圖型數據庫關注值與值之間的關系,用圖型的數學概念存儲數據。圖型數據庫用帶有點、邊緣和屬性的圖的結構表示和存儲數據。在圖型數據庫中,每一個元素都包含一個直接的指向它毗鄰元素的點,所以也就不需要索引查找。
NoSQL數據庫在網頁擴展、大數據和分析部署等方面越來越流行。每一個種類的NoSQL數據庫都有適用的不同類型的應用程序和用例,這就涉及到一個NoSQL社區常用的一個話題,即多樣持久性,或者說根據數據庫處理應用程序需求的不同,使用不同的數據庫系統,用於不同的應用程序和用例。
因此,使用NoSQL最重要的是使用正確的數據庫,滿足具體的需求,哪怕是要引入一種新的數據庫系統。
NoSQL的優勢和劣勢
那麼,為什麼考慮用NoSQL數據庫替代傳統數據庫呢?也許,前者最大的有點在於它的去中心化、可擴展、容錯能力等屬性。很多公司應用NoSQL數據庫技術是考慮了它的可擴展能力。
用NoSQL數據庫,你可以為每一個特殊的用例定制化你的數據管理解決方案。關系型數據庫可以通過不同的用例廣泛地應用於實踐。通過考慮多樣持久性,組織可以選擇最能適應特殊應用場景的數據庫技術。
另外,大多數NoSQL產品都是輕量級的,因此花費比較少。自從NoSQL產品被設計用來滿足特殊的用例和解決特殊的問題,它的功能也就比大多數關系型數據庫少,因為後者要應用於更廣泛的領域。因此,NoSQL數據庫需要的代碼更少,這也是和復雜的關系型數據庫相比具備的一項優勢。
當然,NoSQL也有它的缺點。ACID協議是關系型數據庫的標准,但很多NoSQL數據庫做不到。如果ACID支持很關鍵,你必須要確定你選的NoSQL數據庫是否提供ACID。
NoSQL數據庫的另一個缺點是不支持SQL語言。經過40多年的發展,SQL已經成為訪問數據的通用語言。一套數據庫系統不支持SQL語言就意味著要求開發者學習不同的訪問數據的語言。不過,像有的NoSQL支持ACID一樣,有的NoSQL數據庫也支持SQL語言,但不像傳統關系型數據庫那樣全面。總之,想要不做重大更改就在NoSQL數據庫中運行SQL查詢是不可能的。
今天的NoSQL市場依然很混亂。嚴格來講,有上百種不同的NoSQL數據庫可供選擇。而且沒有像關系型數據庫一樣正規的數據模型,因此NoSQL數據庫之間也是各不相同的,即便是同一種類也有所不同。這種混亂給NoSQL的廣泛應用帶來了阻礙,如果沒有深度的投資和研發,它很難成功。
NoSQL 數據庫用例
讓我們分別看一下不同NoSQL數據庫的用例:
鍵值。鍵值數據庫可以滿足游戲、零售和移動等應用程序的高可用性、低延遲需求。它的模式比較靈活,在會議管理、服務廣告內容和管理用戶或產品文件方面有卓越的表現。總之,當數據不是按一定模式,而是包含很多種代碼的時候,可以使用鍵值數據庫。
但如果要管理不同數據集之間復雜的關系,或使用非限定的鍵進行查詢,鍵值數據庫的表現就欠佳了。
文檔數據庫。這種數據庫特別適合用於為每一個文檔存儲不同種類的數據,可以實現跨數據的彈性的搜索。如果你的模式不是網格式的,你又需要指定鍵之外的東西進行查詢,那麼文檔存儲絕對是一個不錯的選擇。文檔數據庫適合應用於事件日志,線上購物,內容管理和深度分析流程。對於要求快速原型的項目來說,文檔數據庫的模式靈活性也是一大亮點。
不過,文檔數據庫不適合復雜的事務處理。對於要求數據壓縮的應用程序來說,文檔數據庫並不是一個很好的選擇,因為彈性模式意味著跨文檔的數據不一致,也不可能被有效壓縮。
列式存儲。這種數據庫以列的方式存儲數據。與一個鍵(或識別符)相關的有很多列。和其他NoSQL數據庫一樣,它的模式很靈活,一個列式家族可以由不同的列組成。另外,列式存儲中的數據可以通過列訪問,而不是鍵。
列式存儲並不是一個新概念,它的變體過去作為一種概念應用於關系型數據庫中(比如SAP Sybase IQ和IBM DB2 BLU)。雖然關系型列式存儲也聚焦與列,但它不允許跨行的列有所不同,這是它與NoSQL列式存儲不同之處。
對於不經常寫,但要頻繁地一次讀取很多行的幾列的情況下,列式存儲是很有效率的。對於時間日志、內容管理、分析的計算和分類,列式存儲都很有效。如果你有要過期的數據,列式存儲非常有用,因為你可以建立一列,讓它自動過期。
如果是跨度很廣的查詢,不要用列式存儲,因為你可能不得不重新設計列。另外,列式存儲不是很適合ACID事務。
圖型數據庫。這種數據庫可能是和傳統數據庫以及其他NoSQL數據庫區別最大的。圖型數據庫適用於數據元素之間相互關聯,而且彼此之間關系的數量不確定的情況。
圖型數據庫最常用於社交媒體網絡,比如LinkedIn和Facebook。當然也有一些其他的應用程序,比如分配路線和調度、定位系統、公共交通連接、地圖、課程計劃和網絡拓撲結構等。圖型數據庫的另一個實踐在於推薦引擎,常用語在線零售商。
圖型數據庫不適合用於數據經常改變,常發生大規模數據之間實時更新的情況。另外,如果你計劃跨網絡分區數據庫的話,圖型數據庫很可能會性能下降。
六大考慮因素
NoSQL數據庫之間的很多不同給技術選擇帶來了難度。不同的數據庫類型和產品有不同的架構。即使同樣是NoSQL數據庫,不同類型之間也有所不同,沒有統一標准,即便是訪問數據的標准也不相同。這意味著在不同的數據庫中訪問數據,有不同的工具和應用程序需要采用和學習。以下是需要考慮的一些方面。
快速變化。NoSQL領域是持續變動的,特性不斷提升、功能不斷增加、甚至會產生新產品。在選擇NoSQL數據庫時,很難跟上最新最好的功能和產品。
對ACID的支持能力越來越強。NoSQL的一個早期賣點是它支持不要求全部ACID支持的事務。取代ACID,NoSQL提升了最終一致的基本可用軟件狀態服務(BASE)。雖然如此,很多應用程序依然依賴ACID,NoSQL對ACID事務的支持是用戶的需求,也是它自己在不斷完善的。
缺少對多平台的支持。大多數NoSQL數據庫起源於開源運動,因此基本上都運行在Linux上,(或者Unix的變體)。如果你需要在Windows或者主機上部署數據庫,你需要考慮商業產品,因為商業產品對多平台部署的支持性更好。
增加對SQL的支持。沒有SQL,查詢通常非常基礎,可能要求使用高級語言的復雜的代碼。當然,產品與產品之間也有所不同,不過最好選擇支持SQL的NoSQL數據庫,因為很多開發者熟悉的還是SQL語言。
開發多種類型數據庫的能力。一些NoSQL數據庫允許你用鍵值對、文檔和圖型的彈性的組合建模和部署數據。另外,關系型數據庫開始采用NoSQL能力。使用能夠開發多種類型數據庫存儲的數據庫系統能幫助你的組織獲得普適的持久性。
注意技術的版本。很多開源項目運行了很多年,但也沒有第一版。這些軟件可能很好用,但慎重的公司一般不會選擇沒有發行第一版的技術。