Lecture#01 关系模型与关系代数
课程大纲
- 关系数据库概念
- 数据库的存储
- 数据库的查询
- 数据库的并发控制,事务管理,遇到冲突或需要重启系统时如何恢复数据库
- 更高级的内容——分布式数据库,其他类型的数据库,关系型数据库的扩展
项目
如何构建一个用于评测的面向磁盘的数据库系统
面向磁盘:假设数据库在磁盘上,然后将数据写到磁盘上
Lecture#01 关系模型与关系代数
1 数据库
-
数据库 DB
:一个有组织的相互关联的数据的集合,它对现实世界的某些方面进行建模。 -
数据库存储为由DBMS管理的CSV文件,其中的每个实体都存储在它自己的文件中,应用程序必须在每次读取或更新记录时解析这些文件。每个实体都有自己的一组属性,故在每个文件中,不同记录由新行分隔,记录中的每个相应属性由逗号分隔。
🌰 数字音乐商店中有两个文件:一个用于存储作者,一个用于存储专辑。作者的属性有姓名、年份、国家,专辑的属性有名称、作者、发行年份。
在应用程序中编写解析文件的代码会出现以下问题,因此我们需要使用数据库管理系统对数据进行管理:
-
数据完整性
- 我们怎么保证每个专辑中作者都存储在相同位置
- 如果有人把专辑中的年份改成一个字符串了怎么办,软件读取时就会报错
- 如果一个专辑有多个作者该如何存储
-
实现
- 如何找到某条特定的记录(如果我们文件中有亿万以上的记录,通过遍历查询不现实)
- 假设我们的程序使用python开发查询数据库,但我想使用另一种语言创建一个使用此数据库的新程序,则需重复写新代码解析文件逻辑(重复造轮子)
- 如果同时有两个线程试图写入同一个文件怎么办
-
数据安全
- 若打开文件更新记录时,在结束更新前,机器或程序出现故障怎么办
- 我对当前运行数据库的机器不能完全信任(因为可能发生宕机等生产事故),因此我怎样将数据库文件复制到两台不同机器上
2 DBMS
-
数据库管理系统 DBMS
:管理数据库的专业软件。由一个相互关联的数据的集合和一组用以定义、创建、查询、更新及管理这些数据的程序组成。- 允许程序在无须关心底层实现的情况下,对数据库中的信息进行存储和分析。
- 是一种能被多种应用所复用的软件,故无需重复造轮子。
-
早期的DBMS:
数据库应用程序很难构建和维护,因为逻辑层和物理层之间存在紧密耦合。逻辑层是数据库拥有哪些实体和属性,而物理层是存储这些实体和属性的方式(数据结构)。在早期,物理层是在应用程序代码中定义的,所以如果我们想更改应用程序使用的物理层,我们必须更改所有代码以匹配新的物理层。(人们会一次次地因为一个改变而对代码进行重构)
3 关系模型
Ted Codd 注意到人们每次想要更改物理层时都要重写DBMS,所以在1970年,他提出了关系模型来避免这种情况。这个关系模型有三个关键点:
- 将所有的表存储在数据库中以建立关系。(以关系存储数据库)
- 通过高级语言访问数据。(只说想要某些数据,没有说明要如何获取)
- 逻辑层与物理层分开。
对于第二点:就像汇编语言和高级语言一样,高级语言只说明想要达到的效果,通过编译器编译成机器码实现具体操作;同样的,我们在关系模型中只说明需要什么数据,优化器会生成具体的查询方案
数据模型(model)
:描述数据库中数据的概念集合(如何组织数据)。关系模型是数据模型的一个例子。
- Relational:大多数DBMS为关系型数据库
- Key/Value、Graph、Document、Column-family:NoSQL数据库(列簇数据库如RocksDB)
- Array/Matrix:Machine Learning会使用
- Hierarchical:层次模型(不用了)
- Network:网状模型(不用了)
模式(schema)
:使用给定数据模型时,对特定数据集合的描述。
关系数据模型包含三要素
:
- 关系结构:关系的定义及其内容。这是关系具有的属性和这些属性可以包含的值。
- 数据完整性约束:确保数据库内容满足约束条件。
- 操作:如何访问和修改数据库的内容。
4 数据操纵语言 DML
DML:表达数据库的查询和更新,使用户可访问/操纵那些按某种适当的数据模型组织起来的数据。
-
有以下访问类型
- 检索数据库信息
- 插入、删除、修改信息
-
有两种基本的数据操纵语言
-
过程化 DML
(如 Relational Algebra):要求用户指定需要什么数据及如何获取这些数据 -
声明化 DML
(非过程化 DML,如 Relational Calculus):只需用户指定需什么数据,无需指明如何获得 -
查询:对信息进行检索的语句。DML中涉及信息检索的部分称为
查询语言
(实践中常把“查询语言”和“数据操纵语言”作为同义词,但这在技术上并不正确)
-
DDL 是对数据结构进行修改的语言,如加索引、建表等。
4 关系代数
Relational Algebra:定义了一些基本方法来从关系中获取或操作元组。
每种操作输入的是一个或多个关系,输出的是一个新的关系。

自然连接:select * from r1 natural join r2;
笛卡尔积:select * from r1 cross join r2; 或 select * from r1,r2;
差和交运算能通过上述五种运算得到。
总结
数据库:相关联数据的集合。存储在 CSV 文件中,不同记录用新行分隔,记录的不同属性用逗号分隔。
- 缺点:应用程序中编写代码解析文件会出现问题:数据完整性、遍历查记录慢、不同语言的应用程序解析文件需重复造轮子、多线程并发、数据安全问题。—— DBMS 产生
DBMS:相关联数据集合 + 操作程序。
- 优点:可被多种应用程序复用,无需重复造轮子(程序无需关心底层实现,就能对数据进行存储和分析)
- 缺点:早期 DBMS 的逻辑层(数据库的实体和属性)和物理(存储这些实体和属性的数据结构)层紧密耦合。人们每次想要更改物理层时都要重写代码来获取逻辑层所需数据。 —— Ted Codd 提出关系模型
关系模型:以关系存储数据库;通过高级语言访问数据;逻辑层和物理层解耦。
- 关系模型三要素:数据结构、数据完整性约束、操作
数据模型 (model) 🆚 模式 (schema) :数据模型描述数据库如何组织数据 (Relational、Key/Value、Graph、Document、Column-family 等NoSQL、层次结构、网状结构);模式指在给定的数据模型下,对特定数据集合的描述。
数据库操纵语言 DML:过程化 DML —— 关系代数;声明化 DML —— SQL。
PS: 关系代数基于集合 (无序,无重复)。SQL基于包 (无序,允许重复)。
使用底层写法,会导致数据库物理层与逻辑层紧密耦合,则一旦物理层做出更改,就需重写代码来获取逻辑层所需数据。通过关系代数也需考虑查询优化问题(先选择后连接...)。如果通过SQL我们就只需考虑需要的数据,而不用说明如何获取它,随着时间推移,数据库可能产生改变,它能不断适应并改进。

有价值的链接
别人的CMU 学习笔记 根据DBMS发展的脉络叙述,写的特别好。
本文作者:Joey-Wang
本文链接:https://www.cnblogs.com/joey-wang/p/16915999.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步