NoSQL資料庫概覽及其與SQL文法的比較,nosql概覽sql文法
【文章摘要】
HBase是一個高可靠性、高效能、面向列、可伸縮的分布式儲存系統,同時也是知名的NoSQL資料庫之一。NoSQL資料庫的產生就是為瞭解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用的難題。
本文對NoSQL資料庫的定義、分類、特徵、當前比較流行的NoSQL資料庫系統等進行了簡單的介紹,並對NoSQL和SQL文法進行了簡單的比較,為大家對NoSQL資料庫的學習提供了有益的參考。
一、NoSQL的出現
關係型資料庫系統多年來在解決資料存放區、服務和處理問題方面取得了巨大的成功。一些大型的公司使用關係型資料庫建立了自己的系統,如聯機交易處理系統和後端分析應用系統。聯機交易處理(OLTP)系統用來即時記錄交易資訊。對這類系統的期望是能夠快速返迴響應資訊(一般在毫秒級)。線上分析處理(OLAP)系統用來分析查詢所儲存的資料。OLAP屬於商業智慧的範疇,資料需要研究、處理和分析,以便收集資訊,進一步驅動商業決策。
關係型資料庫的內部設計由關係演算法決定,這些系統需要預先定義一個模式(schema)和資料要遵守的類型。SQL是與這些系統互動的標準方式。但在對象-關係不匹配問題出現的場合,SQL就不是表達訪問模式的最好方式了。例如目前炙手可熱的大資料領域,關係型資料庫不能很好地工作。
有關大資料常見定義包括:第一,大資料意味著資料足夠大,為了從這些資料中獲得一些真知灼見,你不得不研究它;第二,大資料就是不再適用於單台機器的資料。這些觀點並不完整,我們需要用一種根本上不同的方式來考慮資料,從如何驅動商業價值的角度來考慮資料,這種資料就是大資料。
在大資料領域中,系統需要能夠適應不同種類的資料格式和資料來源,不需要預先嚴格定義模式,並且能夠處理大規模資料。這樣,NoSQL就出現了。
二、NoSQL的定義
NoSQL(NoSQL= Not Only SQL ),意即“不僅僅是SQL”,是一項全新的資料庫革命性運動。NoSQL的擁護者們提倡運用非關係型的資料存放區。大多數資料庫技術不能保證支援ACID(原子性、一致性、隔離性和持久性),而且大部分技術都是開源項目,這些技術作為整體被稱為NoSQL。
三、NoSQL的分類
一般將NoSQL資料庫分為四大類:索引值(Key-Value)儲存資料庫、列儲存資料庫、文檔型資料庫和圖形(Graph)資料庫。它們的資料模型、優缺點、典型應用情境如表1所示。
表1 四大NoSQL資料庫分析
分類 |
資料模型 |
優點 |
缺點 |
典型應用情境 |
索引值(Key-Value)儲存資料庫 |
Key指向Value的索引值對,通常用hash表來實現 |
尋找速度快 |
資料無結構化(通常只被當作字串或者位元據) |
內容緩衝,主要用於處理大量資料的高訪問負載,也用於一些日誌系統等 |
列儲存資料庫 |
以列簇式儲存,將同一列資料存在一起 |
尋找速度快,可擴充性強,更容易進行分布式擴充 |
功能相對局限 |
分布式的檔案系統 |
文檔型資料庫 |
Key-Value對應的索引值對,Value為結構化資料 |
資料結構要求不嚴格,表結構可變(不需要像關係型資料庫一樣需預先定義表結構) |
查詢效能不高,而且缺乏統一的查詢文法 |
Web應用 |
圖形(Graph)資料庫 |
圖結構 |
利用圖結構相關演算法(如最短路徑定址,N度關係尋找等) |
很多時候需要對整個圖做計算才能得出需要的資訊,而且這種結構不太好做分布式的叢集方案 |
社交網路,推薦系統等 |
四、NoSQL的特徵
NoSQL資料庫並沒有一個統一的架構,但是它們都普遍存在表2所示的一些共同特徵。
表2 NoSQL的特徵
特徵 |
描述 |
不需要預定義模式 |
不需事先定義資料模式,預定義表結構等。資料中每條記錄都可能有不同的屬性和格式 |
無共用架構 |
NoSQL往往將資料劃分後儲存在各個本機伺服器上,從而提高了系統的效能 |
彈性可擴充 |
可以在系統啟動並執行時候,動態增加或者刪除結點。不需要停機維護,資料可以自動遷移 |
分區 |
NoSQL資料庫將資料進行分區,將記錄分散在多個節點上面,並且通常分區的同時還要做複製 |
非同步複製 |
NoSQL中的複製,往往是基於日誌的非同步複製。這樣,資料就可以儘快地寫入一個節點,而不會出現網路傳輸遲延 |
BASE |
相對於ACID特性,NoSQL資料庫保證的是BASE特性(BASE是最終一致性和軟事務) |
五、常見的NoSQL資料庫
比較適合採用NoSQL資料庫的場合是:(1)資料模型比較簡單;(2)需要靈活性更強的IT系統;(3)對資料庫效能要求較高;(4)不需要高度的資料一致性;(5)對於給定key,比較容易映射複雜值的環境。
常見的NoSQL資料庫如表3所示。
表3常見的NoSQL資料庫
分類 |
執行個體 |
索引值(Key-Value)儲存資料庫 |
* Riak:一個開源、分布式索引值資料庫,支援資料複製和容錯 * Redis:一個開源的KVStore for Redis資料庫,支援主從式複製、事務,Pub/Sub、Lua指令碼,還支援給Key添加時限 * Dynamo:一個索引值分布式儲存資料庫,直接由亞馬遜Dynamo資料庫實現 * Oracle NoSQL Database:來自Oracle的索引值NoSQL資料庫,支援事務ACID和JSON * Oracle NoSQL Database:具備資料備份和分布式KVStore for Redis系統 * Voldemort:具備資料備份和分布式KVStore for Redis系統 * Aerospike:一個KVStore for Redis資料庫,支援混合記憶體架構,通過強一致性和可調一致性保證資料的完整性 |
列儲存資料庫 |
* Cassandra:支援跨資料中心的資料複製,提供列索引 * HBase:一個開源、分布式、面向列儲存的模型 * Amazon SimpleDB:一個非關係型資料存放區 * Apache Accumulo:有序的、分布式索引值資料存放區,基於Google的BigTable設計 * Hypertable:一個開源、可擴充的資料庫,模仿Bigtable,支援分區 * Azure Tables:為要求大量非結構化資料存放區的應用提供NoSQL效能 |
文檔型資料庫 |
* MongoDB:開源、面向文檔 * CounchDB:一個使用JSON的文檔資料庫,使用Javascript做MapReduce查詢,也是一個使用HTTP的API * Couchbase:基於JSON模型 * RavenDB:一個基於.net語言的面向文檔資料庫 * MarkLogic:用來儲存基於XML和以以文件為主的資訊,支援靈活的模式 |
圖形(Graph)資料庫 |
* Neo4j:一個圖資料庫,支援ACID事務 * InfiniteGraph:用來維持和遍曆對象間的關係,支援分布式資料存放區 * AllegroGraph:結合使用了記憶體和磁碟,提供了高可擴充性,支援SPARQ、RDFS++和Prolog推理 |
六、NoSQL和SQL文法的簡單比較
前面介紹了NoSQL的基本情況,下面以HBase和ORACLE為例,對NoSQL和SQL的文法進行簡單的比較。HBase資料庫被認為是安全特性最完善的NoSQL資料庫產品之一,它被證實是一個強大的工具,尤其是在已經使用Hadoop的場合。如今,它已經是Apache頂級項目,有著眾多的開發人員和興旺的使用者社區。
1.建立表
如果要建立一個表“mytable”,其中包含了一個“info”欄位,那麼:
(1)ORACLE中的文法為:
create table mytable
(
info varchar(30) not null
);
(2)HBase中的文法為:
create 'mytable', 'cf'
該命令建立了一個有一個列族(“cf”)的表“mytable”。
2.寫資料
如果要向表中寫入資料“hello hbase”,那麼:
(1)ORACLE中的文法為:
insert into mytable(info) values('hello hbase');
(2)HBase中的文法為:
put 'mytable', 'first', 'cf:info', 'hello hbase'
該命令在“mytable”表的“first”行中的“cf:info”列對應的資料單元中插入“hello hbase”。
3.讀(查)資料
如果要從表中讀出單條資料,那麼:
(1)ORACLE中的文法為:
select * from mytable where info = 'hello hbase';
(2)HBase中的文法為:
get 'mytable', 'first'
該命令輸出了該行的資料單元。
如果要從表中讀出所有資料,那麼:
(1)ORACLE中的文法為:
select * from mytable;
(2)HBase中的文法為:
scan 'mytable'
該命令輸出了所有資料。
4.刪資料
如果要從表中刪除資料,那麼:
(1)ORACLE中的文法為:
delete from mytable where info = 'hello hbase';
(2)HBase中的文法為:
put 'mytable', 'first', 'cf:info', 'hello hbase1'
該命令用最新的值覆蓋了舊的值,就相當於將原資料刪除了。
5.修改資料
如果要在表中修改資料,那麼:
(1)ORACLE中的文法為:
update mytable set info = 'hello hbase1' where info = 'hellohbase';
(2)HBase中的文法為:
put 'mytable', 'first', 'cf:info', 'hello hbase1'
該命令用最新的值覆蓋了舊的值,就相當於修改了原資料。
6.刪表
如果要刪除表,那麼:
(1)ORACLE中的文法為:
drop table mytable;
(2)HBase中的文法為:
disable 'mytable'
drop 'mytable'
該命令先將表“disable”掉,然後再“drop”掉。
我們可以看到,HBase的文法比較的簡單,因此完全可以將上述所有命令放到一個shell指令碼中,讓命令批量執行。下面,我們來具體操作一下:
第一步,編寫名為“command.sh”的指令碼,其內容如下:
exec /root/zhouzx/hbase-1.0.1/bin/hbase shell <<EOF
create 'mytable', 'cf'
put 'mytable', 'first', 'cf:info', 'hello hbase'
get 'mytable', 'first'
scan 'mytable'
put 'mytable', 'first', 'cf:info', 'hello hbase1'
disable 'mytable'
drop 'mytable'
EOF
第二步,將該指令碼上傳到Linux機器的安裝HBase的使用者下,依次執行“dos2unix command.sh”和“chmod 777command.sh”命令來轉換檔格式和對檔案賦許可權。
第三步,執行“./command.sh”命令,在Linux介面上,我們可以看到如下輸出資訊:
HBase Shell; enter 'help<RETURN>' for list of supportedcommands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.1, r66a93c09df3b12ff7b86c39bc8475c60e15af82d, Fri Apr17 22:14:06 PDT 2015
create 'mytable', 'cf'
0 row(s) in 0.6660 seconds
Hbase::Table - mytable
put 'mytable', 'first', 'cf:info', 'hello hbase'
0 row(s) in 0.1140 seconds
get 'mytable', 'first'
COLUMN CELL
cf:info timestamp=1435807200326, value=hello hbase
1 row(s) in 0.0440 seconds
scan 'mytable'
ROW COLUMN+CELL
first column=cf:info,timestamp=1435807200326, value=hello hbase
1 row(s) in 0.0210 seconds
put 'mytable', 'first', 'cf:info', 'hello hbase1'
0 row(s) in 0.0040 seconds
disable 'mytable'
0 row(s) in 1.1930 seconds
drop 'mytable'
0 row(s) in 0.1940 seconds
整個指令碼執行過程不過幾秒鐘,但我們之前提到的所有HBase命令都包括其中了,由此可見批處理的威力。大家一定要好好體會一下。
七、總結
本文對NoSQL進行了全面的介紹,並比較了它與SQL文法之間的不同。儘管大多數NoSQL資料存放區系統都已被部署到實際應用中,但仍存在以下挑戰性問題需要解決:
第一,已有key-value資料庫產品大多是面向特定應用自治構建的,缺乏通用性。
第二,已有產品支援的功能有限(不支援事務特性),導致其應用具有一定的局限性。
第三,已有一些研究成果和改進的NoSQL資料存放區系統,但它們都是針對不同應用需求而提出的相應解決方案,很少從全域考慮系統的通用性,也沒有形成系列化的研究成果。
第四,缺乏類似關聯式資料庫所具有的強有力的理論(如armstrong公理系統)、技術(如成熟的基於啟發學習法的最佳化策略、兩段封鎖協議等)、標準規範(如SQL語言)的支援。
第五,很多NoSQL資料庫沒有提供內建的安全機制。
隨著雲端運算、移動互連網等技術的發展,大資料廣泛存在,同時也出現了許多雲環境下的新型應用,如社交網路、行動服務、協作編輯等。這些新型應用對海量資料管理或稱雲資料管理系統也提出了新的需求,NoSQL資料庫在這些方面有大展身手的機會。我們有理由相信,NoSQL資料庫的明天會更加的美好!
-------------------------
本人公眾號:zhouzxi,請掃描以下二維碼:
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。