数据库系统课程笔记

笔者于21年秋季做的关于数据库系统的课程笔记,整理文件时发现的……

内容比较粗糙,可参考的内容有限……

0.随便写写

SQL学习网站:w3school

行,数据与元组:表中每一行也称一个数据,也可称为一个元组

列,属性与元素:表中每一列也称一个属性,也可称为一个字段

数据完整性:

实体完整性:主键不能为空

内容完整性:要符合实际意义

可以出题的点:

1.关系代数运算:要明白写法及符号

2.写Mysql语句:having,count,where,distinct,group by 聚集函数等各种用法

3.ER视图:课本+PPT

4.抽象函数模型(最难):课本+PPT,课本上例题较全,可以参照。

1.数据库技术概述

1.1:数据和信息

数据具备的三个属性:

以个人为例:

类别属性:电话是一类数据,工作计划是另一类数据

每类数据都有很多条目,构成数据集

有用性:从有用性来说,数据就是信息

语意性:数据有其特定含义。如18身份证号前六位表示地区,中间八位表示出生年月。

信息:

定义:信息是用来消除随机不确定性的东西。

信息经过加工处理可以成为数据,满足用户决策的需要。

1.2:数据库的概念

数据库:

可以理解为储存数据的“容器”,

谁有数据,都存到数据库中;谁需要数据,便从数据库中读取。

数据库的存在,使得数据的存储与管理由分散方式改为集中方式

数据库中的数据是海量的,具有共享性。

数据库的特点:

以学校为例:

1.包含多种类型的数据:数据库中包含学生数据,老师数据,课程数据。

2.每类数据中包含多个条目,构成一个数据集:学校中有多个学生,每位学生都有一条记录,所有学生的记录构成一个集合。

3.数据之间具有关联性:学生数据和课程数据之间自然是有联系的

4.数据库中的数据是海量的,且具有共享性:数以万计,数以亿计

1.3:数据库中数据组织及其结构

数据模型:数据的组织及其结构

关系型数据库:采用关系数据模型的数据库

在关系型数据库中,数据按照关系来组织,数据以结构来存储,而表由组成。

一个关系型数据库中有多个表:如学生表,课程表,老师表

一个表对应一个类,一个类也对应一个表,一个表存储一类数据

类在表中的体现就是表的模式(表记录的是关于什么的数据?)

类的实例在表中对应着表的数据

例如:学生类对应的是学生表,此类的实例是每个学生的相关信息,对应着学生表中一行的数据

一行数据对应着一个类的实例,一个类的实例也对应一个表

注意:

1.不能把多种类型的数据混合存放在一个表里

2.一个类型的数据不能用多个表来存储

1.4数据库中数据操作

增,查,改,删,统计。

进行数据操作的时候,要指明针对数据库中的哪个表,对哪行的数据进行哪一种操作。

1.5数据库管理系统与数据库应用程序

提高数据查找效率的方法:数据分类,数据排序,数据索引

计算机中,储存数据的主要设备是磁盘,磁盘由磁头和磁片组成,磁头读写数据,磁片被划分为一圈又一圈的磁道,每个磁道又均分为多个块。

对于数据库用户而言,数据库管理系统(DBMS)为用户提供数据操作的编程接口。

从软件角度而言,数据库管理系统为用户提供数据操作服务

用户并不直接和DBMS进行交互,而是通过数据库应用程序来完成对数据库的访问。

数据库,数据库管理系统,数据库应用程序共同构成数据库系统(database system)(MIS)。

如果把数据库系统比作网店,那么数据库就是仓库,数据库管理系统就是网店平台上的网店(提供东西),数据库应用程序则是淘宝,京东这样的网店平台。

存储数据库并运行数据库管理系统软件的计算机通常称作数据库服务器。

数据库应用程序与数据库管理系统通常是多对一的关系(每个用户手机上都会有淘宝,不是吗)

1.6数据库应用的广泛性

1.7数据模型

数据模型描述数据库中数据以及数据之间关系的基本概念。

关系数据模型:数据按照关系来组织。

典型的数据类型:字符串类型,日期类型,整数类型,实数类型,布尔类型。

2.关系数据模型

2.1关系数据模型及其特性

数据模型包括数据结构,数据完整性约束规则,数据运算。

在关系数据模型中

数据结构:二维表

数据完整性约束规则:实体,引用,域,业务规则

数据运算:布尔代数

表由模式和数据组成,模式表明表存什么样的数据,相当于面向对象编程语言中的类。

不同表之间实际上是有联系的。

类与类之间有关系,实例与实例之间也有关系。

表中每一行也称一个数据,也可称为一个元组

