閔昭浩 楊卓凡
(湖北大學計算機與信息工程學院 湖北省武漢市 430062)
在當今人類社會的工作生活中,每時每刻都會產生海量的數據信息,信息不僅達到了一定的數量級,并且信息種類繁多,這些信息需要及時有效的存儲管理起來,數據庫系統也是目前效率較高且較為快捷存儲信息管理工具。當前,社會廣泛應用的數據庫系統分為兩大類:RDBMS(關系型數據庫)與NoSQL(非關系型數據庫)。關系型數據庫自上世紀80年代初期就被提出并得到應用,至今廣泛應用于社會多個領域方面,它是基于關系模型來存儲數據的數據庫。非關系型數據庫在本世紀初期就得到提出,基于Web2.0時代的流行,非關系型數據庫則憑借其自身的特點優勢得到了非常迅速的發展,它是基于分布式,不支持ACID的非關系型數據庫設計模式。
目前,較為主流的傳統RDBMS有Oracle、DB2、MySQL、Microsoft SQL Server、Microsoft Access等,它們在處理數據量不高,單一類型數據的時候是可以正常的進行存儲管理,但當數據量增加到一定數量級,數據類型增多的時候,若未進行及時有效的存儲前規劃,則傳統關系型數據庫在存儲數據時就會出現并發度不高,訪問查詢效率較低以及可擴展性不足等一系列問題,所以隨著信息時代的快速變化,數據量以及數據類型的增加,傳統關系型數據庫在某些領域場景中的應用就不再那么高效。
在Web2.0時代,Web2.0也催生了新的需求,例如,需要支持對海量用戶數據的高并發讀寫與高效存儲訪問,以及支持系統的高可用性與高擴展性。NoSQL數據庫應運而生,且發展迅速,快速地成長為在該些領域應用場景中熱門的數據庫管理系統。非關系型數據庫針對不同的數據類型以及不同的應有場景也有不同的數據庫存儲模式。因此NoSQL憑借自身優點特性在當代社會與工作中越來越受歡迎。
關系型數據庫中的表結構是一種基于關系模型的二維表格形式,其模型形式基于行和列來存儲管理數據。一個關系型數據庫組成包括多張表以及多表之間的關系。用戶可以通過SQL語句來進行查詢訪問數據庫中的數據。
SQL語句稱為結構化查詢語言,自上世紀70年代初期由Boyce和Chamberlin提出,是一種高級非過程化編程語言。SQL語句主要分為三類:數據操縱語言(DML),數據定義語言(DDL),數據控制語言(DCL)。
系統只需要用戶事先定義好SQL語句操作的目的,而無需知道系統的具體執行過程。比如選擇路徑信息和具體執行處理過程靠系統自動操作完成。語言簡練易懂,便于學習使用,是一個對于關系型數據庫系統管理的通用簡單易懂的語言。
關系型數據庫自上世紀80年代發展起來,迄今已有數十年的歷史,在其主流產品Oracle,DB2等中,無論其基礎理論,還是相關應用技術,都非常成熟與完善,每種數據庫模式的語法,功能和特性也各具特色。但在Web2.0時代,隨著海量數據的涌現,不僅數據量級得到了提升并且數據類型日益復雜,傳統關系型數據庫依據其本身的結構難以“應付”以上的應用場景,而NoSQL數據庫相較于關系型數據庫有著更好的應用發展場景。
NoSQL最常見的解釋是“non-relational”可稱作為不具備關系型的數據庫,“not only SQL”也被人們接受,被翻譯為“不僅僅是結構化查詢語言”,由于互聯網Web2.0時代的流行,傳統關系型數據庫在面臨處理超大規模和高并發網站問題時表現出無法有效地解決此類問題,顯露出關系型數據庫不適應此類場景的不足。而非關系型數據庫憑借自身的優勢特征能較好地“應對”超大規模以及多樣數據類型所帶來的問題。因此,NoSQL數據庫在此類場景中得到了迅速的發展與流行。例如在云計算中大數據如何應用問題。NoSQL數據庫是同時支持CAP定理和BASE分布式理論,而傳統的關系型數據庫是基于ACID理論。
2.2.1 NoSQL數據庫特點
NoSQL數據庫有以下幾個特點:
(1)易擴展性:NoSQL是非關系型數據庫,其包含多種數據存儲的數據庫設計模式,但所有的設計模式有一個共性特征是摒棄傳統關系型數據庫的關系特性后,其存儲數據間不存在關系,此特征優勢在于提升了在架構層面上的可擴展性能力。
(2)海量數據處理,高性能并發讀寫:NoSQL數據庫的Cache是具有細粒度特性,因此從該層面來講NoSQL的性能就要高出很多,由于其無關系特性,NoSQL數據庫在大數據處理場景中,其讀寫性能具有非常高的效率。
(3)具有靈活的數據模型:在Web2.0時代中,關系型數據庫需事先定義好數據結構(建立好表單以及表的字段類型等),如果表的數據量非常大,關系型數據庫對表的增刪改查操作無疑是非常龐大的操作量,并且大概率會出現數據錯誤甚至更為嚴重的后果。
而NoSQL數據庫具有靈活輕便的數據模型,無需過早地對數據庫中的表定義字段,可以在任意時刻定義數據格式。所以非關系型數據庫在此種應用場景下很好的解決了處理大數據量表的問題。
(4)高可用性:NoSQL數據庫中的某些模型一方面可以在低影響性能的場景下,能快速便捷地實現高可用性,另一方面能夠采用復制相應模型的方式實現高可用性。此類模型有Cassandra,Hbase模型。
2.2.2 CAP定理
非關系型數據庫是基于CAP定理,CAP定理包含三部分如下:
(1)一致性(C:Consistency):是指系統執行數據更新操作完成后并成功將數據返回給客戶端且使所有節點在操作完成后達到數據完全一致。在所有并發系統中都會面臨數據一致性問題,一方面對客戶端來講,一致性指的是在進行數據并發訪問時怎樣得到更新操作后的數據。另一方面對于服務端來講,一致性指的是如何將更新操作后的數據準確無誤地進行復制且分布到原系統,以此達到數據的最終一致性。
(2)可用性(A:Availability):指的是NoSQL數據庫總是可以以正常的響應時間為用戶提供服務。高效的可用性指的是不會出現用戶訪問操作失敗等用戶體驗感不友好的情況。
(3)分區容錯性(P:Partition Tolerance):是指分布式數據庫系統在面臨某些節點或網絡分區故障問題時,仍能支持提供一致性和可用性的服務。
對于數據庫系統來講,無論是關系型數據庫還是非關系型數據庫對于CAP定理中三個要素不能同時滿足,只能兼容其中兩者,所以就有三種模式,CA模式,CP模式以及AP模式,NoSQL數據庫都屬于AP模式。
2.2.3 BASE理論
由于CAP定理只是定義了在分布式存儲數據庫系統中數據操作更新后等問題,并沒有明確給出一個在數據一致性和可用性之間進行較好權衡的方法。因此BASE理論彌補了CAP定理上述不足,提出了權衡A與C的一種可行性方案。
BASE理論的核心概述為:即便未能達到強一致性,但每個應用都能依靠自身的業務特點,采取合適的方式來使系統達到最終一致性。
BA(Basically Available,基本可用性):分布式數據庫系統在遇到無法感知和預測的故障問題場景下,在保證最重要的核心功能可用情況下,允許損失部分可用性。
S(Soft state,軟狀態):也可稱為灰度狀態、過渡狀態,同時也是一種中間狀態。且認為此中間狀態不僅不會影響到系統的整體可用性,而且也允許系統主機之間進行數據同步的過程中存在一定延時。
E(Eventual Consistent,最終一致性):要求系統數據副本最終能夠一致,而不需要實時保證數據副本一致。
關系型數據庫與NoSQL數據庫在使用情景下有著很大的區別,不同的應用場景對應著需要不同的數據庫模式,只有彼此相互正確對應才能更好的發揮數據庫管理的優勢。以下列舉出關系型數據庫與NoSQL數據庫在各自情景應用中的優缺點。
(1)便于維護:關系型數據庫中的表結構是二維數組的形式,格式相同,方便進行SQL語句操作。
(2)SQL語言簡潔易用:對于初學者來講,SQL語言簡練,易學易用,可用于復雜場景下的查詢。
(3)支持復雜操作:它可以實現一個表以及多個表之間的復雜查詢操作,使初學者容易上手學習SQL語句。
(1)在面臨大數據量數據進行高效率處理訪問讀寫時,關系型數據庫的讀寫性能較低。
(2)由于關系型數據庫中的表結構都是二維表結構且表結構相對固定,其靈活度不高。
(3)對于傳統關系型數據庫來說,在進行數據高并發讀寫時受限于硬盤的輸入和輸出。
(1)數據存儲結構靈活:傳統關系型數據庫由于表結構相對固定,只能通過數據定義語言(DDL語句)進行表結構的修改,且可擴展性較低。而NoSQL數據庫有多樣的存儲機制,一方面數據格式靈活度高無固定表結構,另一方面可擴展性高。比如文檔存儲模式,Key-Value鍵值對存儲模式,圖存儲模式。
(2)可擴展性高:傳統關系型數據庫由于其自身表結構固定的特點不易于對數據進行分片,對數據的橫向擴展很難支持,但NoSQL數據庫支持數據橫向擴展,同時也支持對大數據量以及多類型數據的存儲管理。
(3)支持數據的最終一致性:NoSQL數據庫是基于CAP模型的,同時也是支持BASE分布式理論,目的是達到數據的最終一致性。
盡管NoSQL數據庫能較好的應用在更為廣泛復雜的數據場景中,但NoSQL數據庫還存在著很多的不足,常見主要有下面這幾個方面:
(1)不支持SQL結構化查詢語言:如果無法支持SQL這樣的工業標準,將會導致用戶學習與場景應用的成本增加。
(2)提供特性支持的豐富度不足:目前較為流行的非關系型數據庫都無法支持事務處理,且能提供的功能服務有限,相比較一些關系型數據庫能夠提供一些附加功能,比如Oracle與SQL Server。
(3)大部分NoSQL數據庫尚處于起步階段:相應的技術發展,維護文檔等技術資料還有待加強與完善,無法與關系數據庫幾十年的發展相比。
NoSQL數據庫也稱非關系型數據庫,它是含蓋多種存儲方法的集合,主要包含以下幾類存儲方法:
文檔存儲分為無結構或半結構化存儲,此類數據庫是以文檔為存儲數據信息的基本單位。半結構化文檔有特定存儲文件的格式,如JOSN。并且數據間可以嵌套鍵值,在應對處理較為復雜的網頁數據時,文檔存儲數據庫的查詢訪問效率較鍵值數據庫更高。此類數據庫模式有CouchDB,MongoDB等。
鍵值存儲可以根據簡單的字符串(鍵)返回任意類型的數據(值)。具有極高的并行性,鍵值存儲可以存儲任何類型,比如存儲圖片,存儲網頁路徑,存儲文件路徑,存儲MD5哈希值以及存儲SQL語句查詢結果非常靈活,此類型數據庫主要依據哈希表來存儲數據,表中由特定的鍵和特定的指針指向特定的數據組成。鍵值存儲方式在實際海量數據的應用場景中都得到了具體的使用,此類數據庫模式有MemcacheDB,Redis,Voldemort等。
列存儲屬于分布式的文件系統,其存儲方式以列簇式進行的,且此種存儲方式查詢訪問效率高。由于具有較高的可擴展性,其更易實現分布式擴展,且能對特定列的所屬行數據進行讀取訪問,同時也能對表中所有行的特定列數據進行同步更新操作。并支持對海量數據的存儲,其特點符合云計算的需求,目前較為流行的列式存儲數據庫有Cassandra,Hbase以及Google的Big Table。
圖存儲使用圖形模型,其特點不僅較為靈活,并且能支持多個服務器的擴展。圖存儲有三個字段:結點,關系,屬性。圖數據庫的應用場景也較為廣泛,比如社交網絡,規則引擎,數字地圖等。目前正在使用的圖存儲數據庫有Neo4J,InfoGrid,Infinite Graph。
隨著Web2.0時代的發展與流行,人們需要處理的數據規模空前擴大,數據類型日益增多,數據復雜度也隨之增加。傳統的關系型數據庫愈發難以支持更為復雜的應用場景,非關系數據庫應運而生,并且正在逐漸地成為數據庫領域中不可或缺的一部分,在Web2.0時代得到迅速發展與流行,其主要原因在于非關系型數據庫自身優勢特點,它具有支持海量數據,擴展性強,支持高性能并發以及有較好的靈活數據模型。NoSQL數據庫是建立在CAP定理與BASE理論之上的,且支持數據的最終一致性。也促使其能支持更為廣泛的OLAP場景。但NoSQL數據庫也有其缺點,不支持結構化查詢語言SQL。這會增加對初學者的學習成本,由于NoSQL數據庫無事務處理,因此不具備數據完整約束。由于關系型數據庫與NoSQL數據庫使用的場景不同,因此兩者在實際生活工作中是一種互相補充的關系。當關系型數據庫在某些場景中不能有效的應用時,這時就可以依靠關系型數據庫應用在此場景中。