数据库原理一
auggie

前言

  • 理解数据库系统结构
  • 掌握数据库基本概念和理论知识
  • 了解数据库技术发展的趋势
  • 掌握关系代数、关系演算、SQL 语言

数据库发展史

  • 数据管理技术史
  • 数据库技术史
  • 数据库应用系统体系结构的发展

数据管理技术发展史

人工管理阶段

  • 数据的逻辑结构和物理结构相同,数据的组织方式必须由程序员自行设计和安排
  • 数据不保存在机器中
  • 没有专门的软件对数据进行管理
  • 只有程序的概念,没有文件的概念数据面向应用

文件系统阶段

  • 逻辑结构和物理结构有一定的区别,通过文件系统来实现两者的转化
  • 数据可以长期保存在外存上
  • 文件的逻辑结构多样化
  • 数据面向应用,对数据的访问以记录为单位。
  • 数据可以被不用的程序重复利用

缺点:

  • 数据冗余
  • 数据不一致
  • 数据联系弱

倒排文件系统

提高系统性能,对索引文件进行推广。

优点:使用户不仅能用关键码,而且也能按字段的任何组合。容易地检索记录。很适合于信息检索系统。

缺点:1. 索引占用更多存储空间 2. 数据更新比较困难

数据库系统

特点

  • 面向全组织的复杂的数据结构,实现数据的结构化
  • 有较高的数据独立性
  • 系统提供了四个方面的控制功能
    • 数据库恢复
    • 数据库并发控制
    • 数据完整性
    • 数据安全性
  • 数据的操作可以以数据项为单位,增加了系统的灵活性
  • 用户可以采用程序方式或者交互方式操作数据库

数据库的三级模式结构

image-20220424214741945

  • 模式 – 概念模式 – 全局模式

    数据库中全部数据的整体逻辑结构的描述。描述了全局数据视图

    • 与数据的物理存储结构无关
    • 与具体用户应用程序、开发工具以及高级程序设计语言无关
  • 外模式

    用户的数据视图,通常是模式的子集。

    • 保证了数据库的安全性提供了有力的措施
  • 内模式 – 存储模式

    数据库的物理结构。定义了所有内部记录类型。实现了数据控制方面的细节。

  • 模式 / 内模式映像

    用于定义模式和内模式之间的对应性。

    • 需要说明记录和内部记录之间的对应性
    • 一般放在内模式中描述
  • 外模式 / 模式映像

    一般放在外模式中实现

物理独立性

内模式修改,只需要对模式 / 内模式映像,概念模式可以尽可能保持不变。

逻辑独立性

逻辑模式修改,只需要对外模式 / 模式映像修改,就可以使外模式和应用程序尽可能保持不变。

数据库发展史

  1. IMS 系统 – 层次模型
  2. DBTG 报告 – 网状模型(Charls Batchman 网状数据库之父)
  3. E.F.Codd 文章 – 关系模型

数据库系统结构

  • 数据描述
  • 数据模型
  • 逻辑模型
  • 数据库体系结构

基本概念

数据模型用于表示实体类型及实体之间联系的模型。通常使用概念数据模型和逻辑数据模型。

概念设计描述数据库的概念结构 – ER 模型

逻辑设计描述计算机的数据形式 – 逻辑模型(关系模型)

概念数据模型 – ER 模型

逻辑数据模型 – 结构数据模型

ER 模型

独立于计算机系统的模型,用于建立信息世界的数据模型。

逻辑数据模型

面向数据库逻辑结构的模型

  • 数据结构:实体类型和实体联系的表达和实现
  • 数据操作:数据库的 CRUD
  • 数据完整性约束:
    • 实体完整型
    • 参照完整型
层次结构(指针导航)

有向树型结构表示实体类型及实体之间联系的模型称为层次模型。父子表示 1: N 的联系。

优点:易于实现、查询效率高

缺点:M:N 联系比较难实现、编写应用程序复杂

网状结构(指针导航)

有向图

优点:容易实现 M: N 联系、查询效率高

缺点:需要掌握数据库的逻辑结构才能编写对应的代码

关系模型(关键码导航)

二维表格

使用外键表示实体之间的联系

优点:表格简单、用户易懂、编写程序不涉及存储结构和访问技术的问题

对象模型

能表达递归和嵌套的数据结构

ER 模型

  • 实体、属性的基本概念
  • 属性的分类
  • 实体和属性的设计

基本概念

实体

客观存在可以互相分开的事物

属性

实体的某一个特征。关键属性加下划线

  • 基本属性:不可再分割的属性
  • 复合属性:可以分割的属性

image-20220424223002648

  • 单值属性:只能取一个值,例如:年龄
  • 多值属性:可以取很多值,例如:学位(可以既是学士,又是硕士)。使用双椭圆表示

image-20220424223226688

