一、关系模型和关系代数,《数据库系统概念》,原书第7版

news2025/2/23 18:14:53

文章目录

    • @[toc]
    • 一、引言
      • 1.1 什么是数据库
      • 1.2 数据完整性
      • 1.3 数据库的操作
      • 1.4 数据库的持久性
      • 1.5 数据库管理系统
      • 1.6 数据模型
      • 1.7 早期DBMS
    • 二、关系模型
      • 2.1 什么是关系模型
      • 2.2 关系数据库的结构
      • 2.3 键
      • 2.4 约束
      • 2.5 数据操纵语言(DML)
      • 2.6 关系代数
        • 2.6.1 选择运算
        • 2.6.2 投影运算
        • 2.6.3 合并运算
        • 2.6.4 交运算
        • 2.6.5 差运算
        • 2.6.6 笛卡尔积运算
        • 2.6.7 连接运算
        • 2.6.8 额外的运算
      • 2.7 思考
    • 三、小结

一、引言

1.1 什么是数据库

**数据库(Database)**是一个描述现实世界某些事物的互相关联的数据集合,数据库是大多数计算机应用程序的核心部分。

比如我们要创建一个类似于 music store 的数据库来记录音乐家和它们的专辑

我们需要记录两个基础信息:

  • 音乐家的信息
  • 音乐家发布的专辑

我们的数据库以 CSV(comma-seperated value,逗号分隔值) 文件的形式来存储

  • 每一个实体都有一个csv文件
  • 应用程序每次想要查询/更新记录时,都必须解析文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们对上述解析逻辑给出Python3代码

for line in file.readlines():
    record = parse(line)
    if record[0] == 'GZA':
		print(int(record[1]))

上述逻辑有很多问题:

首先,显然这是一个效率很低的方式,不过对于增添操作,我们只需在末尾添加,效率其也还行。

其次,数据库的模式、关系是隐式表示的,上面直接 record[0] == ‘GZA’ 类似的逻辑是很差的

延续上面的例子,我们有几个方面的问题

1.2 数据完整性

  1. 上面展示的是音乐家和专辑1对1的关系,但是许多专辑可能是同一位音乐家,我们如何确保一对多的关系呢?
  2. 如果有人用非法字符串重写了的专辑年份呢?
  3. 如果一个专辑有多位音乐家呢?
  4. 如果我们删除了某位有专辑的音乐家,会发生什么?

上面的问题都是关于数据完整性的问题?

1.3 数据库的操作

  1. 如何找到某个特定的记录?
  2. 我们如何创建一个新的拥有相同数据库应用程序 以及 应用程序在不同的设备上运行会怎样?
  3. 如果两个线程同时尝试写同一文件又会怎样?

1.4 数据库的持久性

  1. 如果我们更新记录时机器崩溃了该如何处理?
  2. 如何将数据库扩展到多个机器来应对高频访问?

1.5 数据库管理系统

**数据库管理系统(Database Management System,DBMS)**由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。DBMS主要目标是提供一种可以方便、高效地存取数据库信息的途径。

一个通用的 DBMS 支持定义或明确内在实现方式,包括 创建、查询、更新、如何管理数据库等操作。

1.6 数据模型

**数据模型(Data model)**是一个描述数据、数据联系、数据语义以及一致性约束的概念工具的集合。

  • Relational

大多数DBMS采用

  • Key / Value
  • Graph
  • Document/XML / Object
  • Wide-Column / Column-family

一般为NoSQL(非关系型数据库)采用。

  • Array/Matrix/Vectors

机器学习采用较多

  • Hierarchical
  • Network
  • Multi-Value

目前已过时

1.7 早期DBMS

1960s,早期数据库应用程序很难在DMBS上构建和维护。

这时期的DBMS有:IDS, IMS, CODASYL

这一时期的DBMS存在问题:每当需要在逻辑层和物理层对模式进行修改时,都几乎得重写应用程序,因为程序员不知道清除数据库后数据在磁盘上的表示方式发生了怎样的变化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1960s,IBM的数学家Ted Codd 看到了IBM的工程师每次修改数据库的模式和布局都要重写数据库后,于1969年设计了关系模型(relational model),这也是本节的主题。

二、关系模型

2.1 什么是关系模型

**关系模型(relational model)**基于关系来定义数据库抽象,从而避免过多的维护。

核心逻辑:

  • 用简单的数据结构存储数据集合
  • 保留数据本身的物理表示,如磁盘或者内存中的实际位和字节
  • 通过高级语言查询数据,但具体的底层查询方式由DBMS来决定

