推荐网课:
【【自用】数据库系统概论学习】
网课教材:数据库系统概述
本校课程教材:Database System Concepts 6th Edition

考试相关

SQL占比多一点,DMBS少一点

数据,数据库,数据库管理系统,数据库系统

  • 数据:描述事物的符号记录
  • 数据库:按照数据结构来组织、存储和管理数据的仓库
    • 其中数据的三个特点:永久存储,有组织,可共享
  • 数据库管理系统:数据库系统的核心,是一种操纵和管理数据库的软件
  • 数据库系统:由数据库和数据库管理系统组成的集合

    数据库管理系统 DBMS

  1. 数据定义功能
  2. 数据组织、存储和管理功能
  3. 数据操纵功能
  4. 数据库的事务管理和运行管理
  5. 数据库的建立和维护功能

    数据库系统

    数据库系统一般由数据库、数据库管理系统(及其开发工具) 、应用系统、数据库管理员等组成。
    alt text

GPTs:

学习数据库理论知识是一个非常有益且丰富的过程,因为数据库是现代计算机系统中不可或缺的一部分。为了开始学习数据库理论,我们可以从几个关键的概念和步骤入手。我们将逐步深入每个概念,并使用类比来帮助理解。

第一步:理解基本概念

  1. 数据库(Database)
    数据库就像一个组织良好的数字化图书馆。每本书(数据)都被有序地放在一个特定的位置(表格),方便我们快速找到并读取。

  2. 数据库管理系统(DBMS)
    DBMS就像图书馆的管理员,它负责管理、维护和组织图书馆里的书籍。常见的DBMS包括MySQL、PostgreSQL、Oracle、SQL Server等。

  3. SQL(结构化查询语言)
    SQL是一种专门用于与数据库交互的语言,就像是与图书管理员交流的语言。通过SQL,我们可以告诉DBMS我们需要什么数据,或者要如何组织数据。

第二步:理解关系型数据库

  1. 关系型数据库(Relational Database)
    关系型数据库是最常见的一种数据库类型。它将数据存储在一系列的表格中,每个表格就像是一个电子表格(如Excel),包含行和列。

  2. 表(Table)
    表是数据库中的基本存储结构。可以将其看作是一个有行和列的电子表格。每一行代表一条记录(Record),每一列代表一个字段(Field)。

  3. 主键(Primary Key)
    主键是表中用于唯一标识每条记录的字段。例如,在一个学生信息表中,学号可以作为主键,因为每个学生的学号都是独一无二的。

  4. 外键(Foreign Key)
    外键是用于在表之间建立联系的字段。例如,在一个课程表中,可以有一个学生学号的外键,表示哪些学生选了这门课。

进一步理解主键和外键

  1. 主键(Primary Key)
    主键是一种特殊的字段(或多个字段的组合),用于唯一标识表中的每一行记录。每个表只能有一个主键。

类比:主键就像你的身份证号码,在一个国家里每个人的身份证号码都是独一无二的,用来唯一识别一个人。

特性:
唯一性:主键的值必须唯一。
非空:主键的值不能为NULL。

  1. 外键(Foreign Key)
    外键是一个表中的字段,它引用另一个表的主键,用于在两个表之间建立关联。

类比:外键就像是你的学生证号码,它连接了学校系统中的学生信息(主键是学生的学号),可以用来查找与学生相关的其他信息,比如课程表。

特性:
引用完整性:外键的值必须在被引用的表(父表)中存在,确保数据的一致性。

规范化(Normalization)
规范化是数据库设计中重要的一部分,用于减少冗余数据和提高数据的一致性。规范化过程包括多个阶段(范式),每个阶段都有特定的规则和目标。

第一范式(1NF)
每个字段只能包含一个值,每个记录都是唯一的。

第二范式(2NF)
在1NF的基础上,所有非主键字段必须完全依赖于主键,消除部分依赖。

第三范式(3NF)
在2NF的基础上,消除传递依赖,非主键字段不能依赖于其他非主键字段。

类比:

第一范式:就像一个图书馆的书架上,每个格子只能放一本书。
第二范式:确保每本书都在它应该在的特定分类架上,而不是一部分书在一个分类架上,另一部分书在另一个分类架上。
第三范式:确保每本书的所有信息都集中在一个地方,而不是部分信息在一个书架上,部分信息在另一个书架上。

主键和外键的区别是,前者是每条记录独一无二唯一的标识编号,后者是用于不同表之间的记录相互关联而存在的别的表的主键;第一范式规定了字段值的唯一性,和记录之间的差异性,第二范式规定了非主键字段存在的前提是主键的存在,第三范式规定了非主键字段只独立地依赖于主键,和其他字段都是并列的关系;

