数据库系统
推荐网课:
【【自用】数据库系统概论学习】
网课教材:数据库系统概述
本校课程教材:Database System Concepts 6th Edition
考试相关
SQL占比多一点,DMBS少一点
数据,数据库,数据库管理系统,数据库系统
- 数据:描述事物的符号记录
- 数据库:按照数据结构来组织、存储和管理数据的仓库
- 其中数据的三个特点:永久存储,有组织,可共享
- 数据库管理系统:数据库系统的核心,是一种操纵和管理数据库的软件
- 数据库系统:由数据库和数据库管理系统组成的集合
数据库管理系统 DBMS
- 数据定义功能
- 数据组织、存储和管理功能
- 数据操纵功能
- 数据库的事务管理和运行管理
- 数据库的建立和维护功能
数据库系统
数据库系统一般由数据库、数据库管理系统(及其开发工具) 、应用系统、数据库管理员等组成。
GPTs:
学习数据库理论知识是一个非常有益且丰富的过程,因为数据库是现代计算机系统中不可或缺的一部分。为了开始学习数据库理论,我们可以从几个关键的概念和步骤入手。我们将逐步深入每个概念,并使用类比来帮助理解。
第一步:理解基本概念
数据库(Database)
数据库就像一个组织良好的数字化图书馆。每本书(数据)都被有序地放在一个特定的位置(表格),方便我们快速找到并读取。数据库管理系统(DBMS)
DBMS就像图书馆的管理员,它负责管理、维护和组织图书馆里的书籍。常见的DBMS包括MySQL、PostgreSQL、Oracle、SQL Server等。SQL(结构化查询语言)
SQL是一种专门用于与数据库交互的语言,就像是与图书管理员交流的语言。通过SQL,我们可以告诉DBMS我们需要什么数据,或者要如何组织数据。
第二步:理解关系型数据库
关系型数据库(Relational Database)
关系型数据库是最常见的一种数据库类型。它将数据存储在一系列的表格中,每个表格就像是一个电子表格(如Excel),包含行和列。表(Table)
表是数据库中的基本存储结构。可以将其看作是一个有行和列的电子表格。每一行代表一条记录(Record),每一列代表一个字段(Field)。主键(Primary Key)
主键是表中用于唯一标识每条记录的字段。例如,在一个学生信息表中,学号可以作为主键,因为每个学生的学号都是独一无二的。外键(Foreign Key)
外键是用于在表之间建立联系的字段。例如,在一个课程表中,可以有一个学生学号的外键,表示哪些学生选了这门课。
进一步理解主键和外键
- 主键(Primary Key)
主键是一种特殊的字段(或多个字段的组合),用于唯一标识表中的每一行记录。每个表只能有一个主键。
类比:主键就像你的身份证号码,在一个国家里每个人的身份证号码都是独一无二的,用来唯一识别一个人。
特性:
唯一性:主键的值必须唯一。
非空:主键的值不能为NULL。
- 外键(Foreign Key)
外键是一个表中的字段,它引用另一个表的主键,用于在两个表之间建立关联。
类比:外键就像是你的学生证号码,它连接了学校系统中的学生信息(主键是学生的学号),可以用来查找与学生相关的其他信息,比如课程表。
特性:
引用完整性:外键的值必须在被引用的表(父表)中存在,确保数据的一致性。
规范化(Normalization)
规范化是数据库设计中重要的一部分,用于减少冗余数据和提高数据的一致性。规范化过程包括多个阶段(范式),每个阶段都有特定的规则和目标。
第一范式(1NF)
每个字段只能包含一个值,每个记录都是唯一的。
第二范式(2NF)
在1NF的基础上,所有非主键字段必须完全依赖于主键,消除部分依赖。
第三范式(3NF)
在2NF的基础上,消除传递依赖,非主键字段不能依赖于其他非主键字段。
类比:
第一范式:就像一个图书馆的书架上,每个格子只能放一本书。
第二范式:确保每本书都在它应该在的特定分类架上,而不是一部分书在一个分类架上,另一部分书在另一个分类架上。
第三范式:确保每本书的所有信息都集中在一个地方,而不是部分信息在一个书架上,部分信息在另一个书架上。
主键和外键的区别是,前者是每条记录独一无二唯一的标识编号,后者是用于不同表之间的记录相互关联而存在的别的表的主键;第一范式规定了字段值的唯一性,和记录之间的差异性,第二范式规定了非主键字段存在的前提是主键的存在,第三范式规定了非主键字段只独立地依赖于主键,和其他字段都是并列的关系;
高级SQL查询:子查询、连接和聚合函数
事务(Transaction)和并发控制
索引(Index)和性能优化
数据库设计模式
非关系型数据库(NoSQL)的基本概念
- 高级SQL查询
子查询(Subquery)
子查询是嵌套在其他查询中的查询。它可以用在SELECT、INSERT、UPDATE、DELETE语句中,用于完成复杂的数据检索。
类比:子查询就像是在主查询中插入一个小的查询任务,类似于在大任务中分配一个子任务。
1 | -- 查询所有选修了某门课程(如课程ID为1)的学生 |
连接(Join)
连接是用于从多个表中检索数据的操作。常见的连接类型有内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。
类比:连接就像是将两个表格拼接在一起,根据某个共同的字段(如主键和外键)来匹配对应的行。
1 | -- 查询所有学生及其选修的课程名称 |
聚合函数(Aggregate Functions)
聚合函数用于对一组值执行计算,并返回单一的值。常见的聚合函数有COUNT、SUM、AVG、MIN、MAX。
类比:聚合函数就像是对一组数据进行统计分析,比如统计班级人数,计算总成绩,平均成绩等。
1 | -- 查询选修每门课程的学生数量 |
- 事务(Transaction)和并发控制
事务(Transaction)
事务是一组操作的集合,这些操作要么全部执行,要么全部不执行。事务具有四个重要特性,称为ACID特性:
原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。
一致性(Consistency):事务执行前后,数据库的状态必须保持一致。
隔离性(Isolation):并发执行的事务之间不会互相影响。
持久性(Durability):事务一旦提交,对数据库的改变是永久的。
类比:事务就像银行转账,要么同时完成扣款和存款,要么都不执行,确保转账过程中的一致性和安全性。
1 | -- 事务示例 |
并发控制(Concurrency Control)
并发控制用于管理多个事务同时执行时的相互影响,常用的方法包括锁机制(Locking)和多版本并发控制(MVCC)。
类比:并发控制就像图书馆的借书系统,确保同一本书不会被多个借阅者同时借走。
- 索引(Index)和性能优化
索引(Index)
索引是一种加速数据库查询的技术,类似于书的目录,通过目录可以快速找到所需的内容。常见的索引类型有B树索引和哈希索引。
类比:索引就像是书的目录,通过目录可以快速找到所需的章节。
1 | -- 创建索引 |
性能优化
性能优化涉及查询优化、索引优化和数据库设计优化。常用的技术包括优化SQL查询、合理使用索引、分区(Partitioning)和缓存(Caching)。
类比:性能优化就像是图书馆的管理系统,通过合理的书架布局和借阅管理,提升查找和借阅的效率。
- 数据库设计模式
数据库设计模式是解决常见数据库设计问题的最佳实践,包括单表继承(Single Table Inheritance)、类表继承(Class Table Inheritance)和混合继承(Concrete Table Inheritance)。
类比:数据库设计模式就像建筑设计的蓝图,不同的设计方案适用于不同的建筑需求。
- 非关系型数据库(NoSQL)的基本概念
非关系型数据库包括文档数据库(如MongoDB)、键值存储(如Redis)、列存储(如Cassandra)和图数据库(如Neo4j)。
类比:NoSQL数据库就像是不同类型的存储系统,用于处理不同类型的数据需求,比如文档存储、键值对存储、大规模列存储和关系图存储。
连接类型及其使用场景
- 内连接(INNER JOIN)
内连接是最常见的连接类型,它返回两个表中匹配的记录。
类比:内连接就像是在两个好友列表中找共同的好友,只显示同时出现在两个列表中的人。
使用场景:当需要检索两个表中都有的数据时。
1 | -- 查询所有学生及其选修的课程名称 |
- 左连接(LEFT JOIN)
左连接返回左表中的所有记录,即使右表中没有匹配的记录。
类比:左连接就像是在你的好友列表中找共同好友,如果对方列表中没有匹配的,也会显示你的好友,只不过对方的信息为空。
使用场景:当需要显示左表中的所有记录,以及匹配右表中的数据时。
1 | -- 查询所有学生及其选修的课程名称,如果没有选修课程也显示学生信息 |
- 右连接(RIGHT JOIN)
右连接返回右表中的所有记录,即使左表中没有匹配的记录。
类比:右连接就像是在对方的好友列表中找共同好友,如果你的列表中没有匹配的,也会显示对方的好友,只不过你的信息为空。
使用场景:当需要显示右表中的所有记录,以及匹配左表中的数据时。
1 | -- 查询所有课程及选修这些课程的学生姓名,如果没有学生选修也显示课程信息 |
- 全连接(FULL JOIN)
全连接返回两个表中所有的记录,无论是否匹配。
类比:全连接就像是两个好友列表的合并,显示所有的好友信息,即使没有匹配的也显示出来。
使用场景:当需要显示两个表中的所有记录,并且包括所有的匹配和不匹配的数据时。
1 | -- 全连接通常不被直接支持,使用UNION实现 |
索引及其性能优化
索引(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)的类型及应用场景
- 文档数据库(Document Store)
如MongoDB,存储的是文档(JSON、BSON)。
应用场景:内容管理系统,博客平台等,需要灵活的文档格式。
类比:像文件夹里的文档,每个文档可以有不同的结构。
- 键值存储(Key-Value Store)
如Redis,存储键值对。
应用场景:会话管理,缓存系统等,需要快速读写数据的应用。
类比:像字典,每个键对应一个值。
- 列存储(Column Store)
如Cassandra,数据按列存储。
应用场景:大数据分析,日志管理等,需要高效写入和读取特定列数据的应用。
类比:像电子表格,可以按列快速查找数据。
- 图数据库(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数据库的高扩展性,旨在为用户提供高性能、高可用和高扩展性的数据库服务。
- PolarDB的架构
PolarDB采用分布式共享存储架构,这意味着多个数据库节点可以共享同一个存储,显著提升了数据一致性和可用性。
类比:PolarDB的共享存储架构类似于一个云存储系统,多个用户可以同时访问和操作同一个文件,而不需要分别下载和上传文件。
- 主要特点
高性能:PolarDB通过分布式架构和并行处理,提供了高吞吐量和低延迟的数据库性能。
高可用性:通过多副本数据同步和自动故障切换机制,PolarDB保证了数据的高可用性。
高扩展性:PolarDB支持弹性扩展,可以根据业务需求动态增加或减少计算资源和存储空间。
兼容性:PolarDB兼容MySQL和PostgreSQL,用户可以无缝迁移现有的数据库应用。 - 应用场景
互联网应用:例如社交网络、电子商务等,需要高并发、高吞吐量的数据库支持。
企业应用:例如ERP、CRM系统等,需要高可用性和高可靠性的数据库服务。
大数据分析:PolarDB可以处理大规模数据分析任务,支持实时数据处理和分析。 - 核心技术
分布式共享存储:多节点共享同一个存储,保证数据的一致性和高可用性。
并行处理:通过分布式计算和并行处理技术,提高数据处理速度和性能。
自动故障切换:当一个节点发生故障时,系统会自动切换到备用节点,保证服务的连续性。
多副本同步:数据实时同步到多个副本,防止数据丢失和损坏。 - PolarDB与传统数据库的对比
传统数据库:如MySQL、PostgreSQL,通常采用主从复制架构,需要手动处理数据一致性和高可用性问题。
PolarDB:采用分布式共享存储架构,自动处理数据一致性和高可用性问题,支持弹性扩展。
总结
PolarDB是一个结合了传统关系型数据库和NoSQL数据库优势的云原生数据库,提供高性能、高可用性和高扩展性的数据库服务。它适用于需要高并发、高吞吐量和高可用性的应用场景。
考试:
ppt