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

2024-09-07 14:44

本文主要是介绍一、关系模型和关系代数,《数据库系统概念》,原书第7版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • @[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这样的声明式语言。

三、小结

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

这篇关于一、关系模型和关系代数,《数据库系统概念》,原书第7版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145352

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

《Java中的equals和hashCode方法关系与正确重写实践案例》在Java中,equals和hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如HashMa... 目录一、背景与需求分析1.1 equals 和 hashCode 的背景1.2 需求分析1.3 技术挑战1.4

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分