最近我在研究数据库方面的知识,包括数据库发展历史、分类、使用场景、大数据时代的数据库等等。网上收集了很多资料,整理出来,供感兴趣的同学参考。
为啥我会把发展史和分类放在一起介绍呢?因为数据库发展过程中就已经把数据库分类了。?。
数据库的研究始于20世纪60年代中期,从诞生到现在,在不到半个世纪的时间里,无论从理论上、技术实践上、商业领域应用上都有了很成熟的发展。从我个人理解,数据库发展就分如下3阶段:
计算机刚刚兴起的年代,是没有专门存储数据的库的,基本上所有的数据信息都是以文件的形式存取,也就是文件库。最大的缺点显而易见:没规范、不通用。但也并不是一无是处,优点就是灵活、自定义?。
之前我做过一个项目。这个项目就是做一个自定义操作系统OS。这个系统很轻量,类Linux系统,甚至没有图形界面。作为一个操作系统,数据库肯定得是标配啊。但是,但是我们这个系统是专设备定制的。设备上所用内存64M,空间不够用啊。在轻量级的数据库移植过来也最少4M以上的内存。怎么办?文件存储啊。我们团队就用一个文件实现了类似数据库的功能。基本结构就是这个样子:
关系型数据库具有的优势直到现在也是无可替代的,还在我上大学的时候,接触的数据库就是关系型数据库。关系型数据库擅长小量数据的读写存储、擅长复杂的SQL操作、支持事务机制等等,所以到现在出现了很多的关系型数据库,比如MySQL、SQL Server、Oracle、DB2、SyBase、Informix、PostgreSQL以及Access数据等等,各有优缺点。但他们总体上的优点如下:
1、易于维护:都是使用表结构,格式一致;
2、统一操作:SQL语言通用,可用于一个表以及多个表之间非常复杂的查询;
缺点:
也是相对于技术的进步,关系型数据库不能满足大数据时代的一些业务场景:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
但随着大数据时代的到来和互联网的兴起,传统的RDBMS在一些业务上开始出现问题。首先,对数据库存储的容量要求越来越高,单机无法满足需求,很多时候需要用集群来解决问题,而RDBMS由于要支持join,union等操作,一般不支持分布式集群。其次,在大数据大行其道的今天,很多的数据都“频繁读和增加,不频繁修改”,而RDBMS对所有操作一视同仁,这就带来了优化的空间。另外,互联网时代业务的不确定性导致数据库的存储模式也需要频繁变更,不自由的存储模式增大了运维的复杂性和扩展的难度。
非关系型数据库又称为NoSql。NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。这类数据库主要有这些特点:非关系型的、分布式的、开源的、水平可扩展的。最初的目的是为了大规模web 应用。NoSQL 的拥护者们提倡运用非关系型的数据存储,通常的应用如下特点:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。
常见NoSql有以大致分为4种类型:
存储类型 | 代表数据库 | 特点 |
---|---|---|
列存储 | BigTable、HBase、Cassandra、Amazon SimpleDB、HadoopDB | 按列存储,适用于数据压缩,对一个或者几个字段进行查询的效率较高 |
文档存储 | MongoDB、CouchDB、Perservere、Terrastore、RavenDB | 保证海量数据存储的同时,具有良好的查询性能。用类似json格式进行存储 |
key-value存储 | Redis、SimpleDB | 具有较高的并发读写性能,通过key迅速找到value |
图数存储 | Neo4J、InfoGrid | 图形关系的最佳存储模式 |
xml存储 | BerkereyDB XML | 高效存储xml数据,并支持xml的内部查询语法 |
对象存储 | db4o,versant | 类似面向对象的语法操作数据库,通过对象的方式存取数据 |
每种数据库都是前辈们用了几年甚至十几年搞出来,所以我不可能段时间内就能消化得很透测,也不可能短短几句话就说的透测。下面的数据库介绍更接近于简介,甚至入门都算不上。实际工作中我们也不会面面俱到,把每种数据库都了解的很透测,更重要的是对数据库有一个全局观(便于做业务前期的技术选型),然后具体到某一个数据库深入进去。
Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的 适应高吞吐量的数据库解决方案。
缺点就是不开源,收费,一般人用不起?。
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,后来被 Oracle收购,现在属于Oracle 旗下产品。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
MariaDB base on Mysql,是基于Mysql的一个分支,所以把它和Mysql放在一起谈。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。 过去一年中,大型互联网用户以及Linux发行商纷纷抛弃MySQL,转投MariaDB阵营。MariaDB是目前最受关注的MySQL数据库衍生版,也被视为开源数据库MySQL的替代品。所以说在使用上基本同Mysql,但青出于蓝而胜于蓝,目前MariaDB在很多方面更优于Mysql。
自centos7之后,centos已经不在提供Mysql的下载源管理,而是全面支持MariaDB。
SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS)。我上大学时数据库教程就是SQL Server2000,暴露了我的年龄啊。。后来是SQL Server 2005、SQL Server 2008,现在是SQL Server 2017。对这个数据库没什么好印象,装在电脑上各种蓝屏。。。不知道原因在系统还是数据库。
不关心其优点如何,SQL Server 只能windows上运行,仅这一条,就注定了它的命运。。
PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL。PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。
它的发音问题导致大家宁愿简称它为PG。哈哈。
它的优点是什么呢?PostgreSQL标榜自己是世界上最先进的开源数据库。PostgreSQL的一些粉丝说它能与Oracle相媲美,而且没有那么昂贵的价格和傲慢的客服。PostgreSQL是完全由社区驱动的开源项目。它提供了单个完整功能的版本,而不像MySQL那样提供了多个不同的社区版、商业版与企业版。
之前我带着做过一个基于openfire服务器的即时通讯项目。openfire服务器就预置了两个数据库,mysql和PG。当时负责服务器端的同事跟我说PostgreSQL在事务隔离和集群支持上比MySQL更胜一筹。所以我们选择了PG。
前面提到的几个都是国外的数据库。其实国内也有很多自研的数据库,“made in china”,比如达梦数据库、openbase、金仓数据库、OceanBase等。这里我最想聊的就是阿里巴巴的OceanBase。
OceanBase是阿里集团研发的可扩展的关系数据库,实现了数千亿条记录、数百TB数据上的跨行跨表事务,截止到2012年8月,支持了收藏夹、直通车报表、天猫评价等OLTP和OLAP在线业务,线上数据量已经超过一千亿条。
在这里我最想深挖的一个问题是:阿里这个大的一个商业公司,面对市面上那么多成熟的数据库,为何还要自己搞一个出来?对此问题先发个参考链接:https://baijiahao.baidu.com/s?id=1617083085195972124&wfr=spider&for=pc
其实这本质原因和前一段时间阿里重磅发布其 OpenJDK 发行版 Alibaba Dragonwell一样:无论是开源的数据库还是开源的jdk,当在业务上不能完全满足一个企业要求时,企业就会对其进行修改和定制化,修修改改多了就得面临重构,重构的结果就是oceanbase。这里不得不感慨一下:大公司就是牛气,有钱有技术,开源的东西不好用了干脆就自己搞一个出来。
希望不久的将来,我们做一个web项目的基础是:
“国产中间件+国产数据库+国产操作系统+国产服务器(内置国产cpu)”
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
优势
适用场景
适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。更具体的可参照这篇《Redis 的 5 个常见使用场景》译文。
LevelDB 是由谷歌重量级工程师(Jeff Dean 和 Sanjay Ghemawat)开发的开源项目,它是能处理十亿级别规模 key-value 型数据持久性存储的程序库,开发语言是C++。除了持久性存储,LevelDB 还有一个特点是 —— 写性能远高于读性能(当然读性能也不差)。
对于它的使用,我之前研究过区块链领域的比特币的源码,内部数据库就用的是leveldDB。
HBase 是 Apache Hadoop 中的一个子项目,属于 bigtable 的开源版本,所实现的语言为Java(故依赖 Java SDK)。HBase 依托于 Hadoop 的 HDFS(分布式文件系统)作为最基本存储基础单元。
优势
适用场景
未完待续。。。。。
先下楼打球了?