表中每一列也称一个属性,也可称为一个字段

关系的特性:

1.一个数据库中,每个表的名字是唯一的

2.一个表中,列的名字要唯一

3.每行数据表达一个实例,一个实例在表中只有一个数据

4.表中的行和列没有先后概念

主键:

定义:一个表中,标识行数据的一个列或多个列。(?)

在设定一张表的时候,一张表中有一个或几个属性是特殊的。通过这一属性,我们可以“严格地”区分每个数据。

其实很好理解:“你根据数据的什么属性来确定这份数据是你要找的那份数据?”

比如在学生表中,学生的学号可以作为主键(每位同学的学号是唯一的)但姓名不能(重名)。

判定数据是否重复——利用主键约束。

主键也可以由属性的组合(就是多个属性)构成。

主键的确定要精准,并且要基于现实含义。

所有定义为主键的字段不能定义为空。

比如,对于学生类,给定一个学号,我们就能得知学生的名字,相貌,籍贯,学业情况……

外键:

一个表中的一个列或多个列在另外一个表中是主键。

外键的指明也不能出现遗漏。

在指明一个外键时,还要证明它是引用了哪个表中的主键。

数据库中的表分为实体表和联系表

对于联系表而言,它表达了两个类的实例之间是多对多的关系。

域约束:

每个字段要有它的取值范围。

比如成绩表中,分数不能小于0,学生表中,学生名字长度不能超过多少多少

业务规则约束:

一些字段需要满足一些特殊的要求:

比如:学生一学期选课学分不能超过多少多少

数据库中的二维表和生活中用的表是有差距的。不能把平日里的表直接保存到数据库中。

我们生活中要用到的业务表是由分布在数据库中的多个表中的多个列组成的。

关系代数:

目的:把数据库中的表转换为业务表

首先,数据会严格地分表存储,而且一份数据只存一份。这就会引发业务表与数据库中的表不一致的问题

这就要用到关系代数了。

关系代数由操作数和操作符组成。

以表为单位计算,输入的是关系(表),输出的还是关系(表)。

一元运算:

选择:横向,只对行作选择

投影:纵向,只对列作选择

二元运算:

取并集,取交集,差运算(减去共同元素),笛卡尔积

笛卡尔积:可以类似与“乘法”

第一张表三条数据,第二张表四条数据,最终得到的表里会有12条数据。

自然连接:智能地连接起来。可以看作一个组合运算,先作笛卡尔乘积运算,再作选择运算,再作投影运算。

自然连接运算基本要求:要有共同的属性,一个表中是主键的,在另一个表中是外键。

含外键的表在自然连接中是主干表。

自然连接对含外键的表,实现了列的扩增。

自然连接不满足交换律

除:两个表,R÷S,R与S中有部分共同的属性,R÷S得到的就是关系R包含而关系S不包含的属性。

一个例子:

image-20240719235143476

R÷S的结果是:

image-20240719235157778

R与S公共的属性是Y(这两个属性不一定要名字相同,但表示的意义应当相同),公共的Y属性有Y1,Y2。Y1,Y2组成集合y。R表中包含而S表中不包含的属性是X。在R表中,X1对应的Y的集合为{Y2},≠y,不是除运算的结果。而X2对应的Y的集合是{Y1,Y2,Y3},包括y中所有的元素,所以X2是除运算的结果。因此答案是X2。

运算优先级:带括号的 > 一元运算符 > 二元运算符

3.数据操作

SQL是声明性语言,只需要表明需要做什么,不表达做的过程。

SQL由数据定语言(DDL)和数据操作语言(DML)构成。

SQL不区分大小写

转义:select * from user where username like ‘/ni_hao’ escape ‘/‘

​ 意思就是说/之后的_不作为通配符

查询操作:select 列名 from 输入表表名 where 限制条件

(where中通常指定主键)

模糊查询:关键字LIKE

%:通配任意长度的字符

_:通配一个字符

where name LIKE ‘李_’

列名中第一个字是李,而且只有两个字符的行。

DISTINCT:返回的数据不重复

ORDER BY:对结果进行排序

ASC:升序排列(从小到大)DESC:降序排列(从大到小)

五个基本聚集函数:

COUNT求行数,SUM求和,AVG求平均值,MIN求最小值,MAX求最大值

除了count,其它的函数都会忽视null值。

利用关键字AS可以修改表格。

一些查询:

两个查询可以弄成一个查询(嵌套查询)

嵌套查询:

select name from student where no in(select no from course where no=’2’)

从”选了课程号为2的课程的学生“中查询名字

不相关子查询:子查询的查询条件不依赖于父查询

