# 数据库分类

## 关系型数据库介绍

关系数据库（Relational database）是创建在关系模型基础上的数据库。它借助于集合代数等数学概念和方法来处理数据库中的数据。它的模型是把复杂的数据结构归结为简单的二元关系（即二维表格形式）。在关系数据库中，对数据的操作几乎全部建立在一个或多个关系表格上，通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理

### Oracle

Oracle 数据库（Oracle Database）又名 Oracle Oracle 由至少一个表空间和数据库模式对象组成。模式是对象的集合，而模式对象是直接引用数据库数据的逻辑结构。模式对象包括这样一些结构：表、视图、序列、存储过程、同义词、索引、簇和数据库链等。逻辑存储结构包括表空间、段和范围，用于描述怎样使用数据库的物理空间。 段（Segment）是表空间中一个指定类型的逻辑存储结构，它由一个或多个范围组成，段将占用并增长存储空间数据段：用来存放表数据索引段：用来存放表索引临时段：用来存放中间结果回滚段：用于出现异常时，恢复事务 范围（Extent）是数据库存储空间分配的逻辑单位，一个范围由许多连续的数据块组成，范围是由段依次分配的，分配的第一个范围称为初始范围，以后分配的范围称为增量范围

### MySQL

MySQL（My Structure Quest Language）原本是一个开放源代码的关系数据库管理系统，使用 C 和 C++编写，后被甲骨文公司（Oracle）收购，成为 Oracle 旗下产品。MySQL 在过去由于性能高、成本低、可靠性好，已经成为最流行的开源数据库，因此被广泛地应用在 Internet 上的中小型网站中。随着 MySQL 的不断成熟，它也逐渐用于更大规模的网站和应用，比如维基百科（维基百科已于 2013 年正式宣布将从 MySQL 迁移到 MariaDB 数据库）、Google 和 Facebook 等网站，非常流行的开源软件组合 LAMP（Linux-Apache-MySQL-PHP）中的“M”指的就是 MySQL 索引是一种特殊的文件，它们包含着对数据表里所有记录的引用指针。索引不是万能的，它可以加快数据检索操作，但会使数据修改操作变慢。每修改数据记录，索引就必须刷新一次。为了在某种程度上弥补这一缺陷，许多 SQL 命令都有一个 DELAY\_KEY\_WRITE 项。这个选项的作用是暂时制止 MySQL 在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新，对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合 DELAY\_KEY\_WRITE 选项的作用将非常明显。另外，索引还会在硬盘上占用相当大的空间。因此应该只为最经常查询和最经常排序的数据列建立索引。注意，如果某个数据列包含许多重复的内容，为它建立索引就没有太大的实际效果。从理论上讲，完全可以为数据表里的每个字段分别建一个索引，但 MySQL 把同一个数据表里的索引总数限制为 16 个

### MariaDB

MariaDB（名称来自 Michael Widenius 的女儿 Maria 的名字）数据库管理系统是 MySQL 的一个分支，主要由开源社区在维护，采用 GPL 授权许可。开发这个分支的原因之一是：甲骨文公司收购了 MySQL 后，有将 MySQL 闭源的潜在风险，因此社区采用分支的方式来避开这个风险 MariaDB 基于事务的 Maria 存储引擎，替换了 MySQL 的 MyISAM 存储引擎，它使用了 Percona 的 XtraDB，InnoDB 的变体

### SQL Server

Microsoft SQL Server 是由美国微软公司所推出的关系数据库解决方案，数据库的内置语言原本是采用美国标准局（ANSI）和国际标准组织（ISO）所定义的 SQL 语言。SQL Server 一开始并不是微软自己研发的产品，而是当时为了要和 IBM 竞争时，与 Sybase 合作所产生的，其最早的发展者是 Sybase，与 Sybase 终止合作关系后，SQL Server 版本均由微软自行研发

### Access

