数据库
数据库发展简史
什么是数据库?简单来说,就是用于方便查找、保存数据的管理软件。数据库的发展历史,可以简单的分为三个阶段:
第一阶段:人工管理阶段
20世纪50年代中期以前,计算机主要用于科学计算,外部存储器只有磁带、卡片和纸带等,还没有磁盘等存储设备,同时, 软件系统也只有汇编语言,还没有数据管理方面的软件,数据处理方式主要是批处理。此时的数据不易保存,没有文件的概念。数据不具有独立性。
第二阶段:文件系统阶段
20世纪50后代后期到60年代中期,计算机开始不仅仅用于科学计算,还用于信息管理方面。随着数据量的增加,数据的存储、检索和维护问题成为了紧迫的需要,数据结构和数据管理技术迅速发展起来。 此时数据已经可以长期保存,由文件系统管理数据,文件的形式已经多样化,数据具有一定的独立性。
第三阶段:数据库管理系统阶段
20世纪60年代后期,数据管理技术进入数据库系统阶段。数据库系统克服了文件系统的缺陷,提供了对数据更高级、更有效的管理。这个阶段的程序和数据的联系通过数据库管理系统(DBMS)来实现。 进入21世纪之后,随着数据量的爆发式增长,各类大数据处理技术也应运而生,从中催生了NoSQL和 NewSQL相关技术。
数据库发展史上的重要事件:
- 1950年以前
- 没有文件概念,数据不具有独立性,没有数据管理方面的软件,外部存储器只有磁带、卡片和纸带,没有磁盘等直接存取设备
- 50年代后期到60年代早期
- 计算机从科学计算拓展到信息管理,数据量快速增加
- 1964
- 世界上第一个数据库系统IDS(Integrated Data Storage)
- 1968
- 世界上第一个层次数据库IMS(Information Management System)诞生于IBM
- 1970
- IBM的研究员Edgar F.Codd提出关系数据模型
- 1974
- IBM推出关系模型的原型系统System R,同年IBM的Ray Boyce和Don Chamberlin提出SQL
- 1976
- Peter Chen提出实体关系模型(Entity-Relationship Model,E-R Model)
- 1979
- 第一个商业数据库Oracle Release 1诞生
- 1989
- Postgres发布第一个版本,采用BSD版权
- 1992
- SQL92国际标准草案形成
- 1995
- Andrew Yu 和 Jolly Chen将Postgres增加SQL支持并开源到互联网上
- 1996
- MySQL发布,开源数据库开始发展
- 2000年代
- 非关系型数据库NoSQL开始盛行,主要包括4种类型:文档数据库、列簇式数据库、键值数据库、图数据库
- 2003-2006
- Google发表了奠定了业界大规模分布式存储系统的理论基础的三篇论文:Google File System、Google MapReduce、Google BigTable
- 2010
- 图数据库Neo4j发布
- 2011
- 合SQL和NoSQL的NewSQL概念出现 结
- 2012
- 全球第一个Global Database, Google Spanner诞生
- 2016
- Amazon发表了代表性的云数据库Aurora
- 2018
- Oracle发表自治数据库(Oracle Autonomous Database)
- 2019
- Google推出自学习数据库SageDB
- ...
数据库模型
数据库按照数据结构来组织、存储和管理数据,实际上,数据库一共有三种模型:
- 层次模型
- 网状模型
- 关系模型
层次模型就是以“上下级”的层次关系来组织数据的一种方式,层次模型的数据结构看起来就像一颗树:
┌─────┐ │ │ └─────┘ │ ┌───────┴───────┐ │ │ ┌─────┐ ┌─────┐ │ │ │ │ └─────┘ └─────┘ │ │ ┌───┴───┐ ┌───┴───┐ │ │ │ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ │ │ │ │ │ └─────┘ └─────┘ └─────┘ └─────┘
网状模型把每个数据节点和其他很多节点都连接起来,它的数据结构看起来就像很多城市之间的路网:
┌─────┐ ┌─────┐ ┌─│ │──────│ │──┐ │ └─────┘ └─────┘ │ │ │ │ │ │ └──────┬─────┘ │ │ │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │─────│ │─────│ │ └─────┘ └─────┘ └─────┘ │ │ │ │ ┌─────┴─────┐ │ │ │ │ │ │ ┌─────┐ ┌─────┐ │ └──│ │─────│ │──┘ └─────┘ └─────┘
关系模型把数据看作是一个二维表格,任何数据都可以通过行号+列号来唯一确定,它的数据模型看起来就是一个Excel表:
┌─────┬─────┬─────┬─────┬─────┐ │ │ │ │ │ │ ├─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ ├─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ ├─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ └─────┴─────┴─────┴─────┴─────┘
关系型数据库
尽管数据库经过几十年的发展,非关系型数据库得到了长足的发展,但关系型数据库仍然是数据库的主流,基于关系模型的关系数据库获得了绝对市场份额。
因为相比层次模型和网状模型,关系模型理解和使用起来最简单。
关系数据库的关系模型是基于数学理论建立的。我们把域(Domain)定义为一组具有相同数据类型的值的集合,给定一组域D1,D2,...,Dn, 它们的笛卡尔集定义为D1×D2×……×Dn={(d1,d2,...,dn)|di∈Di,i=1,2,...,n}, 而D1×D2×……×Dn的子集叫作在域D1,D2,...,Dn上的关系, 表示为R(D1,D2,...,Dn),这里的R表示$#%&^@!&$#;!~%¥%:(……算了,根本讲不明白,大家也不用理解。
基于数学理论的关系模型虽然讲起来挺复杂,但是,基于日常生活的关系模型却十分容易理解。我们以学校班级为例,一个班级的学生就可以用一个表格存起来,并且定义如下:
ID | 姓名 | 班级ID | 性别 | 年龄 | 1 | 小明 | 201 | M | 9 | 2 | 小红 | 202 | F | 8 | 3 | 小军 | 202 | M | 8 | 4 | 小白 | 201 | F | 9 |
---|
其中,班级ID对应着另一个班级表:
ID | 名称 | 班主任 | 201 | 二年级一班 | 王老师 | 202 | 二年级二班 | 李老师 |
---|
通过给定一个班级名称,可以查到一条班级记录,根据班级ID,又可以查到多条学生记录,这样,二维表之间就通过ID映射建立了“一对多”关系。
学生表和班级表在数据库中称为实体,班级表和学生表的一对多的映射称为关系。这样,就建立起了一个实体关系模型(Entity-Relationship)。
数据类型
对于一个关系表,除了定义每一列的名称外,还需要定义每一列的数据类型。关系数据库支持的标准数据类型包括数值、字符串、时间等:
名称 | 类型 | 说明 |
---|---|---|
INT | 整型 | 4字节整数类型,范围约+/-21亿 |
BIGINT | 长整型 | 8字节整数类型,范围约+/-922亿亿 |
REAL | 浮点型 | 4字节浮点数,范围约+/-1038 |
DOUBLE | 浮点型 | 8字节浮点数,范围约+/-10308 |
DECIMAL(M,N) | 高精度小数 | 由用户指定精度的小数,例如,DECIMAL(20,10)表示一共20位,其中小数10位,通常用于财务计算 |
CHAR(N) | 定长字符串 | 存储指定长度的字符串,例如,CHAR(100)总是存储100个字符的字符串 |
VARCHAR(N) | 变长字符串 | 存储可变长度的字符串,例如,VARCHAR(100)可以存储0~100个字符的字符串 |
BOOLEAN | 布尔类型 | 存储True或者False |
DATE | 日期类型 | 存储日期,例如,2018-06-22 |
TIME | 时间类型 | 存储时间,例如,12:20:59 |
DATETIME | 日期和时间类型 | 存储日期+时间,例如,2018-06-22 12:20:59 |
选择数据类型的时候,要根据业务规则选择合适的类型。通常来说,BIGINT能满足整数存储的需求,VARCHAR(N)能满足字符串存储的需求,这两种类型是使用最广泛的。
主流关系数据库
目前,主流的关系数据库主要分为以下几类:
- 商用数据库,例如:Oracle,SQL Server,DB2等;
- 开源数据库,例如:MySQL,PostgreSQL等;
- 桌面数据库,以微软Access为代表,适合桌面应用程序使用;
- 嵌入式数据库,以Sqlite为代表,适合手机应用和桌面程序。