HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis,三大主流開源 NoSQL 資料庫的 PK 兩大主流傳統 SQL 資料庫,nosqlredismongodb
HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis,三大主流開源 NoSQL 資料庫的 PK 兩大主流傳統 SQL 資料庫
類別 |
HBase |
MongoDB |
MySQL |
Oracle |
Redis |
描述 |
基於 Apache Hadoop 並提供 BigTable 能力的列儲存 |
最受歡迎的文檔儲存資料庫之一 |
廣泛使用的開源 RDBMS |
廣泛使用的 RDBMS |
記憶體中的資料結構儲存,被用作資料庫,緩衝以及訊息中介軟體 |
普及度等級(參考下文的趨勢圖) |
15 級(59.03 分) |
4 級(300.57 分) |
2 級(1277.75 分) |
1 級(1463.37 分) |
10 級(100.65 分) |
資料庫模型 |
列儲存 |
文檔儲存 |
關聯式資料庫系統 |
關聯式資料庫系統 |
鍵-值儲存 |
官網 |
hbase.apache.org |
www.mongodb.org |
www.mysql.com |
www.oracle.com/-us/-products/-database |
redis.io |
技術文檔 |
hbase.apache.org |
docs.mongodb.org/-manual |
dev.mysql.com/-doc |
www.oracle.com/-technetwork/-indexes/-documentation/-index.html |
redis.io/-documentation |
開發人員 |
Apache 軟體基金會 |
MongoDB 公司 |
Oracle |
Oracle |
Salvatore Sanfilippo(Redis 之父) |
首次發行 |
2008 |
2009 |
1995 |
1980 |
2009 |
目前的版本 |
1.1.0.1,2015 年 5 月 |
3.0.5,2015 年 7 月 |
5.6.26,2015 年 7 月 |
12 Release 1 (12.1.0.2),2014 年 7 月 |
3.0.3,2015 年 6 月 |
許可 |
開源 |
開源 |
開源 |
商業 |
開源 |
是否資料庫即服務(DBaaS) |
否 |
否 |
否 |
否 |
否 |
實現語言 |
Java |
C++ |
C 和 C++ |
C 和 C++ |
C |
伺服器作業系統 |
Linux Unix Windows |
Linux OS X Solaris Windows |
FreeBSD Linux OS X Solaris Windows |
AIX HP-UX Linux OS X Solaris Windows z/OS |
BSD Linux OS X Windows |
是否結構化資料 |
自由 |
自由 |
是 |
是 |
自由 |
是否預定義資料類型 |
否 |
是 |
是 |
是 |
部分 |
是否支援 XML |
否 |
|
是 |
是 |
否 |
是否支援二級索引 |
否 |
是 |
是 |
是 |
否 |
是否支援 SQL |
否 |
否 |
是 |
是 |
否 |
API 以及其他訪問方式 |
Java API RESTful HTTP API Thrift |
使用 JSON 的專用協議 |
ADO.NET JDBC ODBC |
ODP.NET Oracle Call Interface (OCI) JDBC ODBC |
專用協議 |
支援的程式設計語言 |
C C# C++ Groovy Java PHP Python Scala |
Actionscript C C# C++ Clojure ColdFusion D Dart Delphi Erlang Go Groovy Haskell Java JavaScript Lisp Lua MatLab Perl PHP PowerShell Prolog Python R Ruby Scala Smalltalk |
Ada C C# C++ D Eiffel Erlang Haskell Java Objective-C OCaml Perl PHP Python Ruby Scheme Tcl |
C C# C++ Clojure Cobol Eiffel Erlang Fortran Groovy Haskell Java JavaScript Lisp Objective C OCaml Perl PHP Python R Ruby Scala Tcl Visual Basic |
C C# C++ Clojure Crystal D Dart Elixir Erlang Fancy Go Haskell Haxe Java JavaScript (Node.js) Lisp Lua MatLab Objective-C OCaml Perl PHP Prolog Pure Data Python R Rebol Ruby Rust Scala Scheme Smalltalk Tcl |
是否支援服務端指令碼 |
是 |
JavaScript |
是 |
PL/SQL |
Lua |
是否支援觸發器 |
是 |
否 |
是 |
是 |
否 |
切分方式 |
分區 |
分區 |
水平切分,使用 MySQL Cluster 或者 MySQL Cluster 進行分區 |
水平切分 |
分區 |
主從複製方式 |
多種主從複製機制 |
主-從複製 |
主-主複製 主-從複製 |
主-主複製 主-從複製 |
主-從複製 |
是否支援 MapReduce |
是 |
是 |
否 |
否 |
否 |
分布式情境下資料一致性方法 |
立即一致 |
最終一致 立即一致 |
|
立即一致 |
最終一致 |
是否支援外鍵 |
否 |
否 |
是 |
是 |
否 |
是否支援事務 |
否 |
否 |
ACID |
ACID |
樂觀鎖機制,原子性執行的命令塊和指令碼 |
是否支援並發 |
是 |
是 |
是 |
是 |
是 |
是否支援持久化儲存 |
是 |
是 |
是 |
是 |
是 |
是否支援記憶體儲存 |
否 |
|
是 |
是 |
是 |
存取控制 |
存取控制清單(ACL) |
基於使用者和角色的存取權限 |
細粒度的使用者存取權限 |
根據 SQL 標準細粒度的存取權限 |
簡單的基於密碼的存取控制 |
附錄一:普及度等級趨勢圖
附錄二:兩張圖告訴你如何在 SQL、NewSQL、NoSQL 之間進行取捨
圖一:Do I Need SQL or Hadoop?
圖二:SQL vs. NewSQL vs. NoSQL
附錄三:Redis 之父 Salvatore Sanfilippo 訪談節選
- Redis 是一個開源的、進階索引值資料庫和資料結構服務程式,其中鍵可以儲存字串、散列、列表、集合和有序集合。
- Redis的核心是用標準ANSI C寫成的,基於一種事件模型。
- 非阻塞複製是Redis的設計目標。
- Redis中的複製是非同步。
- 目前已經為許多語言(包括大部分常用語言)提供了Redis庫。
- C client是唯一官方支援的封裝。
- Redis Pub/Sub 對即時應用非常適合。
- Redis使用者有的將它用作資料庫,有的用作訊息匯流排,也有的用來做cache。
附錄四:NoSQL 資料庫的類型一覽表
NoSQL 資料庫的類型一覽表
資料庫類型 |
描述 |
主流產品 |
有誰在用 |
適用情境 |
不適用情境 |
索引值(Key-Value)資料庫 |
索引值資料庫就像在傳統語言中使用的雜湊表。你可以通過key來添加、查詢或者刪除資料,鑒於使用主鍵訪問,所以會獲得不錯的效能及擴充性。 |
Riak、Redis、Memcached、Amazon’s Dynamo、Project Voldemort |
GitHub (Riak)、BestBuy (Riak)、Twitter (Redis和Memcached)、StackOverFlow (Redis)、 Instagram (Redis)、Youtube (Memcached)、Wikipedia(Memcached) |
儲存使用者資訊,比如會話、設定檔、參數、購物車等等。這些資訊一般都和ID(鍵)掛鈎,這種情景下索引值資料庫是個很好的選擇。 |
1. 取代通過鍵查詢,而是通過值來查詢。Key-Value資料庫中根本沒有通過值查詢的途徑。 2. 需要儲存資料之間的關係。在Key-Value資料庫中不能通過兩個或以上的鍵來關聯資料。 3. 事務的支援。在Key-Value資料庫中故障產生時不可以進行復原。 |
面向文檔(Document-Oriented)資料庫 |
面向文檔資料庫會將資料以文檔的形式儲存。每個文檔都是自包含的資料單元,是一系列資料項目的集合。每個資料項目都有一個名稱與對應的值,值既可以是簡單的資料類型,如字串、數字和日期等;也可以是複雜的類型,如有序列表和關聯對象。資料存放區的最小單位是文檔,同一個表中儲存的文件屬性可以是不同的,資料可以使用XML、JSON或者JSONB等多種形式儲存。 |
MongoDB、CouchDB、RavenDB |
SAP (MongoDB)、Codecademy (MongoDB)、Foursquare (MongoDB)、NBC News (RavenDB) |
1. 日誌。企業環境下,每個應用程式都有不同的日誌資訊。Document-Oriented資料庫並沒有固定的模式,所以我們可以使用它儲存不同的資訊。 2. 分析。鑒於它的弱模式結構,不改變模式下就可以儲存不同的度量方法及添加新的度量。 |
在不同的文檔上添加事務。Document-Oriented資料庫並不支援文檔間的事務,如果對這方面有需求則不應該選用這個解決方案。 |
列儲存(Wide Column Store/Column-Family)資料庫 |
列儲存資料庫將資料儲存在列族(column family)中,一個列族儲存經常被一起查詢的相關資料。舉個例子,如果我們有一個Person類,我們通常會一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會被放入一個列族中,而薪資則在另一個列族中。 |
Cassandra、HBase |
Ebay (Cassandra)、Instagram (Cassandra)、NASA (Cassandra)、Twitter (Cassandra and HBase)、Facebook (HBase)、Yahoo!(HBase) |
1. 日誌。因為我們可以將資料儲存在不同的列中,每個應用程式可以將資訊寫入自己的列族中。 2. 部落格平台。我們儲存每個資訊到不同的列族中。舉個例子,標籤可以儲存在一個,類別可以在一個,而文章則在另一個。 |
1. 如果我們需要ACID事務。Vassandra就不支援事務。 2. 原型設計。如果我們分析Cassandra的資料結構,我們就會發現結構是基於我們期望的資料查詢方式而定。在模型設計之初,我們根本不可能去預測它的查詢方式,而一旦查詢方式改變,我們就必須重新設計列族。 |
圖(Graph-Oriented)資料庫 |
圖資料庫允許我們將資料以圖的方式儲存。實體會被作為頂點,而實體之間的關係則會被作為邊。比如我們有三個實體,Steve Jobs、Apple和Next,則會有兩個“Founded by”的邊將Apple和Next串連到Steve Jobs。 |
Neo4J、Infinite Graph、OrientDB |
Adobe (Neo4J)、Cisco (Neo4J)、T-Mobile (Neo4J) |
1. 在一些關係性強的資料中 2. Recommendation Engine。如果我們將資料以圖的形式表現,那麼將會非常有益於推薦的制定 |
不適合的資料模型。圖資料庫的適用範圍很小,因為很少有操作涉及到整個圖。 |
參考資料
- HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis Popularity
- 一網打盡當下NoSQL類型、適用情境及使用公司
- Redis之父Salvatore Sanfilippo訪談
- 一張圖告訴你是需要 SQL 還是 Hadoop
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。