Microsoft Office Access 是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个关系数据库管理系统。Access 能够访问 Access/Jet、Microsoft SQL Server、Oracle 数据库，或者任何 ODBC（Open Database Connectivity）兼容数据库内的数据。虽然它支持部分面向对象技术，但是未能成为一种完整的面向对象开发工具。 它拥有的报表创建功能能够处理任何它能够访问的数据源。Access 提供功能参数化的查询，这些查询和 Access 表格可以被诸如 VB6 和.NET 的其它程序通过 DAO 或 ADO 访问；它的数据文件不能突破 2G 的限制，它的结构化查询语言(JET SQL)能力有限，不适合大型数据库处理应用

## 非关系型数据库介绍

随着互联网 web2.0 网站的兴起，传统的关系数据库在应付 web2.0 网站，特别是超大规模和高并发的 SNS 类型的 web2.0 纯动态网站已经显得力不从心，暴露了很多难以克服的问题，而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSql 数据库在特定的场景下可以发挥出难以想象的高效率和高性能，它是作为对传统关系型数据库的一个有效的补充。NoSQL(NoSQL = Not Only SQL )，意即“不仅仅是 SQL”，是一项全新的数据库革命性运动，早期就有人提出，发展至 2009 年趋势越发高涨。NoSQL 的拥护者们提倡运用非关系型的数据存储，相对于铺天盖地的关系型数据库运用，这一概念无疑是一种全新的思维的注入。

### KV 存储数据库

* Redis

Redis 是一个使用 ANSI C 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。Redis 的外围由一个键、值映射的字典构成。与其他非关系数据库主要不同在于：Redis 中值的类型不仅限于字符串，还支持抽象数据类型：字符串列表、无序不重复的字符串集合、有序不重复的字符串集合、键、值都为字符串的哈希表。值的类型决定了值本身支持的操作。Redis 支持不同无序、有序的列表，无序、有序的集合间的交集、并集等高级服务器端原子操作。Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件，并且在此基础上实现了 master-slave(主从)同步。数据可以从主服务器向任意数量的从服务器上同步，从服务器可以是关联其他从服务器的主服务器。这使得 Redis 可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制，使得从数据库在任何地方同步树时，可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助

* Memcached

Memcached 是一个高性能的分布式内存对象缓存系统，用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数，从而提高动态、数据库驱动网站的速度。是 Danga Interactive 为了 LiveJournal 所发展的，但被许多软件（如 MediaWiki）所使用。这是一套开放源代码软件，以 BSD license 授权协议发布。Memcached 的 API 使用三十二比特的循环冗余校验（CRC-32）计算键值后，将数据分散在不同的机器上。当表格满了以后，接下来新增的数据会以 LRU 机制替换掉。由于 Memcached 通常只是当作缓存系统使用，所以使用 Memcached 的应用程序在写回较慢的系统时（像是后端的数据库）需要额外的代码更新 Memcached 内的数据

### 文档存储数据库

面向文档的数据库（Document-oriented DataBase）是一种被设计用于储存、检索和管理文档导向信息（也称为半结构化数据）的计算机程序。文档导向的数据库是 NoSQL 数据库的一个主要类别，文档导向的数据库的普及程度已经随着 NoSQL 本身被不断使用而有所增长。XML 数据库是针对 XML 文件做了优化的文档导向的数据库的子类。文档存储支持对结构化数据的访问，不同于关系模型的是，文档存储没有强制的架构。事实上，文档存储以封包键值对的方式进行存储。在这种情况下，应用对要检索的封包采取一些约定，或者利用存储引擎的能力将不同的文档划分成不同的集合，以管理数据。与关系模型不同的是，文档存储模型支持嵌套结构；与键值存储不同的是，文档存储关心文档的内部结构

* MongoDB