关系模型的三大关键包括:

  • 结构(structure):即如何定义数据库的实际构成,关系中包含哪些内容,它们的属性以及类型
  • 完整性(integrity):确保数据库中的数据是合法的
  • 操作(Manipulation):如何去访问和修改数据

2.2 关系数据库的结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关系数据库由**表(table)**的集合组成,每张表被赋予唯一一个名称。

如上面的Artist表,一共有三个列标题,表中每一行记录了一位Artist的相关信息。

关系模型中,**关系(relation)**用来指代表。**元组(tuple)**用来指代行。**属性(attribute)**用来指代列。

**关系实例(table instance)**这个术语来指代一个关系的特定实例,如上表,就是一个Artist的实例。

  • 每个关系的每个属性都有一个允许取值的集合,该集合称为该属性的域(domain)
  • 如果一个域中的元素被认为是不可再分的单元,则该域是原子的(atomic)。如一个人可能有多个电话号码,那么我们建立一个以电话号码为属性的表,那么电话号码的表就不是原子的,因为一个元素是电话号码的集合。
  • **空值(null value)**是一个特殊的值,表示未知或者并不存在。如果允许的话,我们认为控制是每一个域的成员。

2.3 键

**主键(primary key)**在一个关系中用来区分不同元组。

  • 如果表没有定义主键,一些DBMS自动创建内部的主键

DBMS 能够通过一列自动生成一个主键。

  • IDENTITY(SQL Standard)
  • SEQUENCE(PostgreSQL/Oracle)
  • AUTO_INCREMENT(MySQL)

外码(foreign key) 特指一种映射到另一个关系的一个元组的属性,

即,一个关系中的一个属性,是另一个表的主键。

如下图,我们有一个ArtistAlbum表,一个Artist表,一个Album表

在ArtistAlbum中,artist_id 和 album_id 分别是Artist 和 Album 的主键

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.4 约束

用户定义的条件必须对每一个数据库示例都成立。

  • 对特定属性或者全局范围内都有效
  • DBMS 会组织违反任意约束的修改操作

SQL中可以进行全局断言,不过很少使用,因为效率太低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.5 数据操纵语言(DML)

数据操纵语言(DML) 是 从数据库存储获取信息的方式。

一般分为过程化(Procedural)非过程化(Non-Procedural)

过程化语言 基于集合,关注找到结果的策略。——关系代数

而过程化语言 只关注 什么数据是想要的,并不关注如何找到它。——关系演算

2.6 关系代数

**关系代数(relation algebra)**是在关系中获取和操作元组的基础操作。

  • 基于集合代数

关系代数有很多的运算,每一个运算以一个或者多个关系来作为其输入,并输出一个新的关系。

  • 我们可以通过复合多个运算来实现更为复杂的运算

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6.1 选择运算

**选择(select)**运算从一些元组中选出一个满足给定谓词的元组的集合,它是一个一元运算。

我们使用小写希腊字母 σ 来代表选择。

语法: σ p r e d i c a t e ( R ) \sigma_{predicate}(R) σpredicate(R)

下面是 选择运算的示例,以及SQL语言表示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6.2 投影运算

**投影(project)**运算也是一个一元运算,可以生成一个只包含特定属性的元组的关系。

  • 可以重新排列属性的顺序
  • 可以移除我们不想要的属性
  • 操作属性的值来生成新的派生属性(比如下面将b_id的值减去100)

语法: ∏ A 1 , A 2 , . . . , A n ( R ) \prod_{A1,A2,...,An}(R) A1,A2,...,An(R)

下面是示例以及SQL语言表示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6.3 合并运算

合并(Union)运算生成一个包含在任意输入关系中的元组的关系。

语法: R ∪ S R \cup S RS

下面是示例以及SQL语句表示

值得注意的是,在SQL中UNION会自动去重,如果保留重复项以提高效率,应该使用UNION ALL

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6.4 交运算

交(intersect)运算生成只在两个输入中都出现的元组的关系。

语法: R ∩ S R \cap S RS

下面是示例以及SQL语句表示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6.5 差运算

差(differentiate)运算生成一个只在第一个输入中出现并非在第二个输入中出现的元组的关系。

语法:(R - S)

下面是示例以及SQL语句表示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6.6 笛卡尔积运算

笛卡尔积(product)运算会生成第一个输入和第二个输入的元组间的所有二元组合的关系。

Syntax:(R × S)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6.7 连接运算

连接(join)运算生成两个输入所有有一个或者多个公共值的元组的组合。

语法: R ⋈ S R \Join S RS

下面是示例以及一些SQL语句的表示

我们可以在SQL语句中 指定 公共值(一个或多个)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6.8 额外的运算

