如果我们把数据比作“米”,数据库就是“米仓”。没错,从标准定义来讲,数据库就是按照数据结构来组织,存储和管理数据的仓库。
- 数据库的设计初衷?
就像米多了要修建米仓一样,在操作系统出现之后,随着计算机应用范围的扩大、需要处理的数据迅速膨胀。
起初,数据与程序一样,以简单的文件作为主要存储形式。以这种方式组织的数据在逻辑上更简单,但可扩展性差,访问这种数据的程序需要了解数据的具体组织格式。当系统数据量大或者用户访问量大时,应用程序还需要解决数据的完整性、一致性以及安全性等一系列的问题。
因此,必须开发出一种系统软件,它应该能够像操作系统屏蔽了硬件访问复杂性那样,屏蔽数据访问的复杂性。由此产生了数据管理系统,即数据库。
- 数据库很必要吗?
答案是肯定的。刘慈欣的小说《三体》中有这样一段描述:
下面,贯穿人列计算机的系统总线上的轻转兵快速运动起来,总线立刻变成了一条湍急的河流.这河流沿途又分成无数条细小的支流,渗入到各个模块阵列之中。很快,黑白旗的涟漪演化成汹涌的浪潮,激荡在整块主板上。中央的CPU区激荡最为剧烈,像一片燃烧的火药。突然,仿佛火药燃尽,CPU区的扰动渐渐平静下来,最后竟完全静止了,以它为圆心,这静止向各个方向飞快扩散开来,像快速封冻的海面,最后整块主板大部分静止了,其间只有一些零星的死循环在以不变的节奏没有生气地闪动着,显示阵列中出现了闪动的红色。 ——《三体》·刘慈欣
他描述了这样的一个场景,三千万个人组成了一个计算机来进行计算工作,一个人只表示一个比特位。
虽然现实没这么夸张,但是确实存在过由人为计算单位组成的计算机的。早在 1920 年代的美国,由 2 万人组成的计算机器管理着全国 7000 万人的指纹数据,主要用于出入境指纹收集。
没有数据库,用这种方式去查询信息,无疑是一种巨大的资源消耗。单从“有用”的角度出发看,数据库很必要,它就是来解决信息的插入和查询的。
对于数据库,你可以不熟练掌握,但一定要知道它的一些基本知识,往下看吧。
数据库分类
目前数据库主要分为传统的关系型数据库(SQL)和非关系型数据库(NoSQL),当然还有近几年新出现的 NewSQL 新型数据库、分布式数据库等,暂时先不作额外拓展。
其中最关键的就是关系型数据库和非关系型数据库。
- 什么是关系型数据库?
传统的关系型数据库有着悠久的历史,从上世纪60年代开始就已经在航空领域发挥作用。因为其严谨的一致性以及通用的关系型数据模型接口,收获了很大一批的用户。
关系型数据库把数据以表的形式进行储存,然后再各个表之间建立关系,通过这些表之间的关系来操作不同表之间的数据。
常见的关系型数据库有 MySQL、Oracle、PostgreSQL 等等。
举个例子:课程管理系统的学生信息表
- 什么是非关系型数据库?
到了 2000 年代,由于互联网应用的兴起,互联网应用需要支持大规模的并发用户,并且要保持永远在线。但是传统的关系型数据库却因为无法支持如此大规模数据和访问量而成为了整个系统的瓶颈。
最简单直接的办法是不断升级硬件系统,使用更多的CPU,内存和硬盘。但是这种方法只是提高了性能,并且呈现明显的收益递减效应。更糟糕的是,将数据库从一个机器迁移到另一个机器是一个比较复杂的过程,通常需要较长的停机时间。而这对于 Web 应用来说是不可接受的。
这些问题引发了 2000 年代 NoSQL 的诞生。NoSQL 的关键是它们放弃了传统关系型数据库的强事务保证和关系模型,通过所谓最终一致性和非关系数据模型(例如键值对,图,文档)来提高 Web 应用所注重的高可用性和可扩展性。
相比于关系型数据库,表与表之间是有关系的,利用表与表之间的关系进行各种操作。NoSQL 没有固定的表结构,且数据之间不存在表与表之间的关系,数据之间可以是独立的,因此 NoSQL 也可以用于分布式系统上。
举个例子:NoSQL 中有个大名鼎鼎的代表 —— Redis,它是一个非常快速的非关系类型的 Key-Value 数据库,还记得我们讲过,散列表的最大优先就是检索速度快,所以 Redis 常被用做缓存。
MySQL
MySQL 就是最流行的开源数据库,它的特性有:性能高、成本低、可靠性好,被大规模应用在各大网站或 app 中。
接下来引入 MySQL 数据库的一些主要概念以及重要命令,需要重点关注:
- 概念
主键: 用来执行每个表的关键性数据,并且,每个表中只有一个主键;
外键: 这应该是 MySQL,使用外键来关联不同表;
复合键: 将多个键组合一起来作为索引值。一般用于复合索引;
索引: 借用一组值,来对表进行排序,可以比作书的目录;
事务:是指作为单个逻辑工作单位执行的一系列操作,要么完全的执行,要么完全的不执行; - 命令
创建数据库:
create database db1;
- 创建表:
create table student( id int, name varchar(32), age int , score double(4,1), birthday date, insert_time timestamp );
- 插入数据:
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
- 删除数据:
delete from 表名 where 列名 = 值;
- 查询语句:
// 查询年龄大于等于20 小于等于30 SELECT * FROM student WHERE age >= 20 && age <=30;
- 排序:
// 默认升序 SELECT * FROM person ORDER BY math;
- 分组查询:
// 按照性别分组。分别查询男、女同学的平均分 SELECT sex , AVG(math) FROM student GROUP BY sex;
- 分页查询:
// 每页显示3条记录 第1页 SELECT * FROM student LIMIT 0,3; --
以上命令行即使是不做数据库相关工作,也应该大致混个眼熟。比方在新一代的文本管理工具 Notion ,很多功能都体现出数据库的操作思路,比如排序、分组等,数据库的设计特性在不断扩大它的影响。
关于数据库的范式问题,也是数据库知识重点之一(即使是前端也应该知道,本瓜犹记得大学初学时的场景),后文再介绍吧~