MongoDB 是一个基于分布式文件存储的数据库，由 C++语言编写，旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品，是非关系数据库当中功能最丰富，最像关系数据库的。他支持的数据结构非常松散，是类似 JSON（JavaScript Object Notation）的 BSON（Binary Serialized Document Format）格式，因此可以存储比较复杂的数据类型。Mongo 最大的特点是他支持的查询语言非常强大，其语法有点类似于面向对象的查询语言，几乎可以实现类似关系数据库单表查询的绝大部分功能，而且还支持对数据建立索引。它使用内存映射文件, 32 位系统上限制大小为 2GB 的数据（64 位支持更大的数据）

* CouchDB

Apache CouchDB（Cluster Of Unreliable Commodity Hardware DataBase）是一个开源的面向文档的数据库管理系统，它是一个使用 JSON 作为存储格式，JavaScript 作为查询语言，MapReduce 和 HTTP 作为 API 的 NoSQL 数据库。不同于关系型数据库，CouchDB 没有将数据和关系存储在表格里。替代的，一个应用程序可能会访问多个数据库，每个数据库是一个独立的文档集合，每一个文档维护其自己独立的数据和自包涵的 schema。CouchDB 实现了一个多版本并发控制（MVCC）形式，用来避免在数据库写操作的时候对文件进行加锁，冲突留给应用程序去解决。解决一个冲突的通用操作的是首先合并数据到其中一个文档，然后删除旧的数据

### 列存储数据库

列式数据库是以列相关存储架构进行数据存储的数据库，主要适合于批量数据处理和即时查询；与之对应的是行式数据库，数据以行相关的存储体系架构进行空间分配，主要适合于小批量的数据处理，常用于联机事务型数据处理 数据库以行、列的二维表的形式存储数据，但是却以一维字符串的方式存储。列式数据库把一列中的数据值串在一起存储起来，然后再存储下一列的数据；行式数据库把一行中的数据值串在一起存储起来，然后再存储下一行的数据

* HBase

Apache HBase 最初是 Powerset 公司为了处理自然语言搜索产生的海量数据而开展的项目。不过现在它已经是 Apache 基金会的顶级项目，它是一个开源的非关系型分布式数据库（NoSQL），参考了谷歌的 BigTable 建模，实现的编程语言为 Java，运行于 HDFS 文件系统之上，为 Hadoop 提供类似于 BigTable 规模的服务。因此，它可以容错地存储海量稀疏的数据。它在列上实现了 BigTable 论文提到的压缩算法、内存操作和布隆过滤器。HBase 的表能够作为 MapReduce 任务的输入和输出，可以通过 Java API 来访问数据，也可以通过 REST、Avro 或者 Thrift 的 API 来访问

* Cassandra

Apache Cassandra（社区内一般简称为 C\*）是一套开源分布式 NoSQL 数据库系统。它最初由 Facebook 开发，用于储存收件箱等简单格式数据，是一种流行的分布式结构化数据存储方案。它的数据并不存储在分布式文件系统如 GFS 或 HDFS 中，而是直接存于本地。

* ClickHouse

ClickHouse 是用于联机分析（即 OLAP，OnLineAnalyticalProcessing）的列式数据库管理系统 DBMS。OLAP 与 OLTP 是相对的，OLAP 主要是用于读取数据、进行数据分析，辅助运营决策分析；OLTP（OnLineTransaction Processing）联机事务处理是进行事务的增删改查操作，比如在电商系统中进行商品的购买、库存减少等。

### 图数据库

* FlockDB

FlockDB 是 Twitter 为进行关系数据分析而构建的。FlockDB 迄今为止还没有稳定的版本，对于它是否是一个真正的图形数据库，尚有争议。FlockDB 和其它图形数据库（如 Neo4j、OrientDB）的区别在于图的遍历，Twitter 的数据模型不需要遍历社交图谱

* Neo4j

Neo4j 是一个流行的图形数据库，它是开源的。最近，Neo4j 的社区版已经由遵循 AGPL 许可协议转向了遵循 GPL 许可协议。尽管如此，Neo4j 的企业版依然使用 AGPL 许可。Neo4j 基于 Java 实现，兼容 ACID 特性，也支持其他编程语言，如 Ruby 和 Python