子查询要放在比较运算符之后

一些查询中的关键词:

ALL(所有), ANY(存在), EXIST , IN ,比较运算符

1.in 后面的表中只能有一个字段

2.mysql中没有自然连接

3.select into要求新的表并不存在

​ mysql不支持select into

4.where后面不能跟聚集函数

5.group by有去重的功能

6.对一个已经查询完的表想要再分类就用having关键字

4.数据定义语言DDL

在建表的过程中,就已经包含了主键,外键,域约束的定义

业务规则约束需要用触发器实现。

业务规则约束:

1.当前行数据,不同字段取值彼此之间存在关联约束

2.当前行数据,受该表中其他行约束

3.当前行数据,受其他表中行的约束

触发器:用于监视某个表的insert,update,delete等更新操作,实现数据的自动维护。

创建触发器语句:create trigger

create trigger 触发器名 触发时间 触发事件 of 字段 on 表名

for each row

begin

触发程序

end

触发时间:before:在相应操作执行之前就触发相应代码,after:在相应操作执行之后触发相应代码

触发事件:update,delete,insert等

for each row:行级触发器:表示每一条记录都会执行一次触发程序。

old与new:使用new关键字表示新纪录(修改之后的记录)。

需要访问旧纪录的某个字段值时,可使用 “old 字段名”来使用。

mysql中不用“REFERENCING”那一行。

数据库特征

数据库中的表:专一性,全局性,连续性

用户业务数据表:局部性,综合性,多样性

视图:和表有许多相似的地方。视图也是由若干个字段以及若干条记录组成,试图也可以作为select语句的数据源。

CREATE VIEW

5.数据库安全性

安全机制:

第一道:用户名和密码

第二道:每位角色权限

第三道:视图机制,控制一些业务规则

统计数据库:只允许用户查询特定的信息

数据库安全机制设计目标:试图破坏安全的人所花费的代价远大于其所获得的利益。

6.事务处理与故障恢复

1.事务:一个数据库的操作序列,一个不可分割的工作单位,是恢复和并发控制的基本单位。

一条或多条SQL语句,也可以包含一个或多个程序。

控制:显式定义:

BEGIN TRANSACTION

语句1

语句2

……

COMMIT /ROLLBACK(结束)

事务中的语句,要么全部执行,要么全部不执行

事务属性:ACID 原子性 隔离性 一致性 持久性

外部看来,数据库中的数据总是正确的

隔离性:尽管多个事务并发执行,但从外部看来,具有多个事务串行执行的效果

持久性:事务一旦提交,即使随后发生故障,结果在数据库中也不会丢失

数据库的恢复:数据库从错误状态恢复到某已知的正确状态。

恢复机制:1.数据转储,建立数据备份;2.

数据转储:

定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本称为后备副本或后援副本。

当数据库遭到破坏后可以将后备副本重新装入,但重装后备副本只能将数据库恢复到转储时的状态,要想恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务。

优点:不用等待正在运行的用户事务结束;不会影响新事务的运行

缺点:不一定正确。

后备副本加日志文件才能恢复到正确状态。

海量转储:一次都转储全部数据库

增量转储:只转储上次转储后更新的部分

日志文件:

以记录为单位:事务标识,操作类型,操作对象

必须先写日志文件,后写数据库。写日志文件:把表示这个修改的日志记录写到日志文件中去。

重做redo:在故障发生之间已经提交的事务,既有开始BEGIN,又有COMMIT

撤销undo:

日志与数据库不应写在一个磁盘上

7.数据处理性能问题

通过有效方法处理海量数据:

挖掘,利用数据特性,机器特性,访问特性

有效方法:数据分类/排序,数据索引

内存起到一个缓冲功能,其中的数据如果断了电就没了

数据需要CPU处理完成,但数据全部存储在磁盘上。

磁盘:容量大,数据不受影响;但是访问速度慢。

性能度量指标:

事务吞吐量

响应时间

提高数据库性能的策略:

挖掘利用数据特性,硬件特性,数据访问特性。

减小磁头移动路程(需要合理分配空间),减少运输次数,减少无效运输。

磁盘的存储区是一圈一圈的,为了读写到不同的圈,磁头要作径向移动,为了读写一圈的数据,磁盘要绕轴旋转。

把读写频率高的数据存放在磁盘的中间区域,读写频率低的数据放在磁盘边沿区域。

基于缓存的数据传输优化

CPU与磁盘之间设置有缓存。缓存是CPU与磁盘的中间件,类似于用钱时的”钱包”

“为了用钱方便,人们常把钱放在口袋里便于取用。弊端是容易被偷。”

