前言
- 理解数据库系统结构
- 掌握数据库基本概念和理论知识
- 了解数据库技术发展的趋势
- 掌握关系代数、关系演算、SQL 语言
数据库发展史
- 数据管理技术史
- 数据库技术史
- 数据库应用系统体系结构的发展
数据管理技术发展史
人工管理阶段
- 数据的逻辑结构和物理结构相同,数据的组织方式必须由程序员自行设计和安排
- 数据不保存在机器中
- 没有专门的软件对数据进行管理
- 只有程序的概念,没有文件的概念。数据面向应用
文件系统阶段
- 逻辑结构和物理结构有一定的区别,通过文件系统来实现两者的转化
- 数据可以长期保存在外存上
- 文件的逻辑结构多样化
- 数据面向应用,对数据的访问以记录为单位。
- 数据可以被不用的程序重复利用
缺点:
- 数据冗余
- 数据不一致
- 数据联系弱
倒排文件系统
提高系统性能,对索引文件进行推广。
优点:使用户不仅能用关键码,而且也能按字段的任何组合。容易地检索记录。很适合于信息检索系统。
缺点:1. 索引占用更多存储空间 2. 数据更新比较困难
数据库系统
特点
- 面向全组织的复杂的数据结构,实现数据的结构化
- 有较高的数据独立性
- 系统提供了四个方面的控制功能
- 数据库恢复
- 数据库并发控制
- 数据完整性
- 数据安全性
- 数据的操作可以以数据项为单位,增加了系统的灵活性
- 用户可以采用程序方式或者交互方式操作数据库
数据库的三级模式结构
模式 – 概念模式 – 全局模式
数据库中全部数据的整体逻辑结构的描述。描述了全局数据视图
- 与数据的物理存储结构无关
- 与具体用户应用程序、开发工具以及高级程序设计语言无关
外模式
用户的数据视图,通常是模式的子集。
- 保证了数据库的安全性提供了有力的措施
内模式 – 存储模式
数据库的物理结构。定义了所有内部记录类型。实现了数据控制方面的细节。
模式 / 内模式映像
用于定义模式和内模式之间的对应性。
- 需要说明记录和内部记录之间的对应性
- 一般放在内模式中描述
外模式 / 模式映像
一般放在外模式中实现
物理独立性
内模式修改,只需要对模式 / 内模式映像,概念模式可以尽可能保持不变。
逻辑独立性
逻辑模式修改,只需要对外模式 / 模式映像修改,就可以使外模式和应用程序尽可能保持不变。
数据库发展史
- IMS 系统 – 层次模型
- DBTG 报告 – 网状模型(Charls Batchman 网状数据库之父)
- E.F.Codd 文章 – 关系模型
数据库系统结构
- 数据描述
- 数据模型
- 逻辑模型
- 数据库体系结构
基本概念
数据模型用于表示实体类型及实体之间联系的模型。通常使用概念数据模型和逻辑数据模型。
概念设计描述数据库的概念结构 – ER 模型
逻辑设计描述计算机的数据形式 – 逻辑模型(关系模型)
概念数据模型 – ER 模型
逻辑数据模型 – 结构数据模型
ER 模型
独立于计算机系统的模型,用于建立信息世界的数据模型。
逻辑数据模型
面向数据库逻辑结构的模型
- 数据结构:实体类型和实体联系的表达和实现
- 数据操作:数据库的 CRUD
- 数据完整性约束:
- 实体完整型
- 参照完整型
层次结构(指针导航)
用有向树型结构表示实体类型及实体之间联系的模型称为层次模型。父子表示 1: N 的联系。
优点:易于实现、查询效率高
缺点:M:N 联系比较难实现、编写应用程序复杂
网状结构(指针导航)
有向图
优点:容易实现 M: N 联系、查询效率高
缺点:需要掌握数据库的逻辑结构才能编写对应的代码
关系模型(关键码导航)
二维表格
使用外键表示实体之间的联系
优点:表格简单、用户易懂、编写程序不涉及存储结构和访问技术的问题
对象模型
能表达递归和嵌套的数据结构
ER 模型
- 实体、属性的基本概念
- 属性的分类
- 实体和属性的设计
基本概念
实体
客观存在可以互相分开的事物
属性
实体的某一个特征。关键属性加下划线
- 基本属性:不可再分割的属性
- 复合属性:可以分割的属性
- 单值属性:只能取一个值,例如:年龄
- 多值属性:可以取很多值,例如:学位(可以既是学士,又是硕士)。使用双椭圆表示
表示多值属性的两种方法
问题:简单的表示多值属性,将会产生大量的数据冗余,造成数据库的潜在数据异常、数据不一致性和完整性的缺陷。
增加新的属性
增加一个新的实体 1: M 的联系,弱实体
导出属性:可以通过其他的属性或者实体导出
联系的设计和实现
一元联系
- 1: N 只需要一个关系模型
- 1: 1 只需要一个关系模型
- M: N 需要两个,增加一个表示关系的表(表示零件和零件之间的关系)
二元联系
- 1: 1 需要两个
- 1: N 需要两个
- M: N 需要三个,一个用于表示联系
三元联系
- 1:1:1 三张表 每张表加入两个外键
- 1:1:N 三张表,在 N 端加入两个外键
- 1:M:N 三张表,在 N 端和 M 端加入一个外键
- M:N:P 四张表
扩展
弱实体:实体的主键部分或者全部从父实体中获得
子类和超类:转换成关系模式的主键相同
关系运算
- 概念:关系模型、关键码、关系的定义和性质、三类完整型规则
- 关系代数:基本操作、组合操作、扩充操作
- 关系演算:元组演算、域演算、关系演算的安全性和等价性
- 查询优化
基本术语
关系模型 E.F.Codd
二维表格表示实体集、外键表示实体之间的联系。
关系:对应的二维表格,元组的集合、属性值域笛卡尔积的子集
元组:表中的行
属性:表中的列
域:属性的取值范围
关键码
超键:可以推导出完成的属性集合
候选键:唯一标识元组的最小属性集合,极小的概念
主键:候选键的一个
外键:包含另一个关系的主键
三类完整性
实体完整性规则
元组的主键值不能为空
参照完整性规则
元组的外键值只能是空值或者对应参照关系中的某一个主键的值
用户定义的完整性规则
由应用环境决定
关系数据库语言
- 关系代数语言:集合操作为基础
- 关系演算语言:谓词演算为基础
- 元组关系演算
- 域关系演算
- SQL:基于关系代数和关系演算语言双重特点的语言
关系代数
基本运算
并
差
笛卡尔积:两个关系全部元组的连接
R 是 n 行 r 列的关系,S 是 m 行 s 列的关系。
$R \times S$ 是 nm 行 r + s 列的关系
选择
投影
组合运算
交:差
联接:笛卡尔积、选择、投影
- θ 联接:一个逻辑运算表达式,当为 == 的时候,称为等值连接
- F 联接:多个 θ 的逻辑运算表达式的联接
- 自然联接:公共属性相等的联接
除:笛卡尔积、投影、差
常见题目
或:直接使用 或
同时使用:笛卡尔积
不使用:差
全部:除
扩充关系代数
外联接:缺少部分直接使用 null 表示
外部并:两个关系直接并在一起,然后缺少的属性直接为空
半联接:
关系演算
以数理逻辑中的谓词演算为基础,用公式表示关系演算的条件
按照变量分为:
- 元组关系演算
- 域关系演算
元组关系演算
原子公式
约束变量和只有变量
常见题目
使用两种:类似与笛卡尔积做法
都使用:任意(蕴含(存在))
不使用:任意(蕴含)
域关系演算
将元组拆成元素
安全性和等价性
安全运算:不产生无限关系和无穷验证的运算称为安全运算。通常采用安全约束集 DOM
查询优化
- 尽早执行选择操作
- 把笛卡尔积和其后的选择操作合并成 F 联接
- 同时运算选择和投影,避免多次扫描文件
- 适当预处理
步骤
- 把选择全部拆开
- 把选择尽可能移动到树叶端
- 把投影尽可能移动到树叶端
- 把选择和投影合并为单个选择和投影
- 分组
- 将二元运算和一元祖先节点和下面的一元运算节点组合。
- 如果二元运算是笛卡尔积。如果选择不能组成等值连接的时候,不能并未同一组
结构化查询语言 SQL
- SQL 数据库的体系结构,SQL 的组成
- SQL 的数据定义:数据库、基本表、索引的创建和撤销
- SQL 的数据 CRUD
- 视图的创建和撤销,对视图更新操作的限制
- 嵌入式 SQL:预处理方法、使用规定、使用技术、动态 SQL 语句
SQL 数据库体系结构
外模式对应视图、模式对应基本表、内模式对应存储文件
特点
- 一体化
- 两种使用方式,统一的语法结构
- 高度非过程化
- 语言简洁
组成
- 数据定义
- 数据操控
- 数据控制
- 嵌入式 SQL
SQL 数据定义
模式(命名空间)和数据库的创建和撤销
1 | CREATE SCHEMA <NAME> AUTHORIZATION <USER> |
基本表的创建、修改和撤销
1 | CREATE TABLE schema.name ( |
- 主键子句 PRIMARY KEY()
- 外键子句 FOREIGN KEY()
- 检查子句 CHECK
SQL 的 CRUD
SELECT A FROM R WHERE F
1 | SELECT [DISTINCT] A |
执行过程
- FROM 读取基本表,执行笛卡尔积运算
- WHERE
- GROUP HAVING
- SELECT
- ORDER
使用 EXIST 和 NOT EXIST 谓词表示全称量词和逻辑蕴含⭐
全称量词
转化为不存在课程没有选修的学生
逻辑蕴含
与上面相类似
数据更新操作
1 | # insert |
视图操作
对于视图的更新 INSERT, DELETE, UPDATE
- 多个表联接导出的话,不允许更新
- 使用了分组和聚合导出,不允许更新
- 从单个基本表导出,使用选择、投影导出,并且包含主键或某一个候选键,那么称为行列子集视图,并且可以被执行更新操作。
1 | CREATE VIEW name (列表名) |
嵌入式 SQL
- 在终端交互方式,称为交互式 SQL
- 嵌入高级语言的程序中使用,称为嵌入式。高级语言称为宿主语言
高级语言和 SQL 的区别
SQL 是基于关系数据模型的语言;高级语言是关于基本数据类型的语言。
如何实现嵌入式 SQL
- 扩充宿主语言的编译程序,能够直接处理 SQL 语句
- 采用预处理的方式(多数系统采用)
预处理的实现
- 源程序扫描之后,识别出 SQL 语句。并处理成宿主语言的函数调用形式。
- 然后编译
通常是 DBMS 的制造商提供一个 SQL 函数定义库,供编译的时候使用。
嵌入式 SQL 需要解决的问题
需要区分 SQL 语言和宿主语言
数据库工作单元和主程序工作单元之间的通信
SQLSTATUS 是一个特殊的共享变量,用于解释 SQL 语句的执行情况。0 表示成功。
引入游标机制,将集合操作转换为单元组处理。用于协调不同数据处理方式
- SQL 面向集合,一条 SQL 可以产生或处理多条记录
- 宿主语言面向记录
与游标相关的语句
- 定义游标
EXEC SQL DECLEAR <NAME> CURSOR FOR <SELECT> END_EXEC
- 使用 OPEM 打开游标
EXEC SQL OPEN <NAME> END_EXEC
- 推进游标
EXEC SQL FETCH FROM <游标名> INTO <变量表> END_EXEC
- 关闭游标
EXEC SQL CLOSE <NAME> END_EXEC
- Post title:数据库原理一
- Post author:auggie
- Create time:2022-04-25 17:13:08
- Post link:https://ruanjiancheng.github.io/2022/04/25/database1/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.