lectrue1 关系模型和代数

数据库(Datebase):一个组织好的数据集合。用于模拟现实世界中的某个方面。

数据库管理系统(DBMS):管理数据库的软件,比如MYSQL,Oracle,以及我们的BusTub。


平面文件方案:在该方案中,数据库被存储为由DBMS管理的逗号分隔值(CSV)文件。每个实体都存储在独立的文件中。每当应用程序想要读取或更新记录时,都必须重新解析这些文件。

注:可以简单理解为txt这样的文本文件,举个例子,文件的第一行可能是"周杰伦", 2000, "Taiwan",第二行可能是"陈奕迅", 1995, "Hong Kong"。

更近一步,平面文件就是一个存储在硬盘上的,原始的,难以伸缩的大型字符数组。数组的缺点------比如查找,插入,删除效率低效,平面文件同样无法避免。

平面文件的局限性:

  • 效率 (Efficiency):为了查找特定记录,需要扫描整个文件并将其加载到内存中。

  • 灵活性 (Flexibility):难以更改模式(Schema),例如增加一个新字段。这通常需要重新编写整个文件。

  • 数据完整性 (Data Integrity):难以强制执行约束,例如要求"年份"必须是数字。此外,专辑文件可能会引用一个根本不存在的艺术家。

  • 持久性 (Durability):如果程序正在更新记录时机器突然崩溃了怎么办?

  • 并发性 (Concurrency):如果两个线程尝试同时更新同一条记录会发生什么?

  • 抽象性 (Abstraction):应用程序与物理存储格式(CSV 文件)紧紧耦合在一起。


数据库管理系统DBMS:DBMS是一款允许应用程序在数据库中存储和分析信息的软件。一个通用型 DBMS 旨在允许用户按照某种数据模型对数据库进行定义、创建、查询、更新和管理。

注:数据模型是一组用于描述数据库中数据的概念集合。模式是基于某种数据模型对特定数据集合的描述。

早期DBMS:早期数据库应用程序难以构建和维护,因为逻辑层和物理层之间存在紧密耦合。逻辑层描述数据库拥有哪些实体及其属性。而物理层描述这些实体和属性实际上是如何被存储的。

在早期,物理层是在应用程序代码中定义的,因此,如果我们想要更改应用程序正在使用的物理层,就必须修改代码以匹配新的物理层。

而现代DBMS中,物理层和逻辑层之间进行了解耦。例如一条语句:

SELECT name FROM artists;

不管底层是用 B+ 树存,还是用哈希表存,或者是存放在哪个 Page 里,我们的SQL语句一行都不用改。

关系模型(Relational Model):关系模型定义了一种基于关系的数据库抽象,其核心要点有三:

  • 将数据库存储在简单的数据结构(关系)中。

  • 通过高级语言(如 SQL)访问数据,由 DBMS 决定最佳的执行策略。

  • 物理存储交由 DBMS 的具体实现来决定。

关系数据模型定义了三个核心概念:

  • 结构 (Structure):关系及其内容的定义。即关系拥有的属性以及这些属性可以持有的值。

  • 完整性 (Integrity):确保数据库内容满足约束条件。例如:年份属性的值必须是数字。

  • 操作 (Manipulation):如何访问和修改数据库的内容。

核心术语:

  • 关系 (Relation):是一个无序集合,包含代表实体的属性之间的关系。由于它是无序的,DBMS 可以按任何方式存储它们以进行优化。

  • 元组 (Tuple):是关系中一组属性值的集合(也称为其域)。在课程中,"元组"和"行 (Row)"通常可以互换使用。

  • n 元关系 (n-ary Relation):拥有 n 个属性的关系。这等同于一个拥有 n 列的表格。

  • NULL:一个特殊的属性值,表示该属性未定义。

键和约束:

  • 主键 (Primary Key):唯一标识关系中的单个元组。如果用户未定义,某些 DBMS 会自动创建内部主键。

  • 外键 (Foreign Key):规定一个关系中的属性必须映射到另一个关系中的某个元组。

  • 约束 (Constraint):用户定义的条件,数据库的任何实例都必须满足这些条件(如:价格不能为负数)。


数据操纵语言(DMLs):数据操纵语言是用于在数据库中存储和检索信息的方法,这类语言主要分为两个大类:

  • 过程化 (Procedural):

    • 查询语句需要指定 DBMS 在处理集合(Sets/Bags)时应使用的(高层)策略。

    • 示例:如果你想统计表中的记录总数,过程化方式会要求你使用一个 for 循环来扫描所有记录,并手动累加计数,以获取记录总数。

  • 非过程化 / 声明式 (Non-Procedural / Declarative):

    • 查询语句只需指定想要什么数据,而不需要说明如何去寻找这些数据。

    • 示例:使用 SQL 语句 SELECT COUNT(*) FROM artist; 来统计表中记录的数量。在这种情况下,你只需要告诉数据库"我要总数",至于数据库是去数索引还是扫描全表,由数据库自己决定。

