四、数据库系统
数据库系统(Database System),是由数据库及其管理软件组成的系统。数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质 、处理对象和管理系统的集合体。
(一)内容提要

(二)数据库模式
1.三级模式-两级映射
数据库系统采用三级模式结构,这是数据库管理系统内部的系统结构。数据库系统设计员可在视图层、逻辑层和物理层对数据抽象,通过外模式、概念模式和内模式来描述不同层次上的数据特性。
- 数据库的三级模式
-
外模式(External Schema)/用户子模式(Subschema):也称用户子模式(Subschema)或用户模式,是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。理解如下:
-
一个数据库可以有多个外模式;
-
外模式就是用户视图;
-
外模式是保证数据安全性的一个有力措施。
-
-
**模式(Schema)/**概念模式:也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。理解如下:
-
一个数据库只有一个模式;
-
是数据库数据在逻辑级上的视图;
-
数据库模式以某一种数据模型为基础;
-
定义模式时不仅要定义数据的逻辑结构(如数据记录由哪些数据项构成,数据项的名字、类型、取值范围等),而且要定义与数据有关的安全性、完整性要求,定义这些数据之间的联系。
-
-
内模式(Internal Schema):也称存储模式(Storage Schema),它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式(例如,记录的存储方式是顺序存储、按照B树结构存储还是按hash方法存储;索引按照什么方式组织;数据是否压缩存储,是否加密;数据的存储记录结构有何规定)。理解如下:
-
一个数据库只有一个内模式;
-
一个表可能由多个文件组成,如:数据文件、索引文件。 它是数据库管理系统(DBMS)对数据库中数据进行有效组织和管理的方法 其目的有:
-
为了减少数据冗余,实现数据共享;
-
为了提高存取效率,改善性能。
-
-
- 数据库的两级映射
-
外模式-概念模式映射:实现外模式到概念模式之间的相互转换。
-
概念模式-内模式映射:实现概念模式到内模式之间的相互转换。

2.数据库设计过程
数据库设计过程为:需求分析、概念结构设计、逻辑结构设计、物理设计。下图所示,列出了每个阶段的主要特点及产出物。

(三)ER 模型
在 ER 模型中,椭圆表示属性,矩形框表示实体,菱形表示联系。


在下图中的例题中,ER 图中有 3 个实体,所以要转成 3 个关系模式,然后由于 3 个实体之间是多对多的关系,所以这个关系也要转成 1 个关系模式,所以最少可转换为 4 个关系模式。

(四)关系代数
数据库的关系代数有:
-
并:结果为二者元组之和去除重复行。
-
交:结果为二者重复行。
-
差:前者去除二者重复行。
-
笛卡尔积:又称为等值连接。对两个关系R和S进行操作,产生的关系中元组个数为两个关系中元组个数之积。不会将重复的列去掉。
-
投影:关系R上的投影是从R中选择出若干属性列组成新的关系。
-
选择:在关系R中选择满足给定条件的诸元组。
-
连接:。




(五)规范化理论
1.函数依赖
对函数依赖的理解:对于函数 f(x) = x2,将其写成 y=x2,给定 x=1 时,就能确定 y=1,此时可以讲 x 能够确定 y(函数确定),即 y 依赖于 x(写成 x —> y),这就是函数依赖。**注意:**该函数不能写 y 确定 x,即不能写成 y —> x。因为 y=1 时,x 可以等于 1 也可以等于 -1,即 y 的一个值对应 x 的两个值,所以 y 不能确定 x。
部分函数依赖:假如 A 是学号,B 是课程,C 是姓名,可以看出学号+课程(组合主键)是可以确定姓名的,同时学号也能确定姓名,即主键的一部分也能确定属性,这就是部分函数依赖。**注意:**单属性主键不可能出现部分函数依赖。
传递函数依赖:A 可以确定 B(B 不可以确定 A),B 可以确定 C,则 A 可以确定 C。

2.价值与用途
规范化理论的价值与用途,主要是消除数据冗余、更新异常、插入异常、删除异常等问题。

3.键
-
超键(Super Key):在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。超键可能会有多余(冗余)属性,如对于学号+课程确定姓名来说,主键是学号+课程,但是去掉课程后,学号也可以作为主键,所以课程是多余属性。
-
候选键(Candidate Key):不含有多余属性的超键称为候选键。
-
主键(Primary Key):用户选作元组标识的一个候选键。程序主键,一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
-
外键(Forrign Key): 在一个表中存在的另一个表的主键称此表的外键。外键主要是用来描述两个表的关系。


下图中,例 1 的答案是 A1,例 2 的答案是 ABCD,例 3 的答案是 A 和 B(不能写成 AB,因为 AB 是一个组合)。

4.范式
范式在提高的过程中,规范化程度越来越高了,但是粒度越来越小了,就会影响性能,所以一般最高到第三范式(3NF)就可以了。要达到第二范式(2NF)必先达到第一范式(1NF),要达到第三范式必先达到第二范式。
主属性:该属性是候选键的一部分,在任何候选键(关键字)里面出现过的属性都是主属性。
非主属性:不属于候选键的一部分的属性。

4.1 第一范式
下图中的例题中关系 R 不满足 1NF,因为对于高级职称人数这一列,其可以再细分为教授、副教授。将高级职称人数拆分成教授、副教授两列,即可达到 2NF。

4.2 第二范式
下图中的思考题,主键是 SNO(学号)+CNO(课程号) 的组合。SNO+CNO 可以唯一确定 GRADE(成绩)、CREDIT(学分),同时 CNO 也可以唯一确定 CREDIT,所以存在部份依赖,不满足第二范式。关系 R 中有四行中都出现了一样的 CNO、CREDIT(C01、4),两行中都出现了一样的 CNO、CREDIT(C02、2),所以有数据冗余。当更新 C01 的 CREDIT 时,如果只更新了两条记录,剩余的 2 条记录没有更新,就会导致更新异常。如果有 CNO=C08,CREDIT=6 想要录入关系 R 中,由于没有 SNO(SNO 也是主键,不能为 Null),所以无法录入,就会导致插入异常。如果本届学生已经毕业了,需要删除学生的 SNO 信息,就会导致 CNO、CREDIT 都会被删除,所以有删除异常。解决方案:将 CNO、CREDIT 两个字段提取出来构成一个新的的关系模式,去掉关系 R 中的 CREDIT,不能去掉关系 R 中的 CNO,因为关系 R 中的 CNO 是外键。
**注意:**单属性主键不可能出现部分函数依赖,所以单属性主键必然满足第二范式。

4.3 第三范式
可以根据第二范式的思考题来分析下图中的思考题,解决办法:将 DNO、DNAME、LOCATION 提取出来构成一个新的关系,旧的关系中删除 DNAME、LOCATION 字段。

4.4 BC 范式
在下图的例题中,SJ、ST 两个组合都是候选键,因为两个都可以遍历完 STJ。所以 S、T、J 都是主属性,该例题中没有非主属性,所以该关系肯定满足第二范式、第三范式。

下图的例题中,候选键为:SJ、ST,函数依赖有:SJ—>T、T—>J,所有函数依赖的左边部分有:SJ、T,由于 T 不是候选键,所以该关系不是 BC 范式。

5 例题
在下图的例题中,对于空格(1),部门关系不属于第三范式的原因可能有两种:不属于第二范式、属于第二范式但不属于第三范式。在部门表中,部门号是可以作为主键的,由于单属性主键不存在部份依赖,所以部份表满足第二范式,不满足第三范式的原因就是没有消除传递函数依赖。观察空格(2)的答案选项,发现要么改职工表,要么改部门表,意味着要解决部门和职工之间的关联,目前是无法知道哪些职工属于哪个部门,而职工与部门是多对一的关系,所以要这种多对一关系保存在多的这一端,即保存在职工表中,所以要在职工表增加增加一个部门号,就可以建立起职工与部门之间的联系。如果要得到表 4,观察空格(3)的选项中都有职工号,由于之前已经在职工表中增加了部门号的字段,所以不需要部门号,排除 C、D。由于根据商品号就可以查到商品名称,所以不需要商品名称(商品名称一旦出现,就是冗余信息),排除 B,得出最后的答案是 A。

6.模式分解
根据以上类别可知,当范式较低时,可以对关系模式进行拆分,拆分后关系模式的范式级别就能得到提升。

6.1 保持函数依赖分解
对于关系模式 R(A,B,C),其中有 A—>B,B—>C 两个函数依赖,将关系模式 R 拆分成 R1(A,B)和 R2(B,C)后保持了函数依赖,因为保持了A—>B,B—>C 这两个函数依赖,即保持了原关系模式 R 所有的函数依赖。若拆分成 R1(A,B)和 R3(A,C),则没有保持函数依赖,因为只保持了A—>B,而没有保持B—>C。
对于关系模式 R(A,B,C),其中有 A—>B,B—>C,A—>C 三个函数依赖,将关系模式 R 拆分成 R1(A,B)和 R2(B,C)后同样保持了函数依赖, 虽然只保持了 A—>B,B—>C 这两个函数依赖,但是由于 A—>C 是冗余的函数依赖,可以从A—>B,B—>C 推导出A—>C,所以不保持也没关系。
6.2 无损分解
**有损:**不能还原。**无损:**可以还原。
**无损分解:**指将一个关系模式分解成若干个关系模式后,通过自然联接和投影等运算仍能还原到原来的关系模式。




7.并发控制
7.1 基本概念

7.2 存在的问题示例

7.3 封锁协议

8.数据库完整性约束
数据库完整性约束是为了保证数据库中数据的质量而设立的限制条件。它通过定义表或表的列中数据的限制条件来自动保持数据库的完整性。常见的数据库完整性约束有以下几种分类:
-
实体完整性约束:确保每个记录都有一个唯一的主键,可以通过主键约束来实现。
-
参照完整性约束:确保主表和从表之间的数据一致性,即在输入或删除记录时,主表和从表中的相关数据应该一致。可以通过外键约束来实现。
-
域完整性约束:确保数据在指定的范围内有效,可以通过定义数据类型、长度、格式等约束条件来实现。
-
用户自定义完整性约束:根据特定需求,自定义约束条件,以保证数据的完整性。比如限制年龄的值在 0 到 150 之间。

9.数据库安全

10.数据库备份与恢复
10.1 数据库备份


10.2 数据库故障与恢复

11.数据仓库与数据挖掘
数据仓库是面向主题的,而普通的数据库是面向业务的。


12.反规范化技术

13.大数据


(六)数据库的故障
数据库的故障分为 4 类:① 事务内部故障,如运算溢出、并发事务发生死锁等;② 系统故障也称软故障,它是指造成系统停止运行的任何事件;③ 介质故障也称为硬故障,如磁盘损坏、磁头碰撞和瞬时强磁干扰等;④ 计算机病毒。(2022 年下半年选择题)
相关文章:
四、数据库系统
数据库系统(Database System),是由数据库及其管理软件组成的系统。数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介…...
Linux中的高级IO
文章目录 1.IO1.1基本介绍1.2基础io的低效性1.3如何提高IO效率1.4五种IO模型1.5非阻塞模式的设置 2.IO多路转接之Select2.1函数的基本了解2.2fd_set理解2.3完整例子代码(会在代码中进行讲解)2.4优缺点 3.多路转接之poll3.1poll函数的介绍3.2poll服务器3.…...
项目管理之如何估算项目工作成本
在项目管理中,如何估算项目工作成本是一个关键问题。为了解决这个问题,我们可以采用自上而下的成本限额估算法和自下而上的成本汇总估算法。这两种方法各有优缺点,但都可以帮助我们准确地估算项目工作成本。 自上而下的成本限额估算法 自上…...
Redis主从复制基础概念
Redis主从复制:提高数据可用性和性能的策略 一、概述 Redis主从复制是一种常用的高可用性策略,通过将数据从一个Redis服务器复制到另一个或多个Redis服务器上,以提高数据的可用性和读取性能。当主服务器出现故障时,可以快速地切…...
图数据库Neo4j概念、应用场景、安装及CQL的使用
一、图数据库概念 引用Seth Godin的说法,企业需要摒弃仅仅收集数据点的做法,开始着手建立数据之间的关联关系。数据点之间的关系甚至比单个点本身更为重要。 传统的**关系数据库管理系统(RDBMS)**并不擅长处理数据之间的关系,那些表状数据模…...
路由器基础(四): RIP原理与配置
路由信息协议 (Routing Information Protocol,RIP) 是最早使用的距离矢量路由协议。因为路由是以矢量(距离、方向)的方式被通告出去的,这里的距离是根据度量来决定的,所以叫“距离矢量”。 距离矢量路由算法是动态路由算法。它的工作流程是:…...
红外遥控开发RK3568-PWM-IR
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.红外遥控的发送接收工作原理2.红外协议3.红外遥控系统框图4.遥控器添加方法4.1 记录键值4.2 添加键值总结前言 提示:这里可以添加本文要记录的大概内容: 1.红外遥控的发送接收工作原理 …...
go-sync-mutex
Sync Go 语言作为一个原生支持用户态进程(Goroutine)的语言,当提到并发编程、多线程编程时,往往都离不开锁这一概念。锁是一种并发编程中的同步原语(Synchronization Primitives),它能保证多…...
高并发系统设计
高并发系统通用设计方法 Scala-out 横向扩展,分散流量,分布式集群部署 缺点:引入复杂度,节点之间状态维护,节点扩展(上下线) Scala-up 提升单机性能,比如增加内存,增…...
Vue3-Pinia快速入门
1.安装pinia npm install pinia -save 2.在main.js中导入并使用pinia // 导入piniaimport { createPinia } from "pinia"; const pinia createPinia();//使用pinia app.use(pinia)app.mount(#app) 3.在src目录下创建包:store,表示仓库 4…...
Python算法——插入排序
插入排序(Insertion Sort)是一种简单但有效的排序算法,它的基本思想是将数组分成已排序和未排序两部分,然后逐一将未排序部分的元素插入到已排序部分的正确位置。插入排序通常比冒泡排序和选择排序更高效,特别适用于对…...
Java21新特性
目录 一、Java21新特性 1、字符串模版 2、scoped values 3、record pattern 4、switch格式匹配 5、可以在switch中使用when 6、Unnamed Classes and Instance Main Methods 7、Structured Concurrency 一、Java21新特性 1、字符串模版 字符串模版可以让开发者更简洁的…...
4 Tensorflow图像识别模型——数据预处理
上一篇:3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型,内容较多,会分为多个章节介绍。模型构建还是和之前一样的流程: 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…...
SpringBoot整合RabbitMQ学习笔记
SpringBoot整合RabbitMQ学习笔记 以下三种类型的消息,生产者和消费者需各自启动一个服务,模拟生产者服务发送消息,消费者服务监听消息,分布式开发。 一 Fanout类型信息 . RabbitMQ创建交换机和队列 在RabbitMQ控制台,新…...
在校园跑腿系统小程序中,如何设计高效的实时通知与消息推送系统?
1. 选择合适的消息推送服务 在校园跑腿系统小程序中,选择一个适合的消息推送服务。例如,使用WebSocket技术、Firebase Cloud Messaging (FCM)、或第三方推送服务如Pusher或OneSignal等。注册并获取相关的API密钥或访问令牌。 2. 集成服务到小程序后端…...
求极限Lim x->0 (x-sinx)*e-²x / (1-x)⅓
题目如下: 解题思路: 这题运用了无穷小替换、洛必达法则、求导法则 具体解题思路如下: 1、首先带入x趋近于0,可以得到(0*1)/0,所以可以把e的-x的平方沈略掉 然后根据无穷小替换,利用t趋近于0时…...
JavaScript数据类型详细解析与代码实例
JavaScript是一种弱类型动态语言,数据类型分为原始类型和对象类型。 原始类型 原始类型包括:数字、字符串、布尔值和undefined、null。 数字 JavaScript中的数字类型包括整数和浮点数,可以进行基本的数学运算。 var num1 10; // 整数 v…...
.NET Framework中自带的泛型委托Func
Func<>是.NET Framework中自带的泛型委托,可以接收一个或多个输入参数,并且有返回值,和Action类似,.NET基类库也提供了多达16个输入参数的Func委托,输出参数只有1个。 1、Func泛型委托 .NET Framework为我们提…...
深入理解JVM虚拟机第十七篇:虚拟机栈中栈帧的内部结构
大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JavaScript 本文章简介:话不多说,让我们讲清楚虚拟机栈存储结构和运行原理…...
uniapp中地图定位功能实现的几种方案
1.uniapp自带uni.getLocation uni.getLocation(options) getlocation | uni-app官网 实现思路:uni.getLocation获取经纬度后调用接口获取城市名 优点:方便快捷,直接调用 缺点:关闭定位后延时很久,无法控制定位延迟…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
