从本篇起,我们就开始对『数据库』相关概念内容的介绍,除了介绍基本的名词概念以及他们的使用情况外,我们还会深入到源码层面去探究一些底层实现,例如索引、视图、触发器等技术在数据库引擎层是如何支持的。
那么第一篇,我们将针对『数据库』做一个最基本的介绍,弄清楚什么是数据库?数据库的类型有哪些?以及使用数据库解决了哪些已知问题?等等。
数据管理的发展历史
数据库概念的演变与诞生经历了漫长的发展过程,从最开始的人工管理,到文件系统,再到数据库系统。每一个阶段的到来都伴随着新的技术突破。
人工管理
20 世纪 50 年代,那是还没有诞生操作系统,计算机只是用于进行大规模复杂运算的机器,所有的数据都是通过外部磁带、卡带手工存储。
导致的问题是,数据只归属于某一个程序,数据没有结构之分,所有的数据都以二进制的方式顺序存储在物理存储设备上,读取时也只能以固定的字节数进行读取,否则就会数据错乱。
除此之外的是,人工管理下的程序员工作量巨大。
文件系统
再往后,操作系统与磁盘的诞生使得数据管理进入了新的阶段,操作系统中实现了专门处理数据管理的模块,可以将虚拟文件映射到磁盘等实际物理设备上。
我们不再需要直接面对二进制,转而可以通过操作系统对数据进行简单的文件读写,管理数据更加方便了。
数据库系统
为了解决多应用、多用户高度共享数据,数据存储的结构化、以及数据的多样化查询和保存,诞生了数据库系统。
数据库相比于文件系统具有如下特点:
- 数据的结构化存储
- 配备有专门的数据库管理系统意味着。
结构化的数据存储意味着我们可以结合面向对象的思想定制化我们程序使用的数据,更方便的读取存储。
专门的数据库管理系统意味着多程序、多用户访问下,仍然能控制并保证数据库中数据的安全性与完整性。
有关数据库和数据库管理系统之间的区别联系,我们后文还会做详尽的解释。
数据库的基本概念
有关数据库技术这块,涉及到几个概念相对容易混淆,这里作一下区分。
第一,什么是数据库?
维基百科上是这样定义的:
好,这个不难理解,数据库就是一个存储结构化数据的仓库。
第二,什么是数据库管理系统?
维基百科这样说:
看似差不多,都能读取存储数据,但实际上他们是上下级关系。
数据库用于存储数据,提供基本的数据查询保存等功能,而数据库管理系统则是在此基础之上封装了额外的功能。
例如:数据的备份与导出,安全访问拦截,甚至使用一个可视化的点击操作映射了基本的命令操作。
简单一句话,数据库管理系统是为了我们更方便的使用数据库而诞生的。
接着我们看一个很重要的点,很多人甚至那些使用数据库很多年的程序员都从未了解过的知识。
数据库的类型
在很多人眼里,就只知道 MySQL,SQLServer,Oracle,听过 Sybase 和 DB2 的人或许都不多,但实际上这些都只是关系型数据库这一种数据库类型的实现者,数据库其实有很多类型。
数据库类型的区分主要参照的指标是数据的存储模型,而常用的数据模型其实有很多:
- 层次模型
- 网状模型
- 关系模型
- 面向对象模型
- 半结构化模型
由于关系模型在很长一段时间内成为主流的数据模型,所以我们也习惯性将数据库类型分为两类,关系型数据库和非关系型数据库。
关系型数据库
这是我们目前至今主流的数据库类型,其对应的数据存储模型就是关系型模型,数据以表格形式存储,字段关联数据。
二维表结构是非常贴近逻辑世界的一个概念,它更容易理解,这是关系型数据库能够成为主流的其中一个重要原因。通过 SQL 进行表与表之间的联接查询非常的方便自然。
缺点也是很显而易见的,海量数据下,对一张表的查询会显得很力不从心,就是因为数据的存储不具备特殊的数据结构,例如有些非关系型数据库的数据存储结构是类似树的结构,就使得查询上具有天然的优势。
所以个人认为,虽然现在是关系型数据库的天下,但相信以后会出现一些优秀的非关系型数据库取代传统的关系型数据库。因为以后必然是大数据的时代,那么海量数据下,传统的关系型数据的效率问题就会被逐渐放大。
非关系型数据库
非关系型数据库也被称为 NoSQL 数据库,NoSQL 并不是某个具体数据库,它泛指所有非关系型数据库。
非关系型数据库种类有很多,我们列举其中较为流行的几种。
1、键值(Key-Value)存储数据库
键值数据库主要是使用一个哈希表,个表中有一个特定的键和一个指针指向特定的数据。Key/value 模型的键值数据库的优势在于,通过键的 hash 码可以快速查询到 value,并且能够应对高并发。
市面上成熟的产品有,Memcached、Redis、MemcacheDB、Berkeley DB。前两个可能比较有名,做缓存的数据库。
2、列存储(Column-oriented)数据库
列存储数据库又被称为面向可扩展性的分布式数据库,它反转了传统的行存储数据库。
传统的行存储数据库:
列存储数据库:
因为是以列字段作为作为表格的行,那么同一行记录取的就是该表中所有记录的的某一个列数据集合,必然是同一类型的数据,要么都是 int 类型,要么都是 varchar 类型。
行存储如果要去表中某一列的所有数据集合,就会复杂的多,所以在大部分场景下,列存储的解析过程更有利于分析大数据的数据分析。
当然了,这只是其中一个区别,他们之间的优劣对比有很多个方面,这里不可能都进行列举,你们可以自行去搜索了解。
最典型的产品应用就是,Hbase,大数据存储用的非常多。
3、面向文档数据库
文档数据库是一种非关系数据库,旨在将半结构化数据存储为文档,其中文档包括 XML、YAML、JSON、BSON、office 文档等。
简而言之,就是将数据保存到以上类似格式的文档中,数据库中的每个记录都是以文档形式存在的,相互之间不再存在关联关系。
典型的应用就是,MongoDB、CouchDB。
至此,对于数据库你也应当有一个基本的认识了,起码得知道它是什么?用来解决什么问题?具有哪些类型?各自类型下面的主流实现者有哪些?
本篇可能非常的枯燥,因为都是理论性的解释,下一篇我们讲讲 Sql 语句。