目录
一. 数据库概述
1.1 什么是数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库的主要特点包括:
-
持久化存储:数据长期保存,不会因为程序结束而丢失
-
结构化组织:数据按照特定的数据模型组织
-
共享性:可以被多个用户和应用共享使用
-
减少冗余:通过数据共享减少数据重复存储
-
数据独立性:数据与应用程序相互独立
-
完整性保障:保证数据的正确性和一致性
-
安全性控制:提供数据保护机制
1.2 数据库发展历史
数据库技术的发展经历了以下几个主要阶段:
-
人工管理阶段(1950年代前):
-
数据不保存
-
没有专门的软件管理
-
数据面向应用,不具有共享性
-
-
文件系统阶段(1950-1960年代):
-
数据可以长期保存
-
由文件系统管理数据
-
数据共享性差,冗余度高
-
数据独立性差
-
-
数据库系统阶段(1960年代后):
-
数据结构化
-
数据共享性高,冗余度低
-
数据独立性高
-
有统一的数据控制功能
-
-
现代数据库阶段(21世纪):
-
分布式数据库
-
NoSQL数据库
-
云数据库
-
大数据技术
-
1.3 数据库管理系统(DBMS)
数据库管理系统(Database Management System, DBMS)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
常见的DBMS包括:
-
关系型数据库:MySQL、Oracle、SQL Server、PostgreSQL
-
NoSQL数据库:MongoDB、Redis、Cassandra
-
云数据库:AWS RDS、Google Cloud SQL、Azure SQL Database
DBMS的主要功能包括:
-
数据定义功能:提供数据定义语言(DDL)
-
数据操纵功能:提供数据操纵语言(DML)
-
数据库的运行管理
-
数据库的建立和维护
-
数据组织、存储和管理
-
数据库的保护
二. 数据模型
2.1 概念模型
概念模型是对现实世界的第一层抽象,主要用于数据库设计。最常用的概念模型是实体-联系模型(Entity-Relationship Model, E-R模型)。
E-R模型基本概念
-
实体(Entity):客观存在并可相互区别的事物
-
如:学生、课程
-
-
属性(Attribute):实体所具有的某一特性
-
如:学生的学号、姓名
-
-
联系(Relationship):实体之间的联系
-
如:学生"选修"课程
-
E-R图的表示方法
-
实体:矩形框
-
属性:椭圆形框
-
联系:菱形框
-
连线:连接实体与属性、实体与联系
2.2 逻辑模型
逻辑模型是对概念模型的进一步抽象,主要包括:
-
层次模型:树形结构表示实体及其联系
-
网状模型:图结构表示实体及其联系
-
关系模型:二维表表示实体及其联系
-
面向对象模型:对象和类表示实体及其联系
2.3 物理模型
物理模型描述数据在存储介质上的组织结构,与具体的DBMS相关,包括:
-
文件结构
-
索引方式
-
数据存取路径
-
存储分配参数
三. 关系数据库
3.1 关系模型基本概念
关系模型是目前最常用的数据模型,由E.F.Codd在1970年提出。
基本概念:
-
关系(Relation):一张二维表
-
元组(Tuple):表中的一行
-
属性(Attribute):表中的一列
-
域(Domain):属性的取值范围
-
候选码(Candidate Key):能唯一标识一个元组的属性组
-
主码(Primary Key):被选中的候选码
-
外码(Foreign Key):一个关系中的属性是另一个关系的主码
3.2 关系数据结构
关系数据库由多个关系(表)组成,每个关系具有以下性质:
-
列是同质的(同一列中的分量是同一类型的数据)
-
不同的列可出自同一个域
-
列的顺序无所谓
-
任意两个元组的候选码不能相同
-
行的顺序无所谓
-
分量必须取原子值(不可再分)
3.3 关系操作
关系操作包括:
-
查询操作:选择、投影、连接、除、并、交、差
-
更新操作:插入、删除、修改
关系操作的特点是集合操作方式,即操作的对象和结果都是集合。
3.4 关系完整性
关系模型中有三类完整性约束:
-
实体完整性:主码不能取空值
-
参照完整性:外码要么取空值,要么等于被参照关系的主码值
-
用户定义的完整性:针对具体应用的数据约束
四. SQL语言基础
4.1 SQL概述
SQL(Structured Query Language)是结构化查询语言,用于管理关系数据库。SQL包含以下几部分:
-
数据定义语言(DDL):CREATE、ALTER、DROP
-
数据操纵语言(DML):SELECT、INSERT、UPDATE、DELETE
-
数据控制语言(DCL):GRANT、REVOKE
-
事务控制语言(TCL):COMMIT、ROLLBACK、SAVEPOINT
4.2 数据定义
创建表
CREATE TABLE 学生 (
学号 CHAR(9) PRIMARY KEY,
姓名 VARCHAR(20) NOT NULL,
性别 CHAR(2),
年龄 SMALLINT,
所在系 VARCHAR(20)
);
修改表
ALTER TABLE 学生 ADD 入学日期 DATE;
ALTER TABLE 学生 ALTER COLUMN 年龄 INT;
ALTER TABLE 学生 DROP COLUMN 性别;
删除表
DROP TABLE 学生;
4.3 数据查询
基本查询
SELECT 学号, 姓名 FROM 学生 WHERE 年龄 > 20;
条件查询
SELECT * FROM 学生 WHERE 所在系='计算机系' AND 年龄<22;
排序
SELECT * FROM 学生 ORDER BY 年龄 DESC, 学号 ASC;
分组
SELECT 所在系, COUNT(*) FROM 学生 GROUP BY 所在系;
连接查询
SELECT 学生.学号, 姓名, 课程名, 成绩
FROM 学生, 选课, 课程
WHERE 学生.学号=选课.学号 AND 选课.课程号=课程.课程号;
嵌套查询
SELECT 姓名 FROM 学生
WHERE 学号 IN (SELECT 学号 FROM 选课 WHERE 课程号='001');
4.4 数据更新
插入数据
INSERT INTO 学生(学号, 姓名, 性别, 年龄, 所在系)
VALUES('2023001', '张三', '男', 20, '计算机系');
修改数据
UPDATE 学生 SET 年龄=21 WHERE 学号='2023001';
删除数据
DELETE FROM 学生 WHERE 学号='2023001';
4.5 视图
创建视图
CREATE VIEW 计算机系学生 AS
SELECT 学号, 姓名, 年龄 FROM 学生 WHERE 所在系='计算机系';
使用视图
SELECT * FROM 计算机系学生 WHERE 年龄>20;
删除视图
DROP VIEW 计算机系学生;
五. 数据库设计
5.1 数据库设计步骤
-
需求分析:了解用户需求
-
概念结构设计:设计E-R模型
-
逻辑结构设计:将E-R图转换为关系模型
-
物理结构设计:设计存储结构和存取方法
-
数据库实施:建立数据库,编写应用程序
-
数据库运行和维护:投入使用并维护
5.2 关系数据库规范化
规范化理论用于设计良好的关系模式,避免数据冗余和操作异常。
函数依赖
设R(U)是属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作X→Y。
范式
-
第一范式(1NF):所有属性都是不可分的基本数据项
-
第二范式(2NF):满足1NF,且非主属性完全依赖于码
-
第三范式(3NF):满足2NF,且非主属性不传递依赖于码
-
BC范式(BCNF):满足3NF,且所有属性都不传递依赖于码
5.3 E-R图向关系模型的转换
-
一个实体型转换为一个关系模式
-
一个1:1联系可以转换为独立的关系模式,也可以与任意一端合并
-
一个1:n联系可以转换为独立的关系模式,也可以与n端合并
-
一个m:n联系转换为一个关系模式
-
三个及以上实体间的多元联系转换为一个关系模式
六. 数据库安全与完整性
6.1 数据库安全性
数据库安全性指保护数据库以防止不合法使用造成的数据泄露、更改或破坏。
安全性控制方法
-
用户标识与鉴别:用户名/密码、生物特征等
-
存取控制:自主存取控制(DAC)、强制存取控制(MAC)
-
视图机制:通过视图限制用户访问范围
-
审计:记录用户操作
-
数据加密:存储加密、传输加密
SQL中的安全性控制
-- 授权
GRANT SELECT, INSERT ON TABLE 学生 TO USER1;
-- 收回权限
REVOKE INSERT ON TABLE 学生 FROM USER1;
6.2 数据库完整性
数据库完整性指数据的正确性和相容性。
完整性约束
-
实体完整性:PRIMARY KEY约束
-
参照完整性:FOREIGN KEY约束
-
用户定义完整性:
-
非空约束:NOT NULL
-
唯一约束:UNIQUE
-
检查约束:CHECK
-
默认值:DEFAULT
-
SQL中的完整性约束
CREATE TABLE 学生 (
学号 CHAR(9) PRIMARY KEY,
姓名 VARCHAR(20) NOT NULL,
性别 CHAR(2) CHECK(性别 IN ('男','女')),
年龄 SMALLINT CHECK(年龄>=15 AND 年龄<=45),
所在系 VARCHAR(20) DEFAULT '计算机系'
);
CREATE TABLE 选课 (
学号 CHAR(9),
课程号 CHAR(4),
成绩 SMALLINT CHECK(成绩>=0 AND 成绩<=100),
PRIMARY KEY(学号, 课程号),
FOREIGN KEY(学号) REFERENCES 学生(学号),
FOREIGN KEY(课程号) REFERENCES 课程(课程号)
);
七. 事务管理
7.1 事务概念
事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
事务的特性(ACID):
-
原子性(Atomicity):事务是不可分割的工作单位
-
一致性(Consistency):事务执行使数据库从一个一致状态变到另一个一致状态
-
隔离性(Isolation):一个事务的执行不能被其他事务干扰
-
持久性(Durability):事务一旦提交,对数据库的改变是永久的
7.2 并发控制
当多个事务并发执行时,可能导致数据不一致问题:
-
丢失修改:两个事务同时修改同一数据,一个修改被另一个覆盖
-
不可重复读:一个事务内多次读取同一数据,结果不同
-
读脏数据:读取了未提交的数据,随后该数据被回滚
封锁协议
通过封锁机制解决并发问题:
-
排他锁(X锁):写锁,禁止其他事务读写
-
共享锁(S锁):读锁,允许其他事务读但禁止写
隔离级别
SQL标准定义了4个隔离级别:
-
读未提交(Read Uncommitted):最低级别,允许脏读
-
读已提交(Read Committed):防止脏读
-
可重复读(Repeatable Read):防止脏读和不可重复读
-
可串行化(Serializable):最高级别,完全隔离
7.3 数据库恢复
数据库恢复技术保证事务的原子性和持久性。
故障类型
-
事务内部故障
-
系统故障
-
介质故障
-
计算机病毒
恢复技术
-
数据转储:定期备份数据库
-
日志文件:记录事务对数据库的更新操作
-
检查点:定期记录数据库状态
-
恢复策略:
-
事务故障恢复:UNDO
-
系统故障恢复:UNDO未完成事务,REDO已提交事务
-
介质故障恢复:重装备份,利用日志重做
-
八. 数据库新技术
8.1 NoSQL数据库
NoSQL(Not Only SQL)数据库是为解决大规模数据集合多重数据种类带来的挑战而设计的。
NoSQL特点
-
灵活的数据模型
-
高可扩展性
-
高性能
-
高可用性
-
简单的API
NoSQL类型
-
键值数据库:Redis、DynamoDB
-
文档数据库:MongoDB、CouchDB
-
列族数据库:Cassandra、HBase
-
图数据库:Neo4j、ArangoDB
8.2 分布式数据库
分布式数据库是物理上分散而逻辑上集中的数据库系统。
特点:
-
数据物理分布在不同场地
-
每个场地可以独立处理本地数据
-
也可以同时存取多个场地的数据
8.3 大数据技术
大数据技术处理海量、高增长率和多样化的信息资产。
关键技术:
-
Hadoop生态系统
-
Spark
-
Flink
-
数据仓库技术
-
数据湖技术
8.4 云数据库
云数据库是基于云计算技术构建的数据库服务。
特点:
-
按需付费
-
弹性扩展
-
高可用性
-
免维护
主要云数据库服务:
-
AWS RDS
-
Google Cloud SQL
-
Azure SQL Database
-
阿里云RDS
九. 数据库实践建议
9.1 数据库选择建议
-
关系型数据库适用场景:
-
数据结构固定
-
需要复杂查询
-
需要事务支持
-
数据一致性要求高
-
-
NoSQL数据库适用场景:
-
数据结构多变
-
海量数据存储
-
高并发读写
-
水平扩展需求
-
9.2 数据库设计最佳实践
-
合理设计表结构,遵循规范化原则但不过度规范化
-
选择合适的数据类型和字段长度
-
建立适当的索引提高查询效率
-
考虑数据增长和扩展需求
-
设计良好的主键和外键关系
-
考虑数据安全性和访问控制
9.3 数据库性能优化
-
SQL优化:
-
避免SELECT *
-
合理使用JOIN
-
避免在WHERE子句中使用函数
-
使用EXPLAIN分析查询计划
-
-
索引优化:
-
为常用查询条件创建索引
-
避免过多索引
-
考虑复合索引的顺序
-
定期维护索引
-
-
配置优化:
-
调整内存分配
-
优化缓存设置
-
配置合理的连接池
-
-
架构优化:
-
读写分离
-
分库分表
-
使用缓存层
-
十. 总结
本文全面介绍了数据库的基础知识,从基本概念到高级主题,涵盖了关系数据库理论、SQL语言、数据库设计、事务管理、安全性和新技术等多个方面。数据库是现代信息系统的核心组件,掌握数据库基础知识对于任何IT专业人员都至关重要。
随着技术的发展,数据库领域不断涌现新的技术和解决方案,但关系数据库和SQL仍然是基础。建议读者在学习新技术的同时,也要扎实掌握这些基础知识,为未来的学习和工作打下坚实基础。