高级SQL查询:子查询、连接和聚合函数
事务(Transaction)和并发控制
索引(Index)和性能优化
数据库设计模式
非关系型数据库(NoSQL)的基本概念

  1. 高级SQL查询
    子查询(Subquery)
    子查询是嵌套在其他查询中的查询。它可以用在SELECT、INSERT、UPDATE、DELETE语句中,用于完成复杂的数据检索。

类比:子查询就像是在主查询中插入一个小的查询任务,类似于在大任务中分配一个子任务。

1
2
3
4
5
6
-- 查询所有选修了某门课程(如课程ID为1)的学生
SELECT * FROM students
WHERE student_id IN (
SELECT student_id FROM enrollments
WHERE course_id = 1
);

连接(Join)
连接是用于从多个表中检索数据的操作。常见的连接类型有内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。

类比:连接就像是将两个表格拼接在一起,根据某个共同的字段(如主键和外键)来匹配对应的行。

1
2
3
4
5
-- 查询所有学生及其选修的课程名称
SELECT students.name, courses.course_name
FROM enrollments
INNER JOIN students ON enrollments.student_id = students.student_id
INNER JOIN courses ON enrollments.course_id = courses.course_id;

聚合函数(Aggregate Functions)
聚合函数用于对一组值执行计算,并返回单一的值。常见的聚合函数有COUNT、SUM、AVG、MIN、MAX。

类比:聚合函数就像是对一组数据进行统计分析,比如统计班级人数,计算总成绩,平均成绩等。

1
2
3
4
-- 查询选修每门课程的学生数量
SELECT course_id, COUNT(student_id) AS student_count
FROM enrollments
GROUP BY course_id;
  1. 事务(Transaction)和并发控制
    事务(Transaction)
    事务是一组操作的集合,这些操作要么全部执行,要么全部不执行。事务具有四个重要特性,称为ACID特性:

原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。
一致性(Consistency):事务执行前后,数据库的状态必须保持一致。
隔离性(Isolation):并发执行的事务之间不会互相影响。
持久性(Durability):事务一旦提交,对数据库的改变是永久的。
类比:事务就像银行转账,要么同时完成扣款和存款,要么都不执行,确保转账过程中的一致性和安全性。

1
2
3
4
5
6
7
8
9
10
11
-- 事务示例
START TRANSACTION;

-- 扣款操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 存款操作
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- 提交事务
COMMIT;

并发控制(Concurrency Control)
并发控制用于管理多个事务同时执行时的相互影响,常用的方法包括锁机制(Locking)和多版本并发控制(MVCC)。

类比:并发控制就像图书馆的借书系统,确保同一本书不会被多个借阅者同时借走。

  1. 索引(Index)和性能优化
    索引(Index)
    索引是一种加速数据库查询的技术,类似于书的目录,通过目录可以快速找到所需的内容。常见的索引类型有B树索引和哈希索引。

类比:索引就像是书的目录,通过目录可以快速找到所需的章节。

1
2
-- 创建索引
CREATE INDEX idx_student_name ON students(name);

性能优化
性能优化涉及查询优化、索引优化和数据库设计优化。常用的技术包括优化SQL查询、合理使用索引、分区(Partitioning)和缓存(Caching)。

类比:性能优化就像是图书馆的管理系统,通过合理的书架布局和借阅管理,提升查找和借阅的效率。

  1. 数据库设计模式
    数据库设计模式是解决常见数据库设计问题的最佳实践,包括单表继承(Single Table Inheritance)、类表继承(Class Table Inheritance)和混合继承(Concrete Table Inheritance)。

类比:数据库设计模式就像建筑设计的蓝图,不同的设计方案适用于不同的建筑需求。

  1. 非关系型数据库(NoSQL)的基本概念
    非关系型数据库包括文档数据库(如MongoDB)、键值存储(如Redis)、列存储(如Cassandra)和图数据库(如Neo4j)。

类比:NoSQL数据库就像是不同类型的存储系统,用于处理不同类型的数据需求,比如文档存储、键值对存储、大规模列存储和关系图存储。

连接类型及其使用场景

  1. 内连接(INNER JOIN)
    内连接是最常见的连接类型,它返回两个表中匹配的记录。

类比:内连接就像是在两个好友列表中找共同的好友,只显示同时出现在两个列表中的人。

使用场景:当需要检索两个表中都有的数据时。