表示多值属性的两种方法

问题:简单的表示多值属性,将会产生大量的数据冗余,造成数据库的潜在数据异常、数据不一致性和完整性的缺陷。

  1. 增加新的属性

    image-20220424223601653

  2. 增加一个新的实体 1: M 的联系,弱实体

    image-20220424223621280

  • 导出属性:可以通过其他的属性或者实体导出

    image-20220424223745292

联系的设计和实现

一元联系

  1. 1: N 只需要一个关系模型
  2. 1: 1 只需要一个关系模型
  3. M: N 需要两个,增加一个表示关系的表(表示零件和零件之间的关系)

二元联系

  1. 1: 1 需要两个
  2. 1: N 需要两个
  3. M: N 需要三个,一个用于表示联系

三元联系

  1. 1:1:1 三张表 每张表加入两个外键
  2. 1:1:N 三张表,在 N 端加入两个外键
  3. 1:M:N 三张表,在 N 端和 M 端加入一个外键
  4. M:N:P 四张表

扩展

弱实体:实体的主键部分或者全部从父实体中获得

子类和超类:转换成关系模式的主键相同

关系运算

  • 概念:关系模型、关键码、关系的定义和性质、三类完整型规则
  • 关系代数:基本操作、组合操作、扩充操作
  • 关系演算:元组演算、域演算、关系演算的安全性和等价性
  • 查询优化

基本术语

关系模型 E.F.Codd

二维表格表示实体集、外键表示实体之间的联系。

关系:对应的二维表格,元组的集合、属性值域笛卡尔积的子集

元组:表中的

属性:表中的

域:属性的取值范围

关键码

超键:可以推导出完成的属性集合

候选键:唯一标识元组的最小属性集合,极小的概念

主键:候选键的一个

外键:包含另一个关系的主键

三类完整性

  • 实体完整性规则

    元组的主键值不能为空

  • 参照完整性规则

    元组的外键值只能是空值或者对应参照关系中的某一个主键的值

  • 用户定义的完整性规则

    由应用环境决定

关系数据库语言

  • 关系代数语言:集合操作为基础
  • 关系演算语言:谓词演算为基础
    • 元组关系演算
    • 域关系演算
  • SQL:基于关系代数和关系演算语言双重特点的语言

关系代数

基本运算

  • 笛卡尔积:两个关系全部元组的连接

    R 是 n 行 r 列的关系,S 是 m 行 s 列的关系。

    $R \times S$ 是 nm 行 r + s 列的关系

  • 选择

  • 投影

组合运算

  • 交:差

    image-20220425134214591

  • 联接:笛卡尔积、选择、投影

    • θ 联接:一个逻辑运算表达式,当为 == 的时候,称为等值连接
    • F 联接:多个 θ 的逻辑运算表达式的联接
    • 自然联接:公共属性相等的联接
  • 除:笛卡尔积、投影、差

    image-20220425135015806

常见题目

  1. 或:直接使用 或

    image-20220425140325751

  2. 同时使用:笛卡尔积

    image-20220425140307218

  3. 不使用:差

  4. 全部:除

    image-20220425140438969

扩充关系代数

  • 外联接:缺少部分直接使用 null 表示

    image-20220425141340310

  • 外部并:两个关系直接并在一起,然后缺少的属性直接为空

  • 半联接:image-20220425141442074

关系演算

以数理逻辑中的谓词演算基础,用公式表示关系演算的条件

按照变量分为:

  • 元组关系演算
  • 域关系演算

元组关系演算

原子公式

image-20220425141927129

约束变量和只有变量

image-20220425142010261

常见题目

  1. 使用两种:类似与笛卡尔积做法

    image-20220425145124165

  2. 都使用:任意(蕴含(存在))

    image-20220425145144214

  3. 不使用:任意(蕴含)

    image-20220425145208501

域关系演算

将元组拆成元素

安全性和等价性

image-20220425152428192

安全运算:不产生无限关系无穷验证的运算称为安全运算。通常采用安全约束集 DOM

查询优化

  • 尽早执行选择操作
  • 把笛卡尔积和其后的选择操作合并成 F 联接
  • 同时运算选择和投影,避免多次扫描文件
  • 适当预处理

步骤

  1. 选择全部拆开
  2. 选择尽可能移动树叶
  3. 投影尽可能移动树叶
  4. 把选择和投影合并为单个选择和投影
  5. 分组
    1. 将二元运算和一元祖先节点和下面的一元运算节点组合。
    2. 如果二元运算是笛卡尔积。如果选择不能组成等值连接的时候,不能并未同一组

结构化查询语言 SQL

  • SQL 数据库的体系结构,SQL 的组成
  • SQL 的数据定义:数据库、基本表、索引的创建和撤销
  • SQL 的数据 CRUD
  • 视图的创建和撤销,对视图更新操作的限制
  • 嵌入式 SQL:预处理方法、使用规定、使用技术、动态 SQL 语句

