数据库概述
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。数据库管理系统(Database Management System,DBMS)是用于管理数据库的软件系统。
数据库的发展历程
- 人工管理阶段:数据不保存,由应用程序管理
- 文件系统阶段:数据以文件形式存储,由文件系统管理
- 数据库系统阶段:数据由 DBMS 统一管理,实现了数据共享和独立性
- 高级数据库阶段:出现了分布式数据库、面向对象数据库、NoSQL 数据库等
数据库系统的特点
- 数据结构化:数据按照一定的数据模型组织
- 数据共享性高:多个用户可以同时访问数据
- 数据独立性强:包括物理独立性和逻辑独立性
- 数据由 DBMS 统一管理和控制:提供安全性、完整性、并发控制和恢复功能
数据库系统结构
数据库系统的三级模式结构
- 外模式(External Schema):用户视图,是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述
- 模式(Schema):逻辑模式,是数据库中全体数据的逻辑结构和特征的描述
- 内模式(Internal Schema):存储模式,是数据物理结构和存储方式的描述
数据库系统的二级映像
- 外模式/模式映像:保证数据的逻辑独立性
- 模式/内模式映像:保证数据的物理独立性
数据模型
数据模型是对现实世界数据特征的抽象,用于描述数据的结构、操作和约束。
数据模型的分类
- 概念模型:用于描述现实世界,如实体-联系模型(E-R 模型)
- 逻辑模型:用于数据库设计,如层次模型、网状模型、关系模型、面向对象模型
- 物理模型:用于描述数据的物理存储结构
实体-联系模型(E-R 模型)
E-R 模型是一种概念模型,用于描述现实世界的实体、属性和联系。
基本概念
- 实体(Entity):客观存在并可相互区别的事物,如学生、课程
- 属性(Attribute):实体所具有的某一特性,如学生的学号、姓名
- 联系(Relationship):实体之间的关联关系,如学生选课
联系的类型
- 一对一联系(1:1):如一个学生只能有一个学生证,一个学生证只能属于一个学生
- 一对多联系(1:n):如一个班级有多个学生,一个学生只能属于一个班级
- 多对多联系(m:n):如一个学生可以选多门课程,一门课程可以被多个学生选
关系模型
关系模型是目前最常用的逻辑模型,以关系(表)的形式组织数据。
基本概念
- 关系(Relation):对应于数据库中的表
- 元组(Tuple):表中的一行数据
- 属性(Attribute):表中的一列数据
- 域(Domain):属性的取值范围
- 关系模式:对关系的描述,如学生(学号, 姓名, 性别, 年龄, 班级)
- 码(Key):能够唯一标识元组的属性或属性组合
- 候选码:能够唯一标识元组的最小属性集
- 主码:从候选码中选择的一个作为主要标识
- 外码:一个关系中的属性,是另一个关系的主码
关系的完整性约束
- 实体完整性:主码的值不能为空且唯一
- 参照完整性:外码的值必须是另一个关系主码的有效值或空值
- 用户定义的完整性:根据具体应用需求定义的约束
关系数据库
关系数据库是基于关系模型的数据库,目前主流的关系数据库包括 MySQL、Oracle、SQL Server、PostgreSQL 等。
关系代数
关系代数是一种用于操作关系的数学工具,包括基本运算和组合运算。
基本运算
- 选择(Selection):从关系中选择满足条件的元组,σ 条件(关系)
- 投影(Projection):从关系中选择若干属性列,π 属性列(关系)
- 并(Union):两个关系的合并,要求两个关系具有相同的结构
- 差(Difference):从一个关系中减去另一个关系的元组,要求两个关系具有相同的结构
- 笛卡尔积(Cartesian Product):两个关系的所有可能组合
组合运算
- 连接(Join):根据两个关系的共同属性进行连接
- 等值连接:基于属性值相等的连接
- 自然连接:基于相同属性名和值的等值连接,并去掉重复属性
- 外连接:包括左外连接、右外连接和全外连接
- 除(Division):用于查询满足一定条件的元组
SQL 语言
SQL(Structured Query Language)是结构化查询语言,用于管理关系数据库系统。
SQL 的分类
- 数据定义语言(DDL):用于定义数据库结构,如 CREATE、ALTER、DROP
- 数据操纵语言(DML):用于操作数据,如 INSERT、UPDATE、DELETE、SELECT
- 数据控制语言(DCL):用于控制数据访问权限,如 GRANT、REVOKE
- 事务控制语言(TCL):用于控制事务,如 COMMIT、ROLLBACK、SAVEPOINT
数据定义语言(DDL)
创建数据库
1 | CREATE DATABASE student_db; |
选择数据库
1 | USE student_db; |
创建表
1 | -- 创建学生表 |
修改表
1 | -- 添加列 |
删除表
1 | DROP TABLE IF EXISTS student_course; |
数据操纵语言(DML)
插入数据
1 | -- 插入班级数据 |
查询数据
基本查询
1 | -- 查询所有学生信息 |
条件查询
1 | -- 查询年龄大于18的学生 |
排序查询
1 | -- 按年龄升序排序 |
聚合查询
1 | -- 计算学生总数 |
分组查询
1 | -- 按班级分组,计算每个班级的学生人数 |
连接查询
1 | -- 内连接:查询学生信息和班级信息 |
子查询
1 | -- 查询年龄大于平均年龄的学生 |
更新数据
1 | -- 更新张三的年龄为20 |
删除数据
1 | -- 删除姓名为张三的学生(注意:如果有外键约束,需要先删除关联数据) |
数据控制语言(DCL)
授权
1 | -- 创建用户 |
撤销权限
1 | -- 撤销用户对student表的INSERT权限 |
事务控制语言(TCL)
事务的基本操作
1 | -- 开始事务 |
数据库设计
数据库设计是指根据用户需求,设计数据库的结构和关系。
数据库设计的步骤
- 需求分析:收集和分析用户需求
- 概念结构设计:设计 E-R 模型
- 逻辑结构设计:将 E-R 模型转换为关系模型
- 物理结构设计:设计数据库的物理存储结构
- 数据库实施:创建数据库、表和加载数据
- 数据库运行和维护:监控和维护数据库
关系数据库设计理论
关系数据库设计理论用于指导关系数据库的设计,确保数据库的结构合理、冗余度低、操作高效。
函数依赖
- 函数依赖:如果属性集 X 的值确定后,属性集 Y 的值也随之确定,则称 Y 函数依赖于 X,记作 X→Y
- 完全函数依赖:Y 完全函数依赖于 X,当且仅当 Y 函数依赖于 X,且 Y 不函数依赖于 X 的任何真子集
- 部分函数依赖:Y 部分函数依赖于 X,当且仅当 Y 函数依赖于 X,但 Y 函数依赖于 X 的某个真子集
- 传递函数依赖:如果 X→Y,Y→Z,且 Y 不函数依赖于 Z,X 不函数依赖于 Z,则称 Z 传递函数依赖于 X
范式
范式是关系模式的规范化程度,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC 范式(BCNF)等。
- 第一范式(1NF):关系中的每个属性都是不可分割的原子值
- 第二范式(2NF):在 1NF 的基础上,消除了非主属性对主码的部分函数依赖
- 第三范式(3NF):在 2NF 的基础上,消除了非主属性对主码的传递函数依赖
- BC 范式(BCNF):在 3NF 的基础上,消除了主属性对主码的部分和传递函数依赖
规范化的过程
规范化的过程是将低范式的关系模式转换为高范式的关系模式,通常通过分解关系模式实现。
数据库完整性
数据库完整性是指数据库中数据的正确性、一致性和有效性。
数据库完整性的类型
- 实体完整性:通过主键约束实现
- 参照完整性:通过外键约束实现
- 用户定义的完整性:通过 CHECK 约束、UNIQUE 约束、NOT NULL 约束等实现
触发器
触发器是一种特殊的存储过程,在指定的事件发生时自动执行。
创建触发器
1 | -- 创建触发器,在删除学生前先删除其选课记录 |
数据库索引
索引是一种数据结构,用于提高数据库查询的效率。
索引的类型
- B 树索引:最常用的索引类型,适用于范围查询
- 哈希索引:适用于等值查询
- 全文索引:适用于文本搜索
- 空间索引:适用于地理空间数据查询
索引的优缺点
优点
- 提高查询速度
- 加速表与表之间的连接
- 减少排序和分组的时间
缺点
- 占用额外的存储空间
- 降低插入、更新和删除操作的速度
- 增加了数据库维护的开销
创建和删除索引
1 | -- 创建索引 |
索引的使用原则
- 对经常用于查询条件的列创建索引
- 对经常用于连接的列创建索引
- 对经常用于排序和分组的列创建索引
- 避免对频繁更新的列创建索引
- 避免对取值范围小的列创建索引
- 考虑创建复合索引,并注意列的顺序
数据库事务
事务是数据库操作的基本单位,是一系列不可分割的操作的集合。
事务的特性(ACID)
- 原子性(Atomicity):事务要么全部执行,要么全部不执行
- 一致性(Consistency):事务执行前后,数据库的完整性约束保持不变
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务
- 持久性(Durability):事务提交后,其结果应永久保存到数据库中
事务的隔离级别
事务的隔离级别用于控制并发事务之间的影响程度。
- 读未提交(Read Uncommitted):允许读取未提交的数据,可能导致脏读、不可重复读和幻读
- 读已提交(Read Committed):只允许读取已提交的数据,防止脏读,但可能导致不可重复读和幻读
- 可重复读(Repeatable Read):确保同一事务中多次读取同一数据的结果一致,防止脏读和不可重复读,但可能导致幻读
- 串行化(Serializable):最严格的隔离级别,确保事务串行执行,防止脏读、不可重复读和幻读
设置事务隔离级别
1 | -- 设置全局事务隔离级别 |
并发控制
并发控制是指管理多个并发事务的执行,确保事务的 ACID 特性,防止并发问题。
并发问题
- 脏读(Dirty Read):读取到其他事务未提交的数据
- 不可重复读(Non-Repeatable Read):同一事务中多次读取同一数据,结果不一致
- 幻读(Phantom Read):同一事务中多次查询同一条件,结果集的行数不一致
并发控制技术
锁机制
- 共享锁(S 锁):用于读取数据,多个事务可以同时获取共享锁
- 排他锁(X 锁):用于修改数据,只有一个事务可以获取排他锁
封锁协议
- 一级封锁协议:事务在修改数据前必须获取排他锁,直到事务结束才释放
- 二级封锁协议:在一级封锁协议的基础上,事务在读取数据前必须获取共享锁,读取后立即释放
- 三级封锁协议:在一级封锁协议的基础上,事务在读取数据前必须获取共享锁,直到事务结束才释放
- 两段锁协议:所有事务必须分两个阶段获取锁和释放锁
死锁
死锁是指多个事务因竞争资源而造成的一种僵局,若无外力作用,这些事务都将无法继续执行。
死锁的预防
- 一次封锁法:事务在开始执行时就获取所有需要的锁
- 顺序封锁法:事务按预先规定的顺序获取锁
死锁的检测和解除
- 死锁检测:通过资源分配图检测死锁
- 死锁解除:选择一个或多个事务进行回滚,释放资源
数据库恢复
数据库恢复是指在数据库发生故障后,将数据库恢复到一致性状态的过程。
数据库故障的类型
- 事务故障:事务在执行过程中发生的故障
- 系统故障:系统崩溃导致的故障
- 介质故障:存储介质损坏导致的故障
- 计算机病毒:病毒感染导致的故障
数据库恢复的技术
数据转储
- 完全转储:转储整个数据库
- 增量转储:只转储上次转储后修改的数据
- 差量转储:只转储上次完全转储后修改的数据
日志文件
日志文件用于记录数据库的操作,是数据库恢复的重要依据。
恢复策略
- 事务故障的恢复:通过撤销(UNDO)事务实现
- 系统故障的恢复:通过撤销未提交的事务和重做(REDO)已提交的事务实现
- 介质故障的恢复:通过数据转储和日志文件实现
数据库安全
数据库安全是指保护数据库免受未经授权的访问、修改和破坏。
数据库安全的层次
- 物理层安全:保护数据库的物理存储设备
- 网络层安全:保护数据库的网络访问
- 操作系统层安全:保护数据库所在的操作系统
- 数据库系统层安全:保护数据库管理系统
- 应用层安全:保护数据库应用程序
数据库安全的措施
- 用户认证:验证用户的身份
- 授权:控制用户对数据库的访问权限
- 视图:限制用户只能访问数据库的特定部分
- 审计:记录用户对数据库的操作
- 数据加密:对敏感数据进行加密存储
- 防火墙:防止未经授权的网络访问
数据库优化
数据库优化是指提高数据库的性能,包括查询优化、存储优化、配置优化等。
查询优化
- 合理使用索引
- 避免全表扫描
- 优化 SQL 语句
- 使用分页查询
- 避免在查询条件中使用函数
存储优化
- 合理设计表结构
- 选择合适的数据类型
- 避免数据冗余
- 定期清理无用数据
- 使用分区表
配置优化
- 调整数据库参数
- 增加内存分配
- 优化磁盘 I/O
- 使用连接池
NoSQL 数据库
NoSQL(Not Only SQL)数据库是指非关系型数据库,用于处理大规模数据和高并发访问。
NoSQL 数据库的分类
- 键值存储数据库:如 Redis、Memcached
- 文档存储数据库:如 MongoDB、CouchDB
- 列存储数据库:如 HBase、Cassandra
- 图存储数据库:如 Neo4j、JanusGraph
NoSQL 数据库的特点
- 灵活的数据模型
- 高可扩展性
- 高性能
- 高可用性
关系数据库与 NoSQL 数据库的比较
| 特性 | 关系数据库 | NoSQL 数据库 |
|---|---|---|
| 数据模型 | 结构化,表 | 灵活,键值、文档、列、图 |
| 事务支持 | 完全支持 ACID | 部分支持,如最终一致性 |
| 可扩展性 | 垂直扩展 | 水平扩展 |
| 性能 | 适用于复杂查询 | 适用于高并发、大数据量 |
| 适用场景 | 传统应用、复杂查询 | Web 应用、大数据、实时分析 |
大数据相关技术
Hadoop
Hadoop 是一个分布式计算框架,用于处理大规模数据。
Hadoop 的核心组件
- HDFS:Hadoop 分布式文件系统,用于存储大规模数据
- MapReduce:分布式计算框架,用于处理大规模数据
- YARN:资源管理系统,用于管理集群资源
- HBase:分布式列存储数据库
Spark
Spark 是一个快速的分布式计算框架,比 Hadoop MapReduce 更快。
Spark 的核心组件
- Spark Core:核心引擎
- Spark SQL:用于处理结构化数据
- Spark Streaming:用于处理流数据
- MLlib:机器学习库
- GraphX:图计算库
数据库面试题
1. 什么是数据库?数据库管理系统的主要功能是什么?
数据库是按照数据结构来组织、存储和管理数据的仓库。数据库管理系统的主要功能包括数据定义、数据操纵、数据控制、数据库运行管理和数据库维护。
2. 关系数据库的基本概念是什么?
关系数据库是基于关系模型的数据库,以关系(表)的形式组织数据。基本概念包括关系(表)、元组(行)、属性(列)、域、关系模式、码(主键、外键)等。
3. SQL 语言的分类有哪些?
SQL 语言分为数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)和事务控制语言(TCL)。
4. 什么是事务?事务的 ACID 特性是什么?
事务是数据库操作的基本单位,是一系列不可分割的操作的集合。事务的 ACID 特性包括原子性、一致性、隔离性和持久性。
5. 数据库的隔离级别有哪些?
数据库的隔离级别包括读未提交、读已提交、可重复读和串行化。
6. 什么是索引?索引的优缺点是什么?
索引是一种数据结构,用于提高数据库查询的效率。优点包括提高查询速度、加速表与表之间的连接、减少排序和分组的时间;缺点包括占用额外的存储空间、降低插入、更新和删除操作的速度、增加了数据库维护的开销。
7. 什么是范式?常见的范式有哪些?
范式是关系模式的规范化程度,用于指导关系数据库的设计。常见的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和 BC 范式(BCNF)。
8. 什么是 NoSQL 数据库?与关系数据库有什么区别?
NoSQL(Not Only SQL)数据库是指非关系型数据库,用于处理大规模数据和高并发访问。与关系数据库相比,NoSQL 数据库具有灵活的数据模型、高可扩展性、高性能和高可用性,但对事务的支持较弱。
参考资料
- 《数据库系统概论》(第五版),王珊 萨师煊 编著
- 《SQL 必知必会》(第四版),Ben Forta 著
- 《高性能 MySQL》(第三版),Baron Schwartz 等著
- 《NoSQL 精粹》,Pramod J. Sadalage 等著
- 《Hadoop 权威指南》(第四版),Tom White 著
总结
数据库是现代信息技术的重要组成部分,掌握数据库的基本概念、原理和技术对于理解和应用数据库至关重要。本文从数据库概述入手,详细介绍了数据库系统结构、数据模型、关系数据库、SQL 语言、数据库设计、数据库完整性、数据库索引、数据库事务、并发控制、数据库恢复、数据库安全、数据库优化、NoSQL 数据库和大数据相关技术,并解答了一些常见的数据库面试题。
通过学习本文,读者可以对数据库有一个全面的认识,掌握 SQL 语言的使用,了解数据库设计和优化的方法,为进一步深入学习数据库技术打下基础。数据库技术正在不断发展,新的技术和应用不断涌现,读者应该保持学习的热情,关注数据库技术的最新发展。