1
2
3
4
5
-- 查询所有学生及其选修的课程名称
SELECT students.name, courses.course_name
FROM enrollments
INNER JOIN students ON enrollments.student_id = students.student_id
INNER JOIN courses ON enrollments.course_id = courses.course_id;
  1. 左连接(LEFT JOIN)
    左连接返回左表中的所有记录,即使右表中没有匹配的记录。

类比:左连接就像是在你的好友列表中找共同好友,如果对方列表中没有匹配的,也会显示你的好友,只不过对方的信息为空。

使用场景:当需要显示左表中的所有记录,以及匹配右表中的数据时。

1
2
3
4
5
-- 查询所有学生及其选修的课程名称,如果没有选修课程也显示学生信息
SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id;
  1. 右连接(RIGHT JOIN)
    右连接返回右表中的所有记录,即使左表中没有匹配的记录。

类比:右连接就像是在对方的好友列表中找共同好友,如果你的列表中没有匹配的,也会显示对方的好友,只不过你的信息为空。

使用场景:当需要显示右表中的所有记录,以及匹配左表中的数据时。

1
2
3
4
5
-- 查询所有课程及选修这些课程的学生姓名,如果没有学生选修也显示课程信息
SELECT courses.course_name, students.name
FROM courses
RIGHT JOIN enrollments ON courses.course_id = enrollments.course_id
RIGHT JOIN students ON enrollments.student_id = students.student_id;
  1. 全连接(FULL JOIN)
    全连接返回两个表中所有的记录,无论是否匹配。

类比:全连接就像是两个好友列表的合并,显示所有的好友信息,即使没有匹配的也显示出来。

使用场景:当需要显示两个表中的所有记录,并且包括所有的匹配和不匹配的数据时。

1
2
3
4
5
-- 全连接通常不被直接支持,使用UNION实现
SELECT students.name, courses.course_name
FROM students
FULL OUTER JOIN enrollments ON students.student_id = enrollments.student_id
FULL OUTER JOIN courses ON enrollments.course_id = courses.course_id;

索引及其性能优化
索引(Index)
索引是一种数据结构,用于快速查找数据库表中的记录。常见的索引类型包括B树索引和哈希索引。

类比:索引就像书的目录,通过目录可以快速找到所需的章节。

如何提高查询性能
快速定位:索引通过减少需要扫描的行数,极大地提高了查询速度。例如,在没有索引的情况下,数据库可能需要扫描整个表来查找特定记录;而有了索引,数据库可以直接跳到相关记录。
减少磁盘I/O:索引将相关数据集中在一起,减少了磁盘读取操作。
排序和分组:索引可以加速排序和分组操作,使得ORDER BY和GROUP BY查询更快。
示例:
假设有一个大的学生表,我们需要查找姓名为“John Doe”的学生记录。

1
SELECT * FROM students WHERE name = 'John Doe';

数据库可以直接利用索引定位“John Doe”,大大提高查询速度。

数据库设计模式
单表继承(Single Table Inheritance)
所有的子类表都存储在一个大表中,通过一个类型字段来区分不同的子类。

类比:像是在一个大书架上放置不同类别的书,通过标签来区分类别。

使用场景:当不同子类之间差异较小时。

类表继承(Class Table Inheritance)
每个子类都有自己的表,父类表存储共有的字段,子类表存储特有的字段。

类比:像是在不同的书架上放置不同类别的书,每个书架都有特定的类别。

使用场景:当不同子类之间差异较大时。

混合继承(Concrete Table Inheritance)
每个子类都有完整的表,包含父类和子类的所有字段。

类比:像是每种类别的书都放在单独的书架上,每个书架上都有该类别书的所有信息。

使用场景:当需要单独处理每个子类时。

非关系型数据库(NoSQL)的类型及应用场景

  1. 文档数据库(Document Store)
    如MongoDB,存储的是文档(JSON、BSON)。

应用场景:内容管理系统,博客平台等,需要灵活的文档格式。

类比:像文件夹里的文档,每个文档可以有不同的结构。

  1. 键值存储(Key-Value Store)
    如Redis,存储键值对。

应用场景:会话管理,缓存系统等,需要快速读写数据的应用。

类比:像字典,每个键对应一个值。

  1. 列存储(Column Store)
    如Cassandra,数据按列存储。

应用场景:大数据分析,日志管理等,需要高效写入和读取特定列数据的应用。

类比:像电子表格,可以按列快速查找数据。

  1. 图数据库(Graph Database)
    如Neo4j,存储的是节点和边,表示实体及其关系。

