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
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。