关系数据库和关系模型(1)

news/2024/12/21 21:44:09/

昨天补充了DBMS概况的存储管理层面,今天来详细介绍数据库管理系统中常见且应用广泛的关系型数据库(简称关系数据库),比如postgreSQL、MySQL、Oracle Database。

关系模型

关系模型是数据库中如何进行存储和组织数据的理论基础。用C语言类比就是:我们输入一个值之前需要先用一个变量来替代实际的这个值并且同时给这个变量定义一个具体的数据类型;如下:

int a;//定义变量和数据类型
scanf_s(“%d”,&a);//输入a的值

我们在输入一个关系实例之前(比如选课表,有学号、选的课程名和课程号),先是要有一个关系(理解成表)来替代实际的值并且同时给这个关系定义一个关系模式(表存储和组织数据的方式),这就是关系模型的具体应用和解释。

如下图。

16f501c715ba4ebc91baa74af4a45773.png

从上面我们也可以看到表和关系在一定程度上可以理解成是同一个东西。关系数据库实际上是表的集合关系数据库也是由于数学上关系的概念密切相关才因此得名。

但是日常生活中的表和数据库中的表语义上有很多不同:

0526d77539dc4838ad21c092f5957e30.png

比如下图

93daa619d10746f88c201438c7e6afa8.png

Student (Sno,Sname,Sgender,Sage Sdept)是关系模式,关系模式由关系名和属性名集合组成
Student表是关系名
这一整个表是关系
每一行的数据是元组
每一列的数据是属性
每一列的列名是属性名
每一列的列值是属性值
记录和列相交的部分就是分量如上图中的每一个学号
关系实例是元组的集合,会根据业务状态也就是实际情况会发生变化——比如学生表会因为多一个转学来的而多一个元组。

关系模型包含三个部分——关系数据结构、关系操作、关系完整性约束。

关系数据结构

实际上前面已经包含了关系数据结构的部分内容——关系模式的解释(新术语的引入),接下来介绍另外的关系数据结构。每一个关系中有不同的属性,这些属性都有对应的属性值,比如Sage,表示学生的年龄,很明显,学生的年龄是有范围的,也叫作域,即关系中的每一个属性都存在一个合法的取值集合,而且属性下的每一个值都来自于同一个域,比如Sage属性的值应该是整数或者是空值(NULL),而不会是日期等其他数据类型。

超键、候选键、复合键

当某一个属性能明显区分元组之间的区别时(可以唯一地标识不同的元组),这样的属性或者包含这样属性的几个属性(即属性集合)(属性集合同样可以唯一地标识不同的元组)叫做超键,比如Sno属性是超键,(Sno、Sname)属性集合也是一个超键

学号是不可能会出现重复的情况的,这样的也叫作候选键即超键中(当有多个时)没有多余的冗余的属性,如果(Sno、Sname)中Sname属性取值是唯一的(即没有出现同名情况)那么这个(Sno、Sname)超键也是候选键。注意:候选键得先是超键。

候选键中的属性也叫作主属性,之外的叫非主属性。比如Student关系主属性是Sno

有时候单个属性并不能区分元组之间的区别,得有两个或者两个以上的属性,比如想要标识“每个学生这门课程的成绩”就不仅需要学生学号,也需要课程号。这样的属性集合叫复合键。

01fe5cdb76744305a1839a8da46380be.png

主键、外键

一个关系中可能会有多个候选键,比如当学生姓名不出现重复时,那么Sno和Sname都可以是候选键,这时候需要选择一个最合适的候选键即主键,例如Student关系的主键是Sno

上面例子中复合键包括两个属性,这两个属性分别是Student关系和Course关系的主键,此时在SC关系中这两个属性叫做外键。

关系操作

有查询和数据更新操作,数据更新包含数据的删除、插入、修改,查询操作是关系操作中最核心的部分。关系操作用关系运算来表示,关系运算本质上是一种关系查询语言,它和SQL都是关系数据库语言。SQL不给出运算过程,直接描述数据本身的特征即可,和关系运算中的关系演算一样都是属于非过程化语言,关系运算中还存在过程化语言——关系代数,会给出运算过程。

关系运算

faf3a4a4ffec4e00b9f7c6e05d4b909d.png

关系代数

关系代数包含基本、附加和扩展运算。

基本关系代数运算

包含一元的(对单个关系)运算——选择、投影、重命名;二元的(对两个关系)运算——并、差、笛卡尔积。

一元:

选择运算σ

(1)假如你想查询计算机系所有学生的信息,用关系代数是这么表示的

a7e881188cdb44fe96805489f4315140.png

Student是关系名,CS属性值表示计算机系,Sdept表示属性名。