SQL 数据库体系结构

外模式对应视图、模式对应基本表、内模式对应存储文件

特点

  • 一体化
  • 两种使用方式,统一的语法结构
  • 高度非过程化
  • 语言简洁

组成

  • 数据定义
  • 数据操控
  • 数据控制
  • 嵌入式 SQL

SQL 数据定义

模式(命名空间)和数据库的创建和撤销

1
2
3
4
5
CREATE SCHEMA <NAME> AUTHORIZATION <USER>
CREATE DATABASE <NAME>

DROP SCHEMA <NAME> [CASCADE|RESTRICT]
DROP DATABASE <NAME> [CASCADE|RESTRICT]

基本表的创建、修改和撤销

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE schema.name (
列名 类型,
完整性约束,
PRIMARY KEY(SNO,PNO,JNO),
FOREIGN KEY(SNO) REFERENCES S(SNO),
CHECK(QTY BETWEEN 0 AND 10000)
);

# 增加属性
ALTER TABLE name ADD attribute type

# 删除属性
ALTER TABLE 基本表名 DROP 属性名 [CASCADE|RESTRICT]
  • 主键子句 PRIMARY KEY()
  • 外键子句 FOREIGN KEY()
  • 检查子句 CHECK

SQL 的 CRUD

image-20220425155637159

SELECT A FROM R WHERE F

1
2
3
4
5
SELECT [DISTINCT] A
FROM R
[WHERE F]
[GROUP BY a [HAVING exp]]
[ORDER BY array [ASC|DESC]];

执行过程

  1. FROM 读取基本表,执行笛卡尔积运算
  2. WHERE
  3. GROUP HAVING
  4. SELECT
  5. ORDER

使用 EXIST 和 NOT EXIST 谓词表示全称量词和逻辑蕴含⭐

  • 全称量词

    image-20220425170939340

    转化为不存在课程没有选修的学生

    image-20220425171004835

  • 逻辑蕴含

    image-20220425171104747

    与上面相类似

数据更新操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# insert
INSERT INTO t (列名)
VALUES
(val);

INSERT INTO t SELECT 查询语句;

# update
UPDATE t
SET t1 = t2
WHERE 条件;

# delete
DELETE FROM t
WHERE 条件

视图操作

对于视图的更新 INSERT, DELETE, UPDATE

  1. 多个表联接导出的话,不允许更新
  2. 使用了分组和聚合导出,不允许更新
  3. 从单个基本表导出,使用选择、投影导出,并且包含主键或某一个候选键,那么称为行列子集视图,并且可以被执行更新操作。
1
2
3
4
5
6
7
8
9
10
11
12
CREATE VIEW name (列表名)
AS SELECT 查询语句

DROP VIEW 视图名

# 视图的更新操作
INSERT INTO name
VALUES ()

UPDATE name
SET t1=t2
WHERE 条件

嵌入式 SQL

  • 在终端交互方式,称为交互式 SQL
  • 嵌入高级语言的程序中使用,称为嵌入式。高级语言称为宿主语言

高级语言和 SQL 的区别

SQL 是基于关系数据模型的语言;高级语言是关于基本数据类型的语言。

如何实现嵌入式 SQL

  1. 扩充宿主语言的编译程序,能够直接处理 SQL 语句
  2. 采用预处理的方式(多数系统采用)

预处理的实现

  1. 源程序扫描之后,识别出 SQL 语句。并处理成宿主语言的函数调用形式。
  2. 然后编译

通常是 DBMS 的制造商提供一个 SQL 函数定义库,供编译的时候使用。

image-20220425165325731

嵌入式 SQL 需要解决的问题

  1. 需要区分 SQL 语言和宿主语言

  2. 数据库工作单元和主程序工作单元之间的通信

    1. 允许嵌入式 SQL 语句引用宿主语言的程序变量
    2. 主语言不能引用数据库中的字段变量

  3. SQLSTATUS 是一个特殊的共享变量,用于解释 SQL 语句的执行情况。0 表示成功。

  4. 引入游标机制,将集合操作转换为单元组处理。用于协调不同数据处理方式

    1. SQL 面向集合,一条 SQL 可以产生或处理多条记录
    2. 宿主语言面向记录

    与游标相关的语句

    1. 定义游标 EXEC SQL DECLEAR <NAME> CURSOR FOR <SELECT> END_EXEC
    2. 使用 OPEM 打开游标 EXEC SQL OPEN <NAME> END_EXEC
    3. 推进游标 EXEC SQL FETCH FROM <游标名> INTO <变量表> END_EXEC
    4. 关闭游标 EXEC SQL CLOSE <NAME> END_EXEC