本专栏是对CMU15445的笔记的翻译,原文地址: https:// 15445.courses.cs.cmu.edu /fall2020/notes/01-introduction.pdf
1 数据库
数据库是对现实世界的某些方面建模的相互关联的数据有组织的集合(例如对学生属于班这个关系建模,对数字音乐商城建模)。人们经常混淆数据库(database)和数据库管理系统(database management system)(例如MySQL,Oracle,MongoDB),数据库管理系统是一个管理数据库的软件。
设想一个为数字音乐商城(例如Spotify)建模的数据库,数据库保存艺术家和每个艺术家有哪些专辑的信息。
2 平面文件
DBMS将数据库存在逗号分隔文件(CSV)中,每个实体都被存在于自己的文件中。当应用程序想要去读取或更新记录的时候,它每次都必须去解析文件。每个实体有自己的属性,在每个文件中,不同的记录将被分布在不同的行中,每个记录的每个属性都由逗号分隔。
回到之前数字音乐商店的例子中,它有2个文件:一个是艺术家,一个是专辑。一个艺术家可能有名字、出生时间和国家等属性,专辑可能有名字、艺术家、发布时间等属性。
Issues with Flat File(平面文件的问题):
- Data Integrity(数据完整性)
- 我们如何确保每个专辑的艺术家是相同的?
- 如果有人在专辑发布时间写了一个非法字符该怎么办?
- 我们如何在一个专辑中存多个艺术家?
- Implementation(实现)
- 我们如何找到一个特定的记录?
- 如果我们想要创建一个新的应用使用相同的数据库?
- 如果2个线程尝试在相同的时间去写一个相同的文件?
- Durability(持久性)
- 如果当你的程序正在更新数据的时候机器坏了该怎么办?
- 如果你为了高可用想对数据库进行分片并部署到不同的机器上该怎么办?
3 数据库管理系统(DBMS)
数据库管理系统(DBMS)是一个软件,它允许应用程序在数据库中存储和分析信息。
通用的DBMS被设计成允许定义,创建,更新和管理数据库。
早期的DBMS
数据库应用程序通常很难构建和维护,因为逻辑层和物理层之间存在紧密的耦合。逻辑层是数据库拥有哪些实体和属性,而物理层是如何存储这些实体和属性。早期,物理层被定义在应用程序的代码中,如果我们想要修改物理层,我们必须修改代码来匹配新的物理层。
4 关系模型
Ted Codd意识到每次更改物理层的时候都要重写DBMS。因此在1970年他提出了关系模型来避免这种情况。其中关系模型有3个关键点:
- 用简单的数据结构存储数据(关系)。
- 通过高层语言访问数据。
- 物理存储留待实现。
数据模型是描述数据在数据库中的一系列的概念。关系模型是数据模型中的一个例子。
模式是使用给定数据模型对特定数据集合的描述。
关系数据模型定义了3个概念:
- Structure(结构):关系的定义及其内容,这是关系拥有的属性以及这些属性可以包含的值。
- Integrity(完整):确保数据满足约束条件,一个例子是年份必须为数字。
- Manipulation(操纵):如何访问和修改数据。
关系一个是无序集合,它代表了实体属性的联系。因为关系是无序的,所以DBMS可以以任何方式存储,并允许优化。
元组是关系中属性值的集合。最初,值必须是原子或标量,但是现在的值可以是列表甚至是嵌套的数据结构(比如json)。每个属性都可以是NULL,它代表这个属性值是未定义的。
一个有n个属性的关系称之为n维关系
Keys(键)
一个关系的主键唯一定义一个元组。如果你没有定义主键,一些DBMS会自动创建一个内部主键。同时大多数DBMS支持自动生成key,所以应用程序无需管理递增主键。
外键代表一个关系的一个属性映射到另一个关系的一个属性。
5 数据操纵语言(DML)
数据操纵语言(DML)是一种数据库存储数据和检索数据的语言。它分为2种类型:
- Procedural(程序性的):该查询指定了DBMS查找的策略。
- Non-Procedural(非程序性的):该查询仅仅指定了需要什么数据而不是如何获取它。
6 关系代数
关系代数是一个在关系中检索和操纵元组基础操作的集合。每个操作以一个或多个关系作为输入,并输出一个新的关系。我们可以组合使用这些关系代数来创建更复杂的查询。
Select(选择)
Select输入1个关系,并输出满足特定选择谓词的所有元组。谓词就像一个过滤器,我们可以使用连接词和逻辑词组合多个谓词。
语法:
Projection(投影)
Projection输入1个关系,并输出仅包含特定属性的所有元组,你可以在输入关系中重新排列属性的顺序,也可以操纵这些值。
语法:
Union(并集)
Union输入2个关系并输出1个关系,该关系包含至少出现在1个关系中的所有元组。注意:2个输入关系必须拥有相同的属性值。
语法:
Intersection(交集)
Intersection输入2个关系并输出1个关系,该关系包含同时出现在2个关系中的所有元组。注意:2个输入关系必须拥有相同的属性值。
语法:
Difference(差集)
Difference输入2个关系并输出1个关系,该关系包含出现在第1个关系中但不出现在第2个关系中的所有元组。注意:2个输入关系必须拥有相同的属性值。
语法:
Product(乘积)
Product输入2个关系并输出1个关系,该关系包含输入元组的所有可能组合。
语法:
Join(连接)
Join输入2个关系并输出1个包含所有元组的关系,该元组是2个元组的组合,其中对于共享的每个属性,2个元组的属性值必须相同。
语法:
Observation(总结)
关系代数是一种过程语言,他定义了如何查询的高层表示。例如
一个比较好的方式是直接描述你想要的结果,然后DBMS会决定如何进行计算。SQL完全可以做到这点,因为它是在关系模型数据库上编写查询的一种标准。