查询结果会是:

cac891c7761d46ae8d70942a763db694.png

(2)再比如你想查询计算机系年龄大于等于18以及所有数学系的学生信息:

ebda33edb02f4df39a732b4e5026b33d.png

MA属性值表示数学系,∧是与运算,∨是非运算,前者是交集后者是并集。

查询结果:

d3ea16cfcec941b186501c471dc7a633.png

投影运算∏

假如你想查询计算机系所有学生的姓名和学号:

6fe25a6ba18a48049eca782bf0360ad4.png

结果:

998eebabb4314e93aec82d07f38b7c55.png

这里要区分一下选择和投影,前者是对元组进行筛选,而后者是对属性。

重命名ρ

8633d6752090401a8f661a2232736256.png  

表示将原来的关系名从SC改成StudentCourse,并且属性栏改成了Snon Cno Score (原来是Snon Cno Grade)

结果

78f70594e07648aea7c01e4cf21b4474.png

注意:

因为没有,所以不修改属性名。

二元:

并运算U

查询所有17岁或18岁学生的信息:

ec7d814e09fd4a229e747be8e45d0bc5.png

可以看到包含选择运算σ,所以是σ先对两个关系做进行查询操作然后再做两个关系的并运算。

结果:

c6113d0fed7c484faa3ae5aeb5e9f39f.png

差运算 -

查询计算机系中未成年同学的信息

6954ed41e10c42c39b854a0551231799.png

8822bef36e0546b484bd5ba14f646e8d.png

结果:

2d54fb43515e4327b1d4658f925cab53.png

笛卡尔积运算 X

bce6a122047845eda07f43b9d2e0e576.png

注:会发现选择、并、差、笛卡尔积都是对元组进行筛选。

明天继续学习其他运算和关系完整性约束。


http://www.ppmy.cn/news/1537109.html

相关文章

MQ 架构设计原理与消息中间件详解(三)

RabbitMQ实战解决方案 RabbitMQ死信队列 死信队列产生的背景 RabbitMQ死信队列俗称,备胎队列;消息中间件因为某种原因拒收该消息后,可以转移到死信队列中存放,死信队列也可以有交换机和路由key等。 产生死信队列的原因 消息投…

ubuntu 18.04虚拟机以太网网段与地平线J6板端连接配置

目录 1、板端IP地址确认 2、本机以太网端ip设置 3、虚拟机设置nat模式 4、虚拟机虚拟网络编辑 5、虚拟机端ip设置 6、虚拟机端验证是否可以ping通板端ip及是否可以联网 1、板端IP地址确认 ip:192.168.98.233 2、本机以太网端ip设置 ip: 3、虚拟…

android 全面屏最底部栏沉浸式

Activity的onCreate方法中添加 this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); Android 系统 Bar 沉浸式完美兼容方案自 Android 5.0 版本,Android 带来了沉浸式系统 ba - 掘金 (juejin.cn)https://juejin.cn/post/7075578…

PHP魔幻(术)方法

PHP中的魔幻方法,也被称为魔术方法(Magic Methods),是一组具有特殊功能的方法。这些方法在PHP中有固定的名称,并且会在特定的时机自动被PHP调用,而无需开发者显式调用。它们通常用于执行一些特殊的操作&…

4.资源《Arduino UNO R3 proteus 电机PID参数整定工程文件(含驱动代码)》说明。

资源链接: Arduino UNO R3 proteus 电机PID参数整定工程文件(含驱动代码) 1.文件明细: 2.文件内容说明 包含:proteus工程,内含设计图和工程代码。 3.内容展示 4.简述 工程功能可以看这个视频 PID仿真调…

npm的实现原理

npm(Node Package Manager)是Node.js的默认包管理器,用于管理JavaScript项目的依赖关系、脚本运行和包发布。理解npm的实现原理有助于更高效地使用它,优化项目的依赖管理,并在遇到问题时更快地定位和解决。以下将详细介…

Linux 查看当前正在使用的 Bash 版本

在 Linux 系统中,你可以通过几种不同的方法来查看当前正在使用的 Bash 版本。以下是一些常用的方法: 方法一:使用 bash --version 命令 打开终端,然后输入以下命令: bash --version这将显示 Bash 的版本信息&#x…

使用 Pandas 处理 .xlsx 文件的教程(Python)

使用 Pandas 处理 .xlsx 文件的教程 Pandas 是 Python 数据分析的核心库之一,它提供了丰富的数据处理功能,尤其在处理表格数据(如 .xlsx 文件)时非常强大。Pandas 结合了 Python 的灵活性和简洁性,让用户能够轻松地进…