簡析關係型資料庫和非關係型資料庫的比較(上)
關係模型指的就是二維表格模型,而一個關係型資料庫就是由二維表及其之間的聯繫所組成的一個數據組織。下面通過簡單介紹關係型資料庫的優缺點來介紹和認識關係型資料庫。
關係型資料庫的優點
容易理解:二維表結構是非常貼近邏輯世界的一個概念
使用方便:通用的SQL語言使得操作關係型資料庫非常方便
易於維護:豐富的完整性大大減低了數據冗餘和數據不一致的概率
瓶頸:高並發讀寫需求:網站的用戶並發性非常高,往往達到每秒上萬次讀寫請求,對於傳統關係型資料庫來說,硬碟I/O是一個很大的瓶頸;海量數據的高效率讀寫:網站每天產生的數據量是巨大的,對於關係型資料庫來說,在一張包含海量數據的表中查詢,效率是非常低的;高擴展性和可用性:在基於web的結構當中,資料庫是最難進行橫向擴展的,當一個應用系統的用戶量和訪問量與日俱增的時候,資料庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬體和服務節點來擴展性能和負載能力。對於很多需要提供24小時不間斷服務的網站來說,對資料庫系統進行升級和擴展是非常痛苦的事情,往往需要停機維護和數據遷移。
關係型資料庫的相於web應用缺陷
事務一致性:關係型資料庫在對事物一致性的維護中有很大的開銷,而現在很多web2.0系統對事物的讀寫一致性都不高,事務的一致性不那麼重要。
讀寫實時性:關係型資料庫為了維護一致性所付出的巨大代價就是其讀寫性能比較差,對關係資料庫來說,插入一條數據之後立刻查詢,是肯定可以讀出這條數據的,但是對於很多web應用來說,並不要求這麼高的實時性,而並發讀寫能力要求極高,關係型資料庫無法應付,必須用新的一種數據結構存儲來代替關係資料庫。
固定的表結構:擴展性極差,系統的升級,功能的增加,往往意味著數據結構巨大變動,這一點關係型資料庫也難以應付,需要新的結構化數據存儲。
複雜SQL,特別是多表關聯查詢:任何大數據量的web系統,都非常忌諱多個大表的關聯查詢,以及複雜的數據分析類型的複雜SQL報表查詢,從需求以及產品階級角度,就避免了這種情況的產生。往往更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能極大的弱化了。
非關係型資料庫:用於指代那些非關係型的,分散式的,且一般不保證遵循ACID原則的數據存儲系統。
非關係型資料庫提出另一種理念,例如,以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的欄位,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會局限於固定的結構,可以減少一些時間和空間的開銷。使用這種方式,用戶可以根據需要去添加自己需要的欄位,這樣,為了獲取用戶的不同信息,不需要像關係型資料庫中,要對多表進行關聯查詢。僅需要根據id取出相應的value就可以完成查詢。但非關係型資料庫由於很少的約束,他也不能夠提供像SQL所提供的where這種對於欄位屬性值情況的查詢。並且難以體現設計的完整性。他只適合存儲一些較為簡單的數據,對於需要進行較複雜查詢的數據,關係型資料庫顯的更為合適。
註:資料庫事務必須具備ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔離性,Durability持久性。
關係型資料庫和非關係型資料庫比較
關係型資料庫的優勢:
1. 複雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢。
2. 事務支持使得對於安全性能很高的數據訪問要求得以實現。對於這兩類資料庫,對方的優勢就是自己的弱勢,反之亦然。
非關係型資料庫的優勢:
1. 性能NOSQL是基於鍵值對的,可以想像成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高。
2. 可擴展性同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。
非關係型資料庫分類;除了一些共性外,很大一部分都是針對某些特定的應用需求出現的,因此,對於該類應用,具有極高的性能。依據結構化方法以及應用場合的不同,主要分為以下幾類:
面向高性能並發讀寫的key-value資料庫:
key-value資料庫的主要特點即使具有極高的並發讀寫性能,Redis,Tokyo Cabinet,Flare就是這類的代表。
面向海量數據訪問的面向文檔資料庫:
這類資料庫的特點是,可以在海量的數據中快速的查詢數據,典型代表為MongoDB以及CouchDB。
面向可擴展性的分散式資料庫:
這類資料庫想解決的問題就是傳統資料庫存在可擴展性上的缺陷,這類資料庫可以適應數據量的增加以及數據結構的變化。
Hbase的優點
1.列的可以動態增加,並且列為空就不存儲數據,節省存儲空間.
2.Hbase自動切分數據,使得數據存儲自動具有水平scalability.
3.Hbase可以提供高並發讀寫操作的支持
4.對海量數據高效存儲和訪問
5.高可擴展性和高可用性,線性擴展
6.表的格式不是固定的,通過鍵值對存儲,減少時間空間開銷
7.隨機讀寫
8當行數小於10000的時候,開銷和行數成正比。但是超過50000行時,無論是順序還是隨機的插入操作,性能都會逐漸變好
Hbase的缺點
1 不能支持條件查詢,只支持按照Row key來查詢
2 暫時不能支持Master server的故障切換
3 沒有表與表之間的關聯查詢
Redis的優點
1.Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。(Redis只會緩存所有的 key的信息)
2.Redis支持數據的備份,即master-slave模式的數據備份。
3.Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。
4.Redis使用最佳方式是全部數據in-memory。
Redis的缺點
1.Redis不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的IP才能恢復。
2.主機宕機,宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,降低了系統的可用性。
3.redis的主從複製採用全量複製,複製過程中主機會fork出一個子進程對內存做一份快照,並將子進程的內存快照保存為文件發送給從機,這一過程需要確保主機有足夠多的空餘內存。若快照文件較大,對集群的服務能力會產生較大的影響,而且複製過程是在從機新加入集群或者從機和主機網路斷開重連時都會進行,也就是網路波動都會造成主機和從機間的一次全量的數據複製,這對實際的系統運營造成了不小的麻煩。
4.Redis較難支持在線擴容,在集群容量達到上限時在線擴容會變得很複雜。為避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。
memcached的缺點
1、數據是保存在內存當中的,一旦服務進程重啟,數據會全部丟失
2、Memcached以root許可權運行,而且Memcached本身沒有任何許可權管理和認證功能,安全性不足
Redis和memcached比較
1、Redis和Memcache都是將數據存放在內存中,都是內存資料庫。不過memcache還可用於緩存其他東西,例如圖片、視頻等等;
2、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash
3、虛擬內存--Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁碟;
4、過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10;
5、分散式--設定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從;
6、存儲數據安全--memcache掛掉後,數據沒了;redis可以定期保存到磁碟(持久化);
7、災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後可以通過aof恢復;
8、Redis支持數據的備份,即master-slave模式的數據備份。
在下篇,我們將介紹關係型資料庫產品的比較,來通過梳理時下主流資料庫來幫助大家更好地選擇和使用。
推薦閱讀:
TAG:資料庫 |