第01章 数据库概述
1. 为什么要使用数据库
- 持久化 (Persistence): 把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系数据库来完成。
- 持久化的主要作用: 将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
2. 数据库与数据库管理系统
2.1 数据库的相关概念
- DB (Database): 即存储数据的“仓库”,其本质是一个文件系统。它保存了一系列有组织的数据。
- DBMS (Database Management System): 是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制。用户通过数据库管理系统访问数据库中表内的数据。
- SQL (Structured Query Language): 专门用来与数据库通信的语言。
2.2 数据库与数据库管理系统的关系
数据库管理系统 (DBMS) 可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体用户的数据。
2.3 常见的数据库管理系统排名 (DBMS)
目前互联网上常见的数据库管理软件有 Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、Informix 这几种。以下是 2021 年 DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:
- Oracle
- MySQL
- Microsoft SQL Server
- PostgreSQL
- MongoDB
- Redis
- IBM Db2
- Elasticsearch
- SQLite
- Cassandra
2.4 常见的数据库介绍
Oracle
- 1979 年,Oracle 2 诞生,它是第一个商用的 RDBMS(关系型数据库管理系统)。
- 2007 年,总计 85 亿美金收购 BEA Systems。
- 2009 年,总计 74 亿美金收购 SUN。此前的 2008 年,SUN 以 10 亿美金收购 MySQL。意味着 Oracle 同时拥有了 MySQL 的管理权,至此 Oracle 在数据库领域中成为绝对的领导者。
SQL Server
- SQL Server 是微软开发的大型商业数据库,诞生于 1989 年。C#、.net 等语言常使用,与 WinNT 完全集成,也可以很好地与 Microsoft BackOffice 产品集成。
DB2
- IBM 公司的数据库产品,收费的。常应用在银行系统中。
PostgreSQL
- PostgreSQL 的稳定性极强,最符合 SQL 标准,开放源码,具备商业级 DBMS 质量。PG 对数据量大的文本以及 SQL 处理较快。
SQLite
- 嵌入式的小型数据库,应用在手机端。零配置,SQLite3 不用安装,不用配置,不用启动,关闭或者配置数据库实例。当系统崩溃后不用做任何恢复操作,再下次使用数据库的时候自动恢复。
Informix
- IBM 公司出品,取自 Information 和 Unix 的结合,它是第一个被移植到 Linux 上的商业数据库产品。仅运行于 unix/linux 平台,命令行操作。性能较高,支持集群,适应于安全性要求极高的系统,尤其是银行,证券系统的应用。
3. MySQL 介绍
3.1 概述
- MySQL 是一个
开放源代码的关系型数据库管理系统
,由瑞典 MySQL AB(创始人 Michael Widenius)公司 1995 年开发,迅速成为开源数据库的 No.1。 - 2008 被 Sun 收购(10 亿美金),2009 年 Sun 被 Oracle 收购。MariaDB 应运而生。(MySQL 的创造者担心 MySQL 有闭源的风险,因此创建了 MySQL 的分支项目 MariaDB)
- MySQL 版本之后分为社区版和商业版。
- MySQL 是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
- MySQL 是开源的,所以你不需要支付额外的费用。
- MySQL 是可以定制的,采用了 GPL(GNU General Public License)协议,你可以修改源码来开发自己的 MySQL 系统。
- MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
- MySQL 支持大型数据库,支持 5000 万条记录的数据库仓库,32 位系统文件最大可支持 4GB,64 位系统支持最大的表文件为 8TB。
- MySQL 使用
标准的 SQL 数据语言
形式。 - MySQL 可以允许运行多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP 和 Ruby 等。
3.2 MySQL 发展史重大事件
- 1979 年: Michael Widenius 用 BASIC 设计了一个报表工具 Unireg,这是一个简单而简单的表格的存储引擎,是存储引擎解决的服务,但不支持 SQL。
- 1996 年: Michael Widenius 和 David Axmark 一起协作,写出 MySQL 的第一个版本,此时还只是小范围使用,几个月后直接发布了 3.11 版本。
- 1999 年: MySQL 与 Sleepycat 公司合作,MySQL 提供了支持事务的 BerkeleyDB 存储引擎。后来由于这个引擎的许多问题,MySQL 5.1 以后不再被介绍到其他地方了。
- 2001 年: MySQL 开始集成 InnoDB 存储引擎。
- 2005 年: MySQL 5.0 发布,这是一个里程碑的版本,实现了许多功能特性。同年 5 月,Oracle 收购了开发 InnoDB 存储引擎的 Innobase Oy 公司,预示着不久后对 MySQL 的收购。
- 2009 年: Oracle 公司以 74 亿美元收购 Sun 公司,自此 MySQL 数据库进入 Oracle 时代。
- 2015 年: MySQL 5.6 GA 版本发布。
- 2016 年 9 月: MySQL 发布里程碑版本 MySQL 8.0.0。
- 2018 年 4 月: MySQL 8.0.11 GA 版本正式发布。
3.3 关于 MySQL 8.0
MySQL 从 5.7 版本直接跳跃发布了 8.0 版本
,可见这是一个令人兴奋的里程碑版本。MySQL 8 版本在功能上做了显著的改进与增强,开发者对 MySQL 的源代码进行了重构,最突出的一点是对 MySQL Optimizer 优化器进行了改进。不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。
3.4 为什么选择 MySQL?
- 开放源代码,使用成本低。
- 性能卓越,服务稳定。
- 软件体积小,使用简单,并且易于维护。
- 历史悠久,社区用户非常活跃,遇到问题可以寻求帮助。
- 许多互联网公司在用,经过了时间的验证。
3.5 Oracle vs MySQL
- Oracle: 更适合大型跨国企业的使用,因为他们对费用不敏感,但是对性能要求以及安全性有更高的要求。
- MySQL: 由于其体积小、速度快、总体拥有成本低,可处理上千万条记录的大型数据库,尤其是开放源码这一特点,使得很多互联网公司、中小型网站选择了 MySQL 作为网站数据库(Facebook, Twitter, YouTube, 阿里巴巴/蚂蚁金服, 去哪儿, 美团外卖, 腾讯)。
4. RDBMS 与非 RDBMS
4.1 关系型数据库 (RDBMS)
4.1.1 实质
- 这种类型的数据库是
最古老
的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系
(即二维表格形式)。 - 关系型数据库以
行(row)
和列(column)
的形式存储数据,以便于用户理解。这一系列的行和列被称为表。
4.1.2 优势
- 复杂查询: 可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询。
- 事务支持: 使得对于安全性能很高的数据访问要求得以实现。
4.2 非关系型数据库 (非 RDBMS)
4.2.1 介绍
- 非关系型数据库,可看成传统关系型数据库的功能简化版本,基于键值对存储数据,不需要经过 SQL 层的解析,性能非常高。同时,通过减少不常用的功能,进一步提高性能。
- 目前基本上大部分主流的非关系型数据库都是免费的。
4.2.2 非关系型数据库的分类
- 键值型数据库: 通过 Key-Value 键值的方式来存储数据,其中 Key 和 Value 可以是简单的对象,也可以是复杂的对象。典型产品:Redis。
- 文档型数据库: 可存放并获取文档,可以是 XML、JSON 等格式。典型产品:MongoDB。
- 搜索引擎数据库: 应用在搜索引擎领域的数据存储形式,核心原理是“倒排索引”。典型产品:Solr、Elasticsearch。
- 列式数据库: 将数据按照列存储到数据库中,适合于分布式文件系统。典型产品:HBase。
- 图形数据库: 存储图形关系的数据库,利用图这种数据结构存储了实体(对象)之间的关系。典型产品:Neo4J。
4.2.3 NoSQL 的演变
- NoSQL 对 SQL 做出了很好的补充,比如实际开发中,有很多业务需求,其实并不需要完整的关系型数据库功能,非关系型数据库的功能就足够使用了。这种情况下,使用性能更高、成本更低的非关系型数据库当然是最明显的选择。比如:日志收集、排行榜、定时器等。
4.3 小结
- NoSQL 的分类很多,即便如此,在 DBMS 排名中,还是 SQL 阵营的比重更大,影响力前 5 的 DBMS 中有 4 个是关系型数据库,而排名前 20 的 DBMS 中也有 12 个是关系型数据库。所以说,掌握 SQL 是非常有必要的。
5. 关系型数据库设计规则
5.1 表、记录、字段
E-R(entity-relationship,实体-联系)模型中有三个主要概念是:
实体集
、属性
、联系集
。一个实体集(class)对应于数据库中的一个表(table),
一个实体(instance)则对应于数据库表 中的一行(row),也称为一条记录(record)。
一个属性(attribute)对应于数据库表中的一列 (column),也称为一个字段(field)。
- 表 (Table): 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
- 记录 (Record): 表中的一行数据,也称为一条记录。
- 字段 (Field): 表中的一列数据,也称为一个字段。
ORM 思想 (Object Relational Mapping) 体现:
- 数据库中的一个表 <---> Java 或 Python 中的一个类
- 表中的一条数据 <---> 类中的一个对象(或实体)
- 表中的一个列 <---> 类中的一个字段、属性 (field)
5.2 表的关联关系
-
一对一关联 (one-to-one): 在实际的开发中应用不多,因为一对一可以创建成一张表。
- 举例:设计 学生表:学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急 联系人、...
- 拆为两个表:两个表的记录是一一对应关系。
- 基础信息表(常用信息):学号、姓名、手机号码、班级、系别
- 档案信息表(不常用信息):学号、身份证号码、家庭住址、籍贯、紧急联系人、...
- 两种建表原则:
- 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。
- 外键是主键:主表的主键和从表的主键,形成主外键关系。
- 举例:设计 学生表:学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急 联系人、...
-
一对多关联 (one-to-many): 常见实例场景:客户表和订单表,分类表和商品表,部门表和员工表。
- 举例:
- 员工表:编号、姓名、...、所属部门
- 部门表:编号、名称、简介
- 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
- 举例:
-
多对多关联 (many-to-many): 要表示多对多关系,必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。
举例1:学生-课程 学生信息表:一行代表一个学生的信息(学号、姓名、手机号码、班级、系别...)
-
自我引用 (Self reference): 表中的某个字段引用同一表中的另一个字段。
5.3 表的关联关系示例
5.3.1 一对一关联示例
- 学生表:
- 学号、姓名、手机号码、班级、系别
- 档案信息表:
- 学号、身份证号码、家庭住址、籍贯、紧急联系人
5.3.2 一对多关联示例
- 员工表:
- 编号、姓名、所属部门
- 部门表:
- 编号、名称、简介
5.3.3 多对多关联示例
- 学生信息表:
- 学号、姓名、手机号码、班级、系别
- 课程信息表:
- 课程编号、课程名称
- 学生选课表:
- 学号、课程编号、成绩
5.3.4 自我引用示例
- 员工表:
- 员工编号、姓名、部门编号、主管编号
注:学习MySQL
时的笔记,笔记来源是尚硅谷
的课件
-
学习的视频:02-为什么使用数据库及数据库常用概念_哔哩哔哩_bilibili
-
课件整理:deepseek
-
[MySQL基础课件笔记目录]