Ted Codd在设计关系模型时并未考虑到实际应用中的不足,所以人们又完善了一些额外操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

赋值(assignment)运算 ← \leftarrow 来表示,很多时候我们需要将关系代数表达式中的一部分赋值给临时的关系变量。

比如我们有课程表,我们想要获取在2017年秋季和2018年春季都开设的课程ID

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**更名(rename)**运算,用小写希腊字母 ρ 来表示。

语法: ρ x ( A 1 , A 2 , . . . , A n ) ( E ) \rho_{x(A1,A2,...,An)(E)} ρx(A1,A2,...,An)(E),表示返回以x 命名的表达式E的结果,并且将其属性重命名为A1,A2,…,An

很多时候我们需要多次使用相同的关系,那么我们就可以通过更名操作来指代某些关系。

**除法(division)**运算定义如下:

r® 和 s(S) 代表关系,并且 S ⊆ R S \subseteq R SR,即,模式S的每个属性也在模式R内。

给定元组 t,令t[S] 代表元组t 在 S中属性上的投影。

那么r ÷ s 是 R - S模式上的一个关系,元组t 在 r ÷ s 中的充分必要条件是:

  • t 在 ∏ R − S ( r ) \prod _{R - S}(r) RS(r)
  • 对于s 中的每个元组 t s t_s ts,在r 中存在一个元组 t r t_r tr 同时满足如下条件:
    • t r [ S ] = t s [ S ] t_r[S] = t_s[S] tr[S]=ts[S]
    • t r [ R − S ] = t t_r[R - S] = t tr[RS]=t

语言过于抽象,下面是示例:

2.7 思考

关系代数定义了高层级语言对于如何计算查询的命令:

  • 比如: σ b i d = 102 ( R ⋈ S ) \sigma_{b_id=102}(R\Join S) σbid=102(RS) vs R ⋈ ( σ b i d = 102 ( S ) ) R \Join (\sigma_{b_id=102}(S)) R(σbid=102(S))
  • 二者的计算量不同,效率自然也不同

一个更好的方式是声明你希望DBMS去计算的答案。

  • Example:Retrieve the joined tuples from R and S where b_id equals 102

这也是为什么我们希望有SQL这样的声明式语言。

三、小结

  • 数据库无处不在
  • 关系代数是关系型数据库中处理查询的基本原语
  • 关系代数将成为交互的核心基础,这也决定了我们如何构建系统组件以及执行查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【南方科技大学】CS315 Computer Security 【Lab1 Packet Sniffing and Wireshark】

目录 IntroductionBackgroundTCP/IP Network StackApplication LayerTransport LayerInternet LayerLink LayerPacket Sniffer Getting WiresharkStarting WiresharkCapturing PacketsTest Run Questions for the Lab Introduction 实验的第一部分介绍数据包嗅探器 Wireshark。…

2024高教社杯全国大学生数学建模竞赛B题原创python代码

以下均为python代码。先给大家看看之前文章的部分思路: 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 1 总体分析 题目提供了一个电子产品生产的案例,要求参赛者建立数学模型解决企业在生产过程中的一系列决策问题。以下是对题目的总体…

Cortex-A7:简单中断处理(不可嵌套中断)机制

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断,开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套中断的,这从Cortex-A…

隐私计算实训营:联邦学习在垂直场景的开发实践

纵向联邦学习 纵向联邦学习的参与方拥有相同样本空间、不同特征空间的数据,通过共有样本数据进行安全联合建模,在金融、广告等领域拥有广泛的应用场景。和横向联邦学习相比,纵向联邦学习的参与方之间需要协同完成数据求交集、模型联合训练和…

[Android] [SnapdragonCamera] 单摄(横屏)阶段总结

在研高通平台的单摄项目中遇到了很多适配问题,做一下初步的总结,为今后遇到相似的问题,提供参考方案。 1. 横屏设置相机预览显示不正常 1.1问题现象 1.2分析与解决 骁龙相机默认的预览方向是“portrait”。在横屏设备上显…

人车防撞系统安全生产方案

根据《市场监管总局关于2021~2023年全国特种设备安全状况的通告》数据显示:2023年:全国共发生特种设备事故和相关事故71起,其中死亡69人。包含叉车在内的场(厂)内专用机动车辆事故29起、死亡28人,占事故总数的40.85%、死亡人数的4…

DBeaver 常用操作

文章目录 快捷键SQL模板xml文件删除表数据执行脚本文件导入脚本表数据的标题栏中显示中文注释 (推荐)数据库导航显示表名 (推荐)执行多行sql语句ER图说明以及避坑 快捷键 执行sql语句:ctrlenter sql模板(可以自定义设置):sf、swhere、scount 格式化&…