应用场景:社交网络,推荐系统等,需要复杂关系查询的应用。

类比:像社交网络图,每个节点是用户,每条边是好友关系。

数据库内核和引擎
数据库内核(Database Kernel)
数据库内核是数据库管理系统的核心部分,负责存储、检索和管理数据。它包括存储引擎、查询处理器、事务管理器、日志管理器等组件。

类比:数据库内核就像汽车的发动机,是整个系统的核心,驱动所有功能。

数据库引擎(Database Engine)
数据库引擎是内核中的一个重要组成部分,负责实际的数据存储和检索。不同的数据库引擎适用于不同的应用场景。例如,MySQL支持InnoDB和MyISAM引擎:

InnoDB:支持事务和外键,适用于需要数据一致性和并发控制的应用。
MyISAM:不支持事务和外键,适用于读操作多于写操作的应用。
类比:数据库引擎就像汽车的具体引擎类型,不同的引擎适用于不同的驾驶需求。

回答问题
左连接和右连接属于内连接还是外连接?
左连接(LEFT JOIN)和右连接(RIGHT JOIN)属于外连接(OUTER JOIN)。它们返回包括不匹配的行在内的结果,而内连接(INNER JOIN)只返回匹配的行。

给一张表中的某个字段创建了索引之后,即使查询语句没有变化,效率也会提高
正确。创建索引后,查询效率通常会提高,因为索引允许数据库快速定位所需的数据,而不需要扫描整个表。

三种设计模式:单表继承、类表继承和混合继承,各自解决了子类之间差别小、子类之间差别大和需要单独处理子类的情况
正确。单表继承适用于子类之间差别小的情况;类表继承适用于子类之间差别大的情况;混合继承适用于需要单独处理子类的情况。

Redis和MongoDB。前者用于缓存提高访问某些数据的性能和效率,提高用户体验,后者适合存储文档类型的数据
正确。Redis是键值存储数据库,适用于缓存和会话管理。MongoDB是文档数据库,适用于存储和处理结构灵活的文档数据。

引擎属于内核的一部分,内核还包含事务管理器、日志管理器、查询处理器等组件
正确。数据库引擎是内核的一部分,内核还包括事务管理器、日志管理器、查询处理器等。

了解阿里的PolarDB
阿里的PolarDB是阿里云推出的一款云原生数据库产品。PolarDB结合了传统关系型数据库的高一致性和NoSQL数据库的高扩展性,旨在为用户提供高性能、高可用和高扩展性的数据库服务。

  1. PolarDB的架构
    PolarDB采用分布式共享存储架构,这意味着多个数据库节点可以共享同一个存储,显著提升了数据一致性和可用性。

类比:PolarDB的共享存储架构类似于一个云存储系统,多个用户可以同时访问和操作同一个文件,而不需要分别下载和上传文件。

  1. 主要特点
    高性能:PolarDB通过分布式架构和并行处理,提供了高吞吐量和低延迟的数据库性能。
    高可用性:通过多副本数据同步和自动故障切换机制,PolarDB保证了数据的高可用性。
    高扩展性:PolarDB支持弹性扩展,可以根据业务需求动态增加或减少计算资源和存储空间。
    兼容性:PolarDB兼容MySQL和PostgreSQL,用户可以无缝迁移现有的数据库应用。
  2. 应用场景
    互联网应用:例如社交网络、电子商务等,需要高并发、高吞吐量的数据库支持。
    企业应用:例如ERP、CRM系统等,需要高可用性和高可靠性的数据库服务。
    大数据分析:PolarDB可以处理大规模数据分析任务,支持实时数据处理和分析。
  3. 核心技术
    分布式共享存储:多节点共享同一个存储,保证数据的一致性和高可用性。
    并行处理:通过分布式计算和并行处理技术,提高数据处理速度和性能。
    自动故障切换:当一个节点发生故障时,系统会自动切换到备用节点,保证服务的连续性。
    多副本同步:数据实时同步到多个副本,防止数据丢失和损坏。
  4. PolarDB与传统数据库的对比
    传统数据库:如MySQL、PostgreSQL,通常采用主从复制架构,需要手动处理数据一致性和高可用性问题。
    PolarDB:采用分布式共享存储架构,自动处理数据一致性和高可用性问题,支持弹性扩展。
    总结
    PolarDB是一个结合了传统关系型数据库和NoSQL数据库优势的云原生数据库,提供高性能、高可用性和高扩展性的数据库服务。它适用于需要高并发、高吞吐量和高可用性的应用场景。