“从安全角度看,钱最好存放在银行里,不会丢失,但这样一来你每次用钱都要去银行,效率低得可怕。”

减少无效运输与无效处理

设置索引:索引的本质是对数据进行缩减处理,额外形成一个缩减版本,再通过排序减少磁盘访问量。

顺序索引:“目录”

注:一张表数据量不大的话,就不要创建索引;(给几页的文章用目录意义不大在,反而会更加麻烦)

对长字段或最大长度大的变长字段不要创建索引,这样压缩比会小;

散列索引:利用散列表,只适用于等值类的查询。

数据库的并发控制(P144):

提高事务的资源利用率,同一时间内多个事务运行。

数据库中,事务是我们调用的基本单位。

多用户数据库系统的存在:允许多个用户同时使用数据库系统。

不同的事务执行方式:

1.事务串行执行:每个时刻只有一个事务运行

2.交叉并发运行:并行事务的并行操作轮流交叉进行,微观上串行,宏观上并行。

3.同时并发方式:

问题:会出现多个事务同时存取一个数据的情况,可能会存取存储不正确的数据,破坏事务的一致性和数据库的一致性。

并发控制机制的任务:

对并发操作进行正确调度,

同时保证事务的隔离性,

保证数据库的一致性

在并发操作的情况下,对甲乙两个事务操作序列的调度是随机的。

并发操作会带来数据的不一致性:丢失修改,不可重复读,读脏数据(即读到不正确的数据)

并发控制的主要技术:封锁,时间戳,乐观控制法

封锁:

事务T在对某个数据对象操作之前,先向系统发出请求进行加锁;枷锁后事务T就对该数据对象就有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。

封锁的对象是数据

基本封锁类型:

排他锁,写锁(X锁),可以共享,既不允许别人读,也不允许别人改

共享锁,读锁(S锁),可以共享,允许别人读,不允许别人改

相容矩阵

封锁会带来新的问题。

活锁:某个事务有可能会无限地等待下去。

避免活锁:按请求封锁的先后次序对事务排队,”先来先封锁“

死锁(比较麻烦):多个事务封锁的数据之间相互妨碍。

预防死锁:一次封锁,一次性对所有数据加锁,太简单粗暴

顺序封锁法:

操作系统中广为采用的预防死锁的策略并不适用于数据库。

死锁的诊断:

超时法:如果一个事务的等待时间超出了某个规定的时限,就认为发生了死锁

但有可能会误判

事务等待图:有向图,如果出现了回路,就意味着出现了死锁

解除死锁:选择一个处理死锁代价最小的事务,将其撤销(最不急的事务)

调度的正确性:

DBMS对并发事务不同的调度可能会产生不同的结果

可串行化调度:判断并发调度是否正确,可以看其结果是否与某个串行调度的结果相同。

同一个事务内操作顺序不能被改变,不能调换冲突事务的顺序。

封锁协议:运用封锁方法时,对数据对象加锁需要约定一些规则:何时申请封锁,封锁时间,何时解除封锁

两段锁协议:所有事务必须分两个阶段对数据项加锁和解锁

在释放一个封锁后,事务不能再对任何其他事务加锁了。

遵循两段锁协议的并发调度一定是正确的。

查询优化:代数优化或物理优化。

代数优化:

8.数据库设计(重点)

数据库设计概述:

对于一个给定的应用环境,构造优化的数据库逻辑模式与物理结构,并据此建立数据库及其应用系统,使之能够有效地存储并管理数据。

结构(数据)设计与行为(处理)设计相结合

需要将数据库结构设计与数据处理设计密切结合。

实体-联系模型:简单,易于理解。

包含概念,约束,符号三部分。

概念:实体,联系,属性。

ER建模(考点之一):

ER建模:本门课采用UML语言。()

过程:1.标识实体

​ 2.标识联系

​ 3.实体要添加其属性,也别忘了标记主键。

实体用方框表示,实体名放在方框中。

实体的属性应放在实体下面的方框中。

联系是实体之间的关系。一个联系所涉及的实体的数量称为

基:最悲观情况 顶:最乐观情况

0..*:最少0个,最多不设上限。

建模陷阱:

扇形陷阱(Fan Traps)

定义:实体间的关联性让人感觉混淆,扇形陷阱通常是产生于一些实体拥有多个一对多的关联,好像扇子散开一样,而关联在一起的实体间的关联性让人产生混淆。

断层陷阱(Chasm Traps)

定义:实体间应该存在的关系却没有体现出来,两个实体间并没有办法找到一条路径来连接。

函数依赖理论(最难的部分):

关系合理性验证:

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信