【吊打面试官系列-Redis面试题】Jedis 与 Redisson 对比有什么优缺点?

大家好,我是锋哥。今天分享关于 【Jedis 与 Redisson 对比有什么优缺点?】面试题,希望对大家有帮助; Jedis 与 Redisson 对比有什么优缺点? Jedis 是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 …

【CanMV K230】圆形检测

【CanMV K230】圆形检测 什么是圆形检测圆形检测应用领域1.工业自动化2.机器人视觉3.医学图像分析4.目标识别5.质量检测6.研究和开发 K230应用相关函数官方例程HDMI屏幕使用圆形检测 本篇内容: 什么是圆形检测圆形检测应用领域K230应用(包含相应函数及例…

线性代数|机器学习-P34神经网络和学习函数

文章目录 1. 神经网络2. 损失函数3. 距离矩阵 1. 神经网络 构建一个神经网络步骤如下: 构建一个神经网络 构造一个学习函数 F ( x , v ) F(x,v) F(x,v),x代表权重 A k , b k A_k,b_k Ak​,bk​,v代表样本特征向量,ReLu激活函数 v 1 R e L u [ F ( A …

Leetcode 剑指 Offer II 094.分割回文串 II

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个字符串 s,请将 s 分割成一些子串&#xff0c…

Clean Minimalist GUI Pack (简约风格UI界面)

Unity 最简洁易用的 GUI 资源包。如果你在寻找资源商店上 UI 极简主义革命的发起者,你已经找到了。 这一极干净简约的 GUI 资源包是一款适合移动设备使用的游戏 UI 资源包,其中包含许多图标和元素,可用于创建具有简洁风格的完整游戏 UI。 功能: • 包括 3 种皮肤:深色、浅…

C++编程语言:基础设施:表达式(Bjarne Stroustrup)

第10章 表达式(Expressions) 目录 10.1 引言 10.2 一个桌面计算器程序 10.2.1 解析器(Parser) 10.2.2 输入(Input) 10.2.3 底层输入(Low-Level Input) 10.2.4 错误处理(Error-Handling) 10.2.5 驱动器(Driver) 10.2.6 头文件(Headers) 10.2.7 命令行参数 …

全网最火的AI技术:Rag详解

“Rag”是机器学习中的术语,通常指的是“Ragged Tensors”(不规则张量)。Ragged Tensors 是一种特殊类型的张量,允许不同的维度中的子张量有不同的长度或形状。这在处理诸如文本、序列数据等不定长的数据时特别有用。例如&#xf…

WebShell流量特征检测_哥斯拉篇

90后用菜刀,95后用蚁剑,00后用冰蝎和哥斯拉,以phpshell连接为例,本文主要是对后三款经典的webshell管理工具进行流量分析和检测。 什么是一句话木马? 1、定义 顾名思义就是执行恶意指令的木马,通过技术手…

Pytorch环境搭建时的各种问题

1 问题 1.一直soving environment,跳不出去。网络解决方案有:配置清华源,更新conda等,没起作用。2.下载完后,有3个要done的东西,最后那个exe开头的(可能吧),总是报错。网…

C++常见异常汇总(一)

文章目录 1、error: ‘__s_getMD5Sum’ is not a member2、Field has incomplete type2.1 处理方案1:使用前置声明2.1 处理方案2:使用静态变量 3、无法访问基类的public函数 1、error: ‘__s_getMD5Sum’ is not a member 错误现象: error: …

统计学习方法与实战——统计学习方法之感知机

感知机 感知机三要素分析模型策略损失函数选择 算法原始形式对偶形式 相关问题 例子iris数据集分类实战数据集查看 显示结果sklearn 实战感知机 习题解答习题2.1解题步骤反证法 习题2.2习题2.3凸壳线性可分线性可分证明凸壳不相交证明充分性:凸壳不相交\Rightarrow⇒…

轻瑜伽 1.0.2 简约实用的瑜伽练习,随时随地放松身心,完全免费

轻瑜伽是一款完全免费的瑜伽练习软件,支持安卓。界面设计简洁明了,用户可以随时随地进行瑜伽练习。提供平衡性、灵活性、晨练等多种瑜伽课程,每种课程都有详细的动作指导,适合不同水平的用户。支持离线使用,随时随地享…

关于大模型和AIGC的36条笔记和真话

行业到底有多卷? 最新统计,中国已有130多个大模型问世,在网信办备案的算法模型也超过70多家。BAT等互联网巨头悉数下场发布AI大模型,仅2023年就有超60家创业公司拿到融资,产品更是布满了基础层、模型层和应用层。新一…