HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis,三大主流开源 NoSQL 数据库的 PK 两大主流传统 SQL 数据库 Bertha 。 2022-06-07 11:11 237阅读 0赞 <table> HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis,三大主流开源 NoSQL 数据库的 PK 两大主流传统 SQL 数据库 <tbody> <tr> <th>类别</th> <th>HBase</th> <th>MongoDB</th> <th>MySQL</th> <th>Oracle</th> <th>Redis</th> </tr> </tbody> <tbody> <tr> <th>描述</th> <td>基于 Apache Hadoop 并提供 BigTable 能力的列存储</td> <td>最受欢迎的文档存储数据库之一</td> <td>广泛使用的开源 RDBMS</td> <td>广泛使用的 RDBMS</td> <td>内存中的数据结构存储,被用作数据库,缓存以及消息中间件</td> </tr> <tr> <th>普及度等级(参考下文的趋势图)</th> <td>15 级(59.03 分)</td> <td>4 级(300.57 分)</td> <td>2 级(1277.75 分)</td> <td>1 级(1463.37 分)</td> <td>10 级(100.65 分)</td> </tr> <tr> <th>数据库模型</th> <td>列存储</td> <td>文档存储</td> <td>关系数据库系统</td> <td>关系数据库系统</td> <td>键-值存储</td> </tr> <tr> <th>官网</th> <td><a href="http://hbase.apache.org/" rel="nofollow">hbase.apache.org</a></td> <td><a href="http://www.mongodb.org/" rel="nofollow">www.mongodb.org</a></td> <td><a href="http://www.mysql.com/" rel="nofollow">www.mysql.com</a></td> <td><a href="http://www.oracle.com/us/products/database/" rel="nofollow">www.oracle.com/-us/-products/-database</a></td> <td><a href="http://redis.io/" rel="nofollow">redis.io</a></td> </tr> <tr> <th>技术文档</th> <td><a href="http://hbase.apache.org/" rel="nofollow">hbase.apache.org</a></td> <td><a href="http://docs.mongodb.org/manual/" rel="nofollow">docs.mongodb.org/-manual</a></td> <td><a href="http://dev.mysql.com/doc/" rel="nofollow">dev.mysql.com/-doc</a></td> <td><a href="http://www.oracle.com/technetwork/indexes/documentation/index.html" rel="nofollow">www.oracle.com/-technetwork/-indexes/-documentation/-index.html</a></td> <td><a href="http://redis.io/documentation" rel="nofollow">redis.io/-documentation</a></td> </tr> <tr> <th>开发者</th> <td>Apache 软件基金会</td> <td>MongoDB 公司</td> <td>Oracle</td> <td>Oracle</td> <td>Salvatore Sanfilippo(Redis 之父)</td> </tr> <tr> <th>首次发行</th> <td>2008</td> <td>2009</td> <td>1995</td> <td>1980</td> <td>2009</td> </tr> <tr> <th>当前版本</th> <td>1.1.0.1,2015 年 5 月</td> <td>3.0.5,2015 年 7 月</td> <td>5.6.26,2015 年 7 月</td> <td>12 Release 1 (12.1.0.2),2014 年 7 月</td> <td>3.0.3,2015 年 6 月</td> </tr> <tr> <th>许可</th> <td>开源</td> <td>开源</td> <td>开源</td> <td>商业</td> <td>开源</td> </tr> <tr> <th>是否数据库即服务(DBaaS)</th> <td>否</td> <td>否</td> <td>否</td> <td>否</td> <td>否</td> </tr> <tr> <th>实现语言</th> <td>Java</td> <td>C++</td> <td>C 和 C++</td> <td>C 和 C++</td> <td>C</td> </tr> <tr> <th>服务器操作系统</th> <td>Linux<br> Unix<br> Windows</td> <td>Linux<br> OS X<br> Solaris<br> Windows</td> <td>FreeBSD<br> Linux<br> OS X<br> Solaris<br> Windows</td> <td>AIX<br> HP-UX<br> Linux<br> OS X<br> Solaris<br> Windows<br> z/OS</td> <td>BSD<br> Linux<br> OS X<br> Windows</td> </tr> <tr> <th>是否结构化数据</th> <td>自由</td> <td>自由</td> <td>是</td> <td>是</td> <td>自由</td> </tr> <tr> <th>是否预定义数据类型</th> <td>否</td> <td>是</td> <td>是</td> <td>是</td> <td>部分</td> </tr> <tr> <th>是否支持 XML</th> <td>否</td> <td> </td> <td>是</td> <td>是</td> <td>否</td> </tr> <tr> <th>是否支持二级索引</th> <td>否</td> <td>是</td> <td>是</td> <td>是</td> <td>否</td> </tr> <tr> <th>是否支持 SQL</th> <td>否</td> <td>否</td> <td>是</td> <td>是</td> <td>否</td> </tr> <tr> <th>API 以及其他访问方式</th> <td>Java API<br> RESTful HTTP API<br> Thrift</td> <td>使用 JSON 的专用协议</td> <td>ADO.NET<br> JDBC<br> ODBC</td> <td>ODP.NET<br> Oracle Call Interface (OCI)<br> JDBC<br> ODBC</td> <td>专用协议</td> </tr> <tr> <th>支持的编程语言</th> <td>C<br> C#<br> C++<br> Groovy<br> Java<br> PHP<br> Python<br> Scala</td> <td>Actionscript <br> C<br> C#<br> C++<br> Clojure <br> ColdFusion <br> D <br> Dart <br> Delphi <br> Erlang<br> Go <br> Groovy <br> Haskell<br> Java<br> JavaScript<br> Lisp <br> Lua <br> MatLab <br> Perl<br> PHP<br> PowerShell <br> Prolog <br> Python<br> R <br> Ruby<br> Scala<br> Smalltalk</td> <td>Ada<br> C<br> C#<br> C++<br> D<br> Eiffel<br> Erlang<br> Haskell<br> Java<br> Objective-C<br> OCaml<br> Perl<br> PHP<br> Python<br> Ruby<br> Scheme<br> Tcl</td> <td>C<br> C#<br> C++<br> Clojure<br> Cobol<br> Eiffel<br> Erlang<br> Fortran<br> Groovy<br> Haskell<br> Java<br> JavaScript<br> Lisp<br> Objective C<br> OCaml<br> Perl<br> PHP<br> Python<br> R<br> Ruby<br> Scala<br> Tcl<br> Visual Basic</td> <td>C<br> C#<br> C++<br> Clojure<br> Crystal<br> D<br> Dart<br> Elixir<br> Erlang<br> Fancy<br> Go<br> Haskell<br> Haxe<br> Java<br> JavaScript (Node.js)<br> Lisp<br> Lua<br> MatLab<br> Objective-C<br> OCaml <br> Perl<br> PHP<br> Prolog<br> Pure Data<br> Python<br> R<br> Rebol<br> Ruby<br> Rust<br> Scala<br> Scheme<br> Smalltalk<br> Tcl</td> </tr> <tr> <th>是否支持服务端脚本</th> <td>是</td> <td>JavaScript</td> <td>是</td> <td>PL/SQL</td> <td>Lua</td> </tr> <tr> <th>是否支持触发器</th> <td>是</td> <td>否</td> <td>是</td> <td>是</td> <td>否</td> </tr> <tr> <th>切分方式</th> <td>分片</td> <td>分片</td> <td>水平切分,使用 MySQL Cluster 或者 MySQL Cluster 进行分片</td> <td>水平切分</td> <td>分片</td> </tr> <tr> <th>主从复制方式</th> <td>多种主从复制机制</td> <td>主-从复制</td> <td>主-主复制<br> 主-从复制</td> <td>主-主复制<br> 主-从复制</td> <td>主-从复制</td> </tr> <tr> <th>是否支持 MapReduce</th> <td>是</td> <td>是</td> <td>否</td> <td>否</td> <td>否</td> </tr> <tr> <th>分布式场景下数据一致性方法</th> <td>立即一致</td> <td>最终一致<br> 立即一致</td> <td> </td> <td>立即一致</td> <td>最终一致</td> </tr> <tr> <th>是否支持外键</th> <td>否</td> <td>否</td> <td>是</td> <td>是</td> <td>否</td> </tr> <tr> <th>是否支持事务</th> <td>否</td> <td>否</td> <td>ACID</td> <td>ACID</td> <td>乐观锁机制,原子性执行的命令块和脚本</td> </tr> <tr> <th>是否支持并发</th> <td>是</td> <td>是</td> <td>是</td> <td>是</td> <td>是</td> </tr> <tr> <th>是否支持持久化存储</th> <td>是</td> <td>是</td> <td>是</td> <td>是</td> <td>是</td> </tr> <tr> <th>是否支持内存存储</th> <td>否</td> <td> </td> <td>是</td> <td>是</td> <td>是</td> </tr> <tr> <th>访问控制</th> <td>访问控制列表(ACL)</td> <td>基于用户和角色的访问权限</td> <td>细粒度的用户访问权限</td> <td>根据 SQL 标准细粒度的访问权限</td> <td>简单的基于密码的访问控制</td> </tr> </tbody> </table> **附录一:普及度等级趋势图** ![DB-Engines Ranking - Trend of HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis Popularity.png][] **附录二:两张图告诉你如何在 SQL、NewSQL、NoSQL 之间进行取舍** 图一:Do I Need SQL or Hadoop? ![图一:Do I Need SQL or Hadoop?][Do I Need SQL or Hadoop] 图二:SQL vs. NewSQL vs. NoSQL ![图二:SQL vs. NewSQL vs. NoSQL][SQL vs. NewSQL vs. NoSQL] **附录三:Redis 之父 Salvatore Sanfilippo 访谈节选** * Redis 是一个开源的、高级键值数据库和数据结构服务程序,其中键可以保存字符串、散列、列表、集合和有序集合。 * Redis 的内核是用标准 ANSI C 写成的,基于一种事件模型。 * 非阻塞复制是 Redis 的设计目标。 * Redis 中的复制是异步的。 * 目前已经为许多语言(包括大部分常用语言)提供了 Redis 库。 * C client 是唯一官方支持的包装。 * Redis Pub/Sub 对实时应用非常适合。 * **Redis 用户有的将它用作数据库,有的用作消息总线,也有的用来做 cache**。 **附录四:NoSQL 数据库的类型一览表** <table> NoSQL 数据库的类型一览表 <tbody> <tr> <th>数据库类型</th> <th>描述</th> <th>主流产品</th> <th>有谁在用</th> <th>适用场景</th> <th>不适用场景</th> </tr> </tbody> <tbody> <tr> <th>键值(Key-Value)数据库</th> <td>键值数据库就像在传统语言中使用的哈希表。你可以通过 key 来添加、查询或者删除数据,鉴于使用主键访问,所以会获得不错的性能及扩展性。</td> <td>Riak、Redis、Memcached、Amazon’s Dynamo、Project Voldemort</td> <td>GitHub (Riak)、BestBuy (Riak)、Twitter (Redis和Memcached)、StackOverFlow (Redis)、 Instagram (Redis)、Youtube (Memcached)、Wikipedia(Memcached)</td> <td>储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和 ID(键)挂钩,这种情景下键值数据库是个很好的选择。</td> <td>1. 取代通过键查询,而是通过值来查询。Key-Value 数据库中根本没有通过值查询的途径。<br> 2. 需要储存数据之间的关系。在 Key-Value 数据库中不能通过两个或以上的键来关联数据。<br> 3. 事务的支持。在 Key-Value 数据库中故障产生时不可以进行回滚。</td> </tr> <tr> <th>面向文档(Document-Oriented)数据库</th> <td>面向文档数据库会将数据以文档的形式储存。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用 XML、JSON 或者 JSONB 等多种形式存储。</td> <td>MongoDB、CouchDB、RavenDB</td> <td>SAP (MongoDB)、Codecademy (MongoDB)、Foursquare (MongoDB)、NBC News (RavenDB)</td> <td>1. 日志。企业环境下,每个应用程序都有不同的日志信息。Document-Oriented 数据库并没有固定的模式,所以我们可以使用它储存不同的信息。<br> 2. 分析。鉴于它的弱模式结构,不改变模式下就可以储存不同的度量方法及添加新的度量。</td> <td>在不同的文档上添加事务。Document-Oriented 数据库并不支持文档间的事务,如果对这方面有需求则不应该选用这个解决方案。</td> </tr> <tr> <th>列存储(Wide Column Store/Column-Family)数据库</th> <td>列存储数据库将数据储存在列族(column family)中,一个列族存储经常被一起查询的相关数据。举个例子,如果我们有一个 Person 类,我们通常会一起查询他们的姓名和年龄而不是薪资。这种情况下,姓名和年龄就会被放入一个列族中,而薪资则在另一个列族中。</td> <td>Cassandra、HBase</td> <td>Ebay (Cassandra)、Instagram (Cassandra)、NASA (Cassandra)、Twitter (Cassandra and HBase)、Facebook (HBase)、Yahoo!(HBase)</td> <td>1. 日志。因为我们可以将数据储存在不同的列中,每个应用程序可以将信息写入自己的列族中。<br> 2. 博客平台。我们储存每个信息到不同的列族中。举个例子,标签可以储存在一个,类别可以在一个,而文章则在另一个。</td> <td>1. 如果我们需要 ACID 事务。Vassandra 就不支持事务。<br> 2. 原型设计。如果我们分析Cassandra 的数据结构,我们就会发现结构是基于我们期望的数据查询方式而定。在模型设计之初,我们根本不可能去预测它的查询方式,而一旦查询方式改变,我们就必须重新设计列族。</td> </tr> <tr> <th>图(Graph-Oriented)数据库</th> <td>图数据库允许我们将数据以图的方式储存。实体会被作为顶点,而实体之间的关系则会被作为边。比如我们有三个实体,Steve Jobs、Apple 和 Next,则会有两个“Founded by”的边将 Apple 和 Next 连接到 Steve Jobs。</td> <td>Neo4J、Infinite Graph、OrientDB</td> <td>Adobe (Neo4J)、Cisco (Neo4J)、T-Mobile (Neo4J)</td> <td>1. 在一些关系性强的数据中<br> 2. 推荐引擎。如果我们将数据以图的形式表现,那么将会非常有益于推荐的制定</td> <td>不适合的数据模型。图数据库的适用范围很小,因为很少有操作涉及到整个图。</td> </tr> </tbody> </table> **参考资料** * [HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis Popularity][] * [一网打尽当下NoSQL类型、适用场景及使用公司][NoSQL] * [Redis之父Salvatore Sanfilippo访谈][Redis_Salvatore Sanfilippo] * [一张图告诉你是需要 SQL 还是 Hadoop][SQL _ Hadoop] 转自:http://blog.csdn.net/defonds/article/details/48471087 [DB-Engines Ranking - Trend of HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis Popularity.png]: /images/20220607/561ed95769944ffb87df1e1d2ac1895b.png [Do I Need SQL or Hadoop]: /images/20220607/72d5252c18b14621825fa1e7ac2ecf23.png [SQL vs. NewSQL vs. NoSQL]: /images/20220607/71c1168de9194676bc0ec751f62cfa76.png [HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis Popularity]: http://db-engines.com/en/system/HBase%3BMongoDB%3BMySQL%3BOracle%3BRedis [NoSQL]: http://www.csdn.net/article/2013-07-24/2816330-how-to-choose-nosql-db [Redis_Salvatore Sanfilippo]: http://www.csdn.net/article/2011-01-18/290347 [SQL _ Hadoop]: http://blog.csdn.net/defonds/article/details/47005827
还没有评论,来说两句吧...