注:目前为止,我们所接触的C,C++几乎都是过程化的,我们需要写每一行逻辑、每一个循环。但在数据库中,我们需要转变一下。非过程化语言的好处在于它解耦了执行策略,在过程化中,如果数据由数组变成了B+树,那么for循环需要改为递归遍历,而在声明式中,我们的SELECT语句永远不会变。

并且由于我们只说了需要什么,DBMS获得了极大的自由度,它会自己分析:我是用索引快?还是用多线程并行扫描快?


关系代数:关系代数是一组用于检索和操纵关系中元组的基本操作。每个算子接收一个或多个关系作为输入,并输出一个新的关系。为了编写查询,我们可以将这些算子"链接(chain)"在一起,以创建更复杂的操作。

核心算子:
  • 选择 (Select):

    • 接收一个关系,并输出该关系中满足选择谓词(过滤条件)的元组子集。

    • 语法:σpredicate(R)。

    • SQL 等价:SELECT * FROM R WHERE ...

  • 投影 (Projection):

    • 接收一个关系,并输出一个仅包含指定属性(列)的关系。你可以重新排列属性的顺序,甚至可以对值进行计算。

    • 语法:πA1,A2,. . . ,An(R)。

    • SQL 等价:SELECT col1, col2 FROM R

  • 并集 (Union):

    • 接收两个关系,并将它们合并且去掉重复的行。注意:两个关系的属性必须完全一致。

    • 语法:(R ∪ S)。

  • 交集 (Intersection):

    • 输出同时出现在两个输入关系中的元组。属性必须一致。

    • 语法:(R ∩ S)。

  • 差集 (Difference):

    • 输出出现在第一个关系中但不在第二个关系中的元组。属性必须一致。

    • 语法:(R - S)。

  • 笛卡尔积 (Product):

    • 输出两个关系中所有元组的全部可能组合。

    • 语法:(R × S)。

  • 连接 (Join):

    • 输出两个关系的元组组合,要求两个关系中共享的属性值必须相等。

    • 语法:(R ▷◁ S)。

关系代数是一种过程化的语言,因为它定义了计算查询的高级步骤。举个例子,σb id=102(R ▷◁ S)和(R ▷◁ (σb id=102(S)))相比,前者先对R和S做连接,然后在庞大的结果集中筛选,后者先对S筛选,然后再进行连接。

这两条语句的结果完全相同,但如果 S 有 10 亿行而满足条件的只有 1 行,第二种方式会显著快于第一种。

更好的方法是只描述你想要的结果(声明式,如 SQL),让 DBMS 的查询优化器来决定最有效的执行步骤。SQL 正是为此而生,并已成为关系型数据库的标准语言。

这里着重提及一下SELECT,


其他数据模型:

  • 文档模型 (Document Model):

    • 由记录文档组成的集合,这些文档包含层次化的"名称-字段/值"对(即键值对)。

    • 通俗理解:数据就像是一个嵌套的文件夹或者 JSON 文件。它不强求像表格那样整齐划一,每个文档都可以有不同的字段。

    • 典型代表:MongoDB。

  • 向量模型 (Vector Model):

    • 使用一维数组进行(精确或近似的)最近邻搜索。

    • 通俗理解:将数据(如图片、文字、音频)转化为一串数字(向量)。通过计算这些数字序列之间的"距离",数据库可以帮你找到最相似的内容。

    • 典型代表:Pinecone, Milvus。这在当前的 大模型(LLM/RAG) 检索中是核心技术。

相关推荐
GLDbalala2 小时前
GPU PRO 4 - 5.1 An Aspect-Based Engine Architecture 笔记
笔记
小裕哥略帅2 小时前
PMP学习笔记--过程
笔记·学习
ocean'2 小时前
渗透笔记总结
笔记
ljt27249606612 小时前
Flutter笔记--Isolate
笔记·flutter
weixin_440730502 小时前
02测试基础知识笔记
笔记
就叫飞六吧2 小时前
Jenkins 流水线全流程实战笔记
笔记·servlet·jenkins
别了,李亚普诺夫2 小时前
运算放大器的参数、选型与应用-学习笔记
笔记·学习
中屹指纹浏览器3 小时前
指纹浏览器网络隔离与泄漏防护技术全解析——从架构设计到落地实践摘要
经验分享·笔记
生擒小朵拉3 小时前
ROS1学习笔记(一)
笔记·学习