当前位置:   article > 正文

数据库系统工程师

数据库系统工程师

文章目录

前言

  • 科目
科目题型数量总分合格标准
基础知识单选75×1´=757545
应用技术案例分析(填空、简答)5×15=757545
  • 考试时间
    • 两个科目连考:8:30 ~12:30或14:30~18:30
  • 报考时间
    • 2月底至3月初
  • 考试时间
    • 5月下旬
  • 考试教材
    • 数据库系统工程师教程

第一章 计算机系统知识

1.1 计算机硬件基础知识

  • 计算机的硬件系统
    • CPU
    • 存储器
    • 输入/输出设备(外设)
      在这里插入图片描述

1.1.1 CPU的组成

在这里插入图片描述

  • 运算器
    • 功能
      • (1) 执行所有的算术运算。如加. 减. 乘. 除等基本运算及附加运算。
      • (2) 执行所有的逻辑运算并进行逻辑测试。如与. 非. 或. 零值测试或两个值的比较等。
    • 组成:
      • (1) 算术逻辑单元(ALU):负责处理数据,实现对数据的算术运算和逻辑运算。
      • (2) 累加寄存器(AC):也称累加器,当算术逻辑单元ALU执行运算时,为其提供一个工作区。
        • 常用来为ALU执行算术逻辑运算提供数据并暂存运算结果
      • (3) 数据缓冲寄存器(DR):对内存进行读写操作时,用DR暂时存放由内存读写的一条指令或一个数据字。作为CPU和内存. 外设之间在操作速度上的缓冲,以及数据传送的中转站。
      • (4) 状态条件寄存器(PSW):保存根据算术指令和逻辑指令运行或测试的结果建立的各种条件码的内容,主要分为状态标志和控制标志。如运算结果进位标志©. 运算结果溢出标志(V). 运算结果为0标志(Z). 运算结果为负标志(N). 中断标志(I). 方向标志(D)等。
  • 控制器
    • 功能
      • 决定了计算机运行过程的自动化。
      • 它不仅要保证程序的正确执行,而且要能够处理异常事件。
      • 包括:指令控制逻辑. 时序控制逻辑. 总线控制逻辑和中断控制逻辑等几个部分。
    • 工作过程中主要使用以下部件
      • (1) 指令寄存器(IR):用来暂时存放一条指令,由指令译码器根据指令寄存器中的内容产生各种微操作指令,控制其它部分协调工作。
      • (2) 程序计数器(PC):存放的是将要执行的下一条指令的地址
      • (3) 地址寄存器(AR):保存当前CPU所访问的内存单元的地址。由于内存和CPU存在操作速度上的差异,所以需要使用AR保存地址信息,直到内存读/写操作完成为止。
      • (4) 指令译码器(ID):对指令中的操作码字段进行分析解释,识别该指令规定的操作,然后向操作控制器发出具体的控制信号。
      • ps
        • 指令是对机器进行程序控制的最小单位。
          • 一条指令通常包括两个部份:操作码和操作数。
          • 操作码指出是什么操作,由指令译码器(ID) 来识别。
          • 操作数直接指出操作数本身或者指出操作数所在的地址。
  • 寄存器组
    • (1)专用寄存器:运算器和控制器中的寄存器是专用寄存器,其作用是固定的。
    • (2)通用寄存器:用途广泛并可由程序员规定其用途,其数目因处理器不同而不同。

1.1.2 存储器和总线

  • 存储器
    • 按所处位置:内存、外存
    • 按构成材料:磁存储器(磁带)、半导体存储器、光存储器(光盘)
    • 按工作方式:读写存储器、只读存储器
    • 按访问方式:按地址访问的存储器、按内容访问的存储器
    • 按寻址方式:随机存储器、顺序存储器、直接存储器
  • 总线
    • 分类
      • 数据总线(DB)
        • 用来传送数据信息,是双向的。
        • DB的宽度决定了CPU和计算机其他设备之间每次交换数据的位数。
      • 地址总线(AB)
        • 用于传送CPU发出的地址信息,是单向的。
        • 地址总线的宽度决定了CPU的最大寻址能力。
      • 控制总线(CB)
        • 用来传送控制信号. 时序信号和状态信息等。
        • CB中的每一条线的信息传送方向是单方向且确定的,但CB作为一个整体则是双向的。
    • 采用总线结构的优点:
      • 简化了系统结构,便于系统设计制造;
      • ② 大大减少了连线数目,便于布线,减小体积,提高系统的可靠性;
      • ③ 便于接口设计,所有与总线连接的设备均采用类似的接口;
      • ④ 便于系统的扩充. 更新与灵活配置,易于实现系统的模块化;
      • ⑤ 便于设备的软件设计,所有接口的软件就是对不同的接口地址进行操作;
      • ⑥ 便于故障诊断和维修,同时也降低了成本

1.1.3 输入输出控制

  • 程序控制方式
    • (1) 无条件传送:外设总是准备好的,无条件,随时接收和提供数据。
    • (2) 程序查询方式:CPU利用程序来查询外设的状态,准备好了再传数据。
  • 中断方式
    • CPU不等待,也不执行程序去查询外设的状态,而是由外设在准备好以后,向CPU发出中断请求信号通知CPU,CPU收到中断请求信号以后,保存正在执行程序的现场,转入I/O中断服务程序的执行,然后再返回到被打断的程序继续执行
    • 在有多个中断源的情况下,常用的处理方法有中断信号线法,中断软件查询法,菊花链法,总线仲裁法,中断向量表法。可以按中断源的优先级来安排服务的先后顺序。
    • 中断向量
      • 中断服务程序的入口地址
    • 中断响应时间
      • 发出中断请求开始进入中断处理程序
  • 直接内存存取(DMA) 方式
    • 数据的传输是在主存和外设之间直接进行不需要CPU的干预,只需要CPU在过程开始和结束时发出一些命令,实际操作是由DMA硬件直接执行完成的,CPU在传送的过程中可以处理别的任务。
  • 通道方式和外围处理机方式
    • 更进一步减轻了CPU对I/O操作的控制,更进一步提高了CPU的工作效率,但是是以增加更多硬件为代价的。
  • I/O接口的功能
    • 数据传输及缓存
    • 设备状态检测和反馈
    • I/O操作的控制与定时

1.1.4 几个“周期” 的概念与区别

  • 指令周期
    • 是指执行一条指令所需要的时间
  • 时钟周期
    • 也称为振荡周期,是计算机中最基本的、最小的时间单位
    • 在一个时钟周期内,CPU仅仅完成一个最基本的动作。
  • 总线周期
    • 通常把CPU通过总线对存储器或I/O接口进行一次访问所需要的时间称为一个总线周期。
    • 采用DMA方式传送数据时,每传送一个数据都需要占用一个总线周期
  • CPU周期
    • 又称为机器周期。CPU的操作速度快,但访问内存的速度却慢得多,我们把从内存读取一条指令的最短时间,称之为机器周期。

1.2 计算机体系结构

  • 宏观按照处理机数量分类
    • 单处理系统
    • 并行处理与多处理系统
    • 分布式处理系统
  • 微观按照并行程度分类
    • Flynn分类法
    • 冯泽云分类法
    • Handler分类法
    • Kuck分类法

1.2.1 流水线技术

  • 流水线
    • 将一个较复杂的处理过程分为m个复杂程度相当、处理时间大致相等的子过程,每个子过程 由一个独立的功能部件来完成,处理对象在各子过程连成的线路上连续流动,在同一时间,m个部件同时进行不同的操作,完成对不同对象的处理。
  • 流水线周期
    • 各子任务中执行时间最长的(最慢的)子任务的执行时间。
  • 流水线执行完n条指令所需要的时间:
    • Tn=执行一条指令所需时间+(n-1)*流水线周期
  • 吞吐率
    • 是指单位时间里流水线处理机流出的结果数。对指令而言,就是单位时间里执行的指令数。
    • p=1/max(∆t1,∆t2,…∆tm),即最长子过程所用时间的倒数

1.3 存储系统

在这里插入图片描述

  • 存储器的分类:
    • 按存储器所处的位置:可分为内存和外存。
    • 按构成存储器的材料:可分为磁存储器. 半导体存储器和光存储器。
    • 按存储器的工作方式:可分为读写存储器和只读存储器。
    • 按访问方式:可分为按地址访问的存储器和按内容访问的存储器。
    • 按寻址方式:可分为随机存储器. 顺序存储器和直接存储器。
      • 随机访问存储器
        • 静态随机访问存储器(SRAM)
        • 动态随机访问存储器(DRAM)

1.3.1 高速缓存

在这里插入图片描述

  • Cache是介于CPU与主存之间的一级存储器,其容量较小,但速度较快,一般比主存快5~10倍。
  • 它的主要作用是:调和CPU的速度与内存存取速度之间的差异,从而提升系统性能。
  • 它使用的是程序的局部性原理,其内容是主存局部域的副本
  • 当CPU需要读取数据时,首先判断要访问的信息是否在Cache中,如果在即为命中,如果不在,就要按替换算法把主存中的一块信息调入Cache中。
  • 替换算法有:随机替换算法. 先进先出替换算法. 近期最少使用替换算法. 优化替换算法等。
  • CPU工作时给出的是主存的地址,要从Cache存储器中读写信息,就需要将主存地址转换成Cache存储器的地址,这种地址的转换叫作地址映像。
    • 该转换工作由硬件完成

1.3.2 地址映像

  • 以下3种发生块冲突次数最多的是直接映像,最少的是全相联映像

  • (1)直接映像

    • 主存的块与Cache块的对应关系是固定的,主存中的块只能存放在Cache存储器的相同块号中。
    • 优点
      • 地址变换简单,访问速度快
    • 缺点
      • 块冲突率高. Cache空间得不到充分利用。
    • 例:假设主存容量为1MB,高速缓存容量为16KB,块的大小为512B,那么n和M分别是多少
      • Cache:16*1024/512=32,所以块的范围是 0~31,n=31
      • 主存:1*1024/16=64,所以分区范围是 0~63,M=63
        在这里插入图片描述
  • (2) 全相联映像

    • 主存与Cache存储器均分成容量相同的块。允许主存的任一块可以调入Cache存储器的任何一个块的空间中。
    • 优点
      • 灵活,块冲突率低,只有在Cache中的块全部装满后才会出现冲突,Cache利用率高
    • 缺点
      • 无法从主存块号中直接获得所对应Cache的块号,变换比较复杂,地址变换速度慢,成本高。
    • 例:假设主存容量为1MB,高速缓存容量为16KB,块的大小为512B,那么n和M分别是多少
      • Cache:16*1024/512=32,所以块的范围是 0~31,n=31
      • 主存:1*1024*1024/512=2048,所以分区范围是 0~2047,M=2047
        在这里插入图片描述
  • (3) 组相联映像

    • 是前两种方式的折衷。将Cache中的块再分成组。组采用直接映像方式块采用全相联映像方式。主存的任何区的0组只能存到Cache的0组中,1组只能存放到1组中,依此类推。而组内的块可以存入Cache中相同组的任一块中。
    • 公式:
      • 主存地址位数= 区号+组号+主存块号+块内地址
      • Cache地址位数= 组号+组内块号+块内地址
    • 例:假设主存容量为1MB,高速缓存容量为16KB,块的大小为512B,每两块为1组
      • Cache:16*1024/512=32,再将每两块分为1组,则Cache中的块为16组(0~15)
      • 主存:1*1024/16=64,所以区为64(0~63),1*1024*1024/64/512=32,每组两个块,所以每个区又分为16组(0~15)
        在这里插入图片描述
  • Cache的性能分析

    • 设H为Cache的命中率,t1为Cache的存取时间,t2为主存的访问时间,则Cache存储器的等效加权平均访问时间t3为
      • t3 =H*t1+(1-H)*t2

1.3.3 虚拟存储器和相联存储器

  • 虚拟存储器
    • 逻辑存储器
    • 常用的由主存-辅存两级存储器组成
  • 相联存储器
    • 按内容访问的存储器

1.4 安全性、可靠性与系统性能评测基础知识

1.4.1 加密技术-对称加密技术

  • 对称加密技术
    • 文件加密和解密使用相同的密钥,或者虽然不同,也可以从其中一个很容易地推导出另一个。
    • 1101100010 → 1000110111 → 1101100010
    • 明文 → 密文 → 明文
    • 代表算法:
      • (1) DES:主要采用替换和移位的方法加密。它用56位密钥对64位二进制数据块进行加密。
      • (2) 3DES:用两个56位的密钥。
      • (3) RC-5
        • RC-5(对称密码算法)一般指RC5
        • 适合对 大量的明文消息进行加密传输
      • (4) IDEA:类似于DES,其密钥长度为128位。
      • (5) AES:基于排列和置换运算。

1.4.2 加密技术-非对称加密技术

  • 非对称加密技术
    • 同样使用两个密钥:加密密钥和解密密钥,一个是公开的,一个是非公开的私有密钥。他们是一对,只有使用对应的密钥才能解密。
    • 非对称加密算法的保密性较好,它消除了最终用户频繁交换密钥的需要,但加密和解密花费时间长、速度慢,不适合于对文件加密,而只适用于对少量数据加密
    • 代表算法
      • RSA,基于大素数分解的困难性。
    • 非对称加密有两个不同的体制:加密模型认证模型
      在这里插入图片描述

1.4.3 信息摘要

  • hash函数:输入一个长度不固定的字符串,返回一串固定长度的字符串,又称Hash值。
  • 单向Hash函数用于产生信息摘要。
  • 对于特定的文件而言,信息摘要是唯一的。
  • 在某一特定的时间内,无法查找经Hash操作后生成特定Hash值的原报文,也无法查找两个经Hash操作后生成相同Hash值的不同报文。
  • 在数字签名中,可以解决验证签名和用户身份验证. 不可抵赖性的问题。
  • MD2. MD4和MD5是被广泛使用的Hash函数,它们产生一种128位的信息摘要。

1.4.4 数字签名和数字加密

  • 数字签名

    • 可以确认信息发送者的身份信息是否被修改过
    • 不能保证发送信息的保密性
      在这里插入图片描述
  • 数字加密

    • 可以保证发送信息的保密性,但是不能确认发送者的身份。
      在这里插入图片描述

1.4.5 数字签名和数字加密的区别和联系

  • 数字签名使用的是发送方的密钥对,任何拥有发送方公开密钥的人都可以验证数字签名的正确性。
  • 数字加密使用的是接收方的密钥对,是多对一的关系,任何知道接收方公开密钥的人都可以向接收方发送数据,但只有唯一拥有接收方私有密钥的人才能对信息解密
  • 数字签名只采用了非对称加密算法,它能保证发送信息的完整性. 身份认证和不可否认性,但不能保证发送信息的保密性。
  • 数字加密采用了对称密钥算法和非对称密钥算法相结合的方法,它能保证发送信息的保密性

1.4.6 计算机可靠性

  • (1) 计算机系统的可靠性

    • 是指从它开始运行(t=0) 到某时刻t这段时间内能正常运行的概率,用R(t)表示。
  • (2) 计算机系统的失效率

    • 是指单位时间内失效的元件数与元件总数的比例,用λ 表示。
  • (3) 平均无故障时间(MTBF)

    • 两次故障之间能正常工作的时间的平均值称为平均无故障时间
    • MTBF=1/λ
  • (4) 计算机系统的可维修性

    • 一般平均修复时间(MTRF) 表示,指从故障发生到机器修复平均所需的时间。
  • (5) 计算机系统的可用性

    • 指计算机的使用效率,它以系统在执行任务的任意时刻能正常工作的概率A表示。
      • A=MTBF/(MTBF+MTRF)
  • 串联系统的可靠性

    • R=R1× R2× R3× …RN
    • 在这里插入图片描述
  • 并联系统的可靠性

    • R=1-(1-R1)(1-R2)(1-R3)…(1-RN)
    • 在这里插入图片描述
  • 下面的可靠性

    • (1-(1-R)³)( 1-(1-R)²)
    • 在这里插入图片描述

第二章 程序语言基础知识

2.1 低级语言和高级语言

  • 低级语言
    • 机器语言和汇编语言
    • 机器语言
      • 指令是一种二进制代码,由操作码和操作数两部分组成。操作码规定了指令的操作,是指令中的关键字,不能缺省。操作数表示该指令的操作对象。
    • 汇编语言
      • 用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。
    • 是一种面向机器的语言,其格式取决于计算机的机器指令。
    • 难以理解,程序可读性差,程序设计效率低。
  • 高级语言
    • 面向各类应用的程序语言
    • Java. C. C++. Python. PHP、JavaScript等等。
      • 拥有很多函数库,用户可以根据自身的需求在代码中加入头文件来调用这些函数来实现自己的功能,当然使用者也可以根据自己的喜好编写函数来在后续的代码中调用。
    • 与人们使用的语言较为接近,便于理解,提高了程序设计的效率。

2.2 汇编. 解释. 编译

  • 高级程序语言必须进行翻译才能为计算机硬件所理解,常用的翻译方式有汇编、解释和编译
  • 汇编语言编写的:需要汇编程序翻译成目标程序,然后执行目标程序。
  • 高级语言编写的:需要解释程序或编译程序进行翻译,然后再运行。

2.3 编绎程序和解释程序

  • 解释程序(解释器)
    • 要么直接解释执行源程序,要么将源程序翻译成某种中间代码后再加以执行。
    • 它按源程序中语句的执行顺序,逐条翻译并立即执行相关功能。
  • 编译程序(编译器)
    • 将源程序翻译成目标程序(目标代码),然后再在计算机上运行目标程序。
    • 一般分为两个阶段
      • 编译阶段:把源程序翻译成目标程序。
      • 运行阶段:执行目标程序。

2.4 编绎和解释的区别:

  • 解释方式
    • 解释程序和源程序(或其某种等价表示) 要参与到程序的运行过程中,运行程序的控制权在解释程序
    • 翻译源程序时不生成独立的目标程序
    • 解释方式比编译方式更灵活解释方式可移植性好
  • 编译方式
    • 机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程
    • 编译器则将源程序翻译成独立保存的目标程序
    • 编译比解释方式可能取得更高的效率

2.5 程序语言的数据成分

  • 常量和变量
    • 按照程序运行时数据的值能否改变,将程序中的数据分为常量和变量。
  • 全局变量和局部变量
    • 数据的作用域范围,可将其分为全局变量和局部变量。
    • 全局变量
      • 存储空间在静态数据区分配
      • 在程序运行的过程中一般是不改变
    • 局部变量
      • 动态存储区(栈区)
      • 分配的存储单元是可以动态改变的。
  • 3) 数据类型
    • 基本类型:整型. 字符型. 实型和布尔类型
    • 特殊类型:空类型
    • 用户定义类型枚举类型
    • 构造类型数组、结构、联合
    • 指针类型type *
    • 抽象数据类型:类类型

2.6 程序语言的控制成分

  • 顺序结构

    • 计算过程从所描述的第一个操作开始,按顺序依次执行后续的操作,直到序列的最后一个操作。
      在这里插入图片描述
  • 选择结构

    • 选择结构提供了在两种或多种分支中选择其中一个的逻辑。
      在这里插入图片描述
  • 循环结构

    • 循环结构描述了重复计算的过程,通常由三部分组成:初始化. 循环体和循环条件。
      在这里插入图片描述

2.7 编译过程

  • 编译程序的作用是把某种高级语言书写的源程序翻译成与之等价的目标程序,其工作过程一般可以分为6个阶段:
    在这里插入图片描述
    1. 词法分析:
    • 任务:对源程序从前到后(从左到右) 逐个字符地扫描,从中识别出一个个“单词” 符号。“单词” 符号是程序设计语言的基本语法单位,如关键字(保留字) . 标识符. 常数. 运算符和标点符号. 左右括号等。
    1. 语法分析:
    • 任务:根据语言的语法规则,在词法分析的基础上,分析单词串是否构成短语和句子,即是否为合法的表达式. 语句和程序等基本语言结构,同时检查和处理程序中的语法错误。
    • 如果源程序没有语法错误,语法分析后就能正确地构造出其语法树。
    1. 语义分析
    • 任务:分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。
    • 语义分析的一个主要工作是进行类型分析和检查。一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。例如:整除取余运算符只能对整型数据进行运算,如果运算对象为浮点数,则认为是一种类型不匹配的错误。
    1. 中间代码生成
    • 任务:根据语义分析的输出生成中间代码。
    • 常用的中间代码有:后缀式(逆波兰式)、四元式(三地址码)、树形表示
    1. 代码优化:
    • 由于编译器将源程序翻译成中间代码的工作是机械的. 按固定模式进行的,因此,生成的中间代码往往在时间和空间方面的效率较差。当需要生成高效的目标代码时,就必须进行优化。
    • 优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段进行。
    1. 目标代码生成
    • 目标代码生成是编译器工作的最后一个阶段。
    • 任务:把中间代码变换成特定机器上的绝对指令代码. 可重定位的指令代码和汇编指令代码。
    • 这个阶段的工作与具体的机器密切相关。
    1. 符号表管理
    • 符号表的作用是记录源程序中各种符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找. 插入. 修改和删除等操作。
    1. 出错处理
    • 源程序中不可避免地会有一些错误,大致分为静态错误和动态错误。
      • (1) 动态错误发生在程序运行时,如:变量取零时作除数. 引用数组下标错误等。
      • (2) 静态错误是指编译阶段发现的程序错误,可分为语法错误和静态语义错误。
    • ① 语法错误:单词拼写错误. 标点符号错. 表达式中缺少操作数. 括号不匹配等有关语言结构上的错误。
    • ② 静态语义错误:语义分析时发现的运算符和运算对象类型不合法等错误。

2.8 中缀. 前缀与后缀表达式

  • 中缀表达式:即我们通常所使用的表达式。如(a+b)*c-d
  • 前缀表达式(波兰式) :将运算符写在前面,操作数写在后面,且不使用括号。-*+abcd
  • 后缀表达式(逆波兰式) :将运算符写在后面,操作数写在前面,且不使用括号。ab+c*d
  • 三种表达式之间的转换:
    • 例:(a+b)*c-d
    • (1) 中缀表达式转前缀表达式:
      • ① 按计算顺序全部加上括号(((a+b)*c)-d)
      • ② 把每一对括号内的运算符移到括号前面 -(*(+(ab)c)d)
      • ③ 把所有括号去掉-*+abcd
    • (2) 中缀表达式转后缀表达式:
      • ① 按计算顺序全部加上括号:(((a+b)*c)-d)
      • ② 把每一对括号内的运算符移到括号后面:(((ab)+c)*d)-
      • ③ 把所有括号去掉:ab+c*d-

2.9 传值调用和引用调用

  • 函数调用时基本的参数传递方式有两种:传值调用和引用调用。
  • (1) 传值调用
    • 信息传递是单向的,只能将实参的值传递给形参,而形参不能再将值传递给实参。将实参的值传递给形参
    • 实参可以是常量(表达式),也可以是变量(数组元素) 。
例:int sum(int x, int y) {
							int z;
							z=x+y;
							return z;
						 }
函数调用时:sum(2,3);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • (2) 引用调用(传地址调用)
    • 在这种方式下,可以认为形参名实际上是实参的别名,被调函数中对形参的访问和修改实际上就是对实参的访问和修改。将实参的地址传递给形参
    • 因此客观上可以实现形参和实参双向传递数据。
    • 因此只能是变量(数组元素),而不能是常量(表达式) 。
例:void swap(int &x, int &y) {
								int temp;
								temp=x; x=y; y=temp 
								}
函数调用时:sum(a,b);
  • 1
  • 2
  • 3
  • 4
  • 5

2.10 语用和语境

  • 语用
    • 表示了构成语言的各个记号和使用者的关系
  • 语境
    • 理解和实现程序设计语言的环境

第三章 数据结构与算法

3.1 线性结构

3.1.1 线性表

  • 线性表的定义
    • 一个线性表是n个元素的有限序列(n≥0),通常表示为(a1,a2,a3,……,an) 。
  • 线性表的顺序存储(顺序表)
    • 是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
    • 优点:可以随机存取表中的元素,按序号查找元素的速度很快。
    • 缺点:插入和删除操作需要移动元素。
      在这里插入图片描述
  • 线性表的链式存储(链表)
    • 是指用节点来存储数据元素,元素的节点地址可以连续,也可以不连续节点空间只有在需要时才申请,无需事先分配
    • 优点:插入和删除操作不需要移动元素
    • 缺点:只能按顺序访问元素,不能进行随机存取。
    • 除了普通的单链表外,根据结点中指针信息的实现方式,还有双向链表、循环链表和静态链表等链表结构
      • 双向链表:每个节点包含两个指针,分别指明当前元素的直接前驱和直接后继信息(可在两个方向上遍历)
      • 循环链表:表尾节点的指针指向表中的第一个节点(可从任意节点遍历)
      • 静态链表:借助数组来描述线性表的链式存储结构()
        e
        在这里插入图片描述

3.1.2 栈和队列

  • 栈和队列都是一种特殊的线性表

  • 先进后出

    • 应用:表达式求值、括号匹配、函数调用、返回控制、递归过程转变为非递归过程

    • 顺序栈:用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素。

      • 存储空间是预先定义或申请的,因此可能会出现栈满的情况
      • 每一个元素入栈时都要判断栈是否已满。
      • 需要设置一个头指针指到栈顶。
      • 需要附设指针top指示栈顶元素的位置。
      • 在这里插入图片描述
    • 链栈:用链表存储栈中的元素。

      • 由于栈中元素的插入和删除仅在栈顶进行,因此不必设置头节点,链表的头指针就是栈顶指针。
      • 在这里插入图片描述
  • 队列先进先出,队尾入队头出。

    • 应用:打印队列、层次遍历、离散事件的计算机模拟

    • 顺序队列

      • 在这里插入图片描述
    • 循环队列

      • 在这里插入图片描述在这里插入图片描述

    • 链队列

      • 为了便于操作,可以给链队列添加一个头节点,并令头指针指向头节点。
      • 队列为空的判定条件就是头指针和尾指针的的值相同,并且均指向头节点。
        • 在这里插入图片描述

3.1.3 串

  • 字符串是一串文字及符号的简称,是一种特殊的线性表。

  • 字符串的基本数据元素是字符,常常把一个串作为一个整体来处理。

  • 串是仅由字符构成的有限序列,是取值范围受限的线性表

    • 一般记为S=‘a1a2…an’,其中S是串名,单引号括起来的字符序列是串值
  • 串长:即串的长度,指字符串中的字符个数。

  • 空串:长度为0的空串,空串不包含任何字符

  • 空格串:由一个或多个空格组成的串。

  • 子串:由串中任意长度的连续字符构成的序列称为子串。

  • 串相等:指两个串长度相等且对应位置上的字符也相同。

  • 串比较:两个串比较大小时以字符的ASCII码值作为依据。

  • 顺序存储:用一组地址连续的存储单元来存储串值的字符序列。

    • 在这里插入图片描述
  • 链式存储:字符串可以采用链表作为存储结构,当用链表存储串中的字符时,每个结点中可以存储一个字符,也可以存储多个字符。

    • 在这里插入图片描述

3.2 数组和矩阵

3.2.1 数组

  • 一维数组是长度固定的线性表,数组中的每个数据元素类型相同。n维数组是定长线性表在维数上的扩张,即线性表中的元素又是一个线性表。
  • 由于数组一般不做插入和删除,且元素个数和元素之间的关系不再发生变动,那么数组适合采用顺序存储结构。
  • 数组元素的存储方式及相关计算:二维数组的存储结构可分为以行为主序(按行存储) 和以列为主序(按列存储) 两种方法。
  • 设每个数据元素占用L个单元,m. n为数组的行数和列数,那么:
    • 以行为主序优先存储的地址计算公式为:Loc(aij)=Loc(a11)+((i-1)× n+(j-1))× L
    • 以列为主序优先存储的地址计算公式为:Loc(aij)=Loc(a11)+((j-1)× m+(i-1))× L
    • 在这里插入图片描述

3.2.2 矩阵

  • 这里主要讨论一些特殊矩阵的压缩存储的问题。

  • 对多个值相同的元素可以只分配一个存储单元,零元素不分配存储单元。

  • 下面主要讨论对称矩阵. 三对角矩阵. 稀疏矩阵。

  • 对称矩阵

    • 若矩阵An× n中的元素有aij=aji(1≤i,j≤n) 的特点,则称之为对称矩阵。如:
    • 在这里插入图片描述
    • 则矩阵Anxn的n2个元素可以压缩存储到可以存放n(n+1)/2个元素的存储空间中。
    • 假设以行为主序存储下三角(包括对角线) 中的元素,并以一个一维数组B[n(n+1)/2]作为n阶对称矩阵A中元素的存储空间,则B[k](0≤k<n(n+1)/2) 与矩阵元素aij(aji) 之间存在着一一对应的关系
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 三对角矩阵

    • 对角矩阵是指矩阵中的非零元素都集中在以主对角线为中心的带状区域中,其余的矩阵元素都为零。
    • 下面主要考虑三对角矩阵,即只有主对角线及其左右两边为非零元素。
    • 若以行为主序将n阶三对角矩阵An× n的非零元素存储在一维数组B[k](0≤k<3n-2) 中,则元素位置之间的对应关系为:k=3× (i-1)-1+j-i+1=2i+j-3 (1≤i,j≤n)
    • 在这里插入图片描述
  • 稀疏矩阵

    • 在一个矩阵中,若非零元素的个数远远少于零元素的个数,且非零元素的分布没有规律,则称之为稀疏矩阵。
    • 可以用一个三元组(i,j,aij) 唯一确定矩阵中的一个元素。
    • 在这里插入图片描述

3.3 树和二叉树

3.3.1 树的定义及相关概念

  • 树是n(n≥0)个结点的有限集合。 当n=0时称为空树。 在任一非空树中,有且仅有一个称为根的结点:其余结点可分为m(m≥0)个互不相交的有限集T1,T2…,Tm,其中每个集合又都是一棵树,并且称为根结点的子树。

  • 算法-B-树、B树、B+树详解
    在这里插入图片描述

  • 双亲、 孩子和兄弟

  • 结点的度

    • 一个结点的子树的个数记为该结点的度。
  • 叶子结点

    • 也称为终端结点,指度为零的结点。
  • 内部结点

    • 度不为零的结点称为分支结点或非终端结点。 除根结点之外,分支结点也称为内部结点。
  • 结点的层次

    • 根为第一层,根的孩子在第二层,依此类推。
  • 树的高度

    • 一棵树的最大层次数记为树的高度(或深度) 。
  • 有序(无序) 树

    • 若将树中结点的各子树看成是从左到右具有次序的,即不能交换,则称该树为有序树,否则称为无序树。
  • 森林

    • m(m≥0)棵互不相交的树的集合。

3.3.2 二叉树的定义及性质

  • 二叉树是n(n≥0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两棵不相交的、 分别称为左子树和右子树的二叉树所组成。
  • 树和二叉树的区别:(1) 二叉树中结点的子树要区分左子树和右子树,即使只有一棵子树,而树中不用区分。 (2) 二叉树中结点的最大度为2,而树中无限制。

在这里插入图片描述

  • 性质
    • 1、 二叉树第i(i≥1) 层上至多有2i-1个节点。
    • 2、 深度为k的二叉树至多有2k-1个结点(k≥1) 。
    • 3、 对任何一棵二叉树,若其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

3.3.3 满二叉树和完全二叉树

  • 满二叉树的定义
    • 若深度为k的二叉树有2k-1个结点,则称其为满二叉树。
  • 完全二叉树
    • 当深度为k、 有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应时,称之为完全二叉树。
      在这里插入图片描述

3.3.4 二叉树的存储结构

在这里插入图片描述

在这里插入图片描述

3.3.5 二叉树的遍历

  • 遍历是按某种策略访问树中的每个结点,且仅访问一次。
  • 依据访问根结点次序的不同,可分为前序遍历法、 中序遍历法、 后序遍历法。
  • (1) 中序遍历法:(左、 根、 右)
    • A、 中序遍历根的左子树。
    • B、 访问根结点。
    • C、 中序遍历根的右子树。
  • (2) 前序遍历法:先访问根结点(根、 左、 右)
  • (3) 后序遍历法:后访问根结点(左、 右,根)
  • (4) 层序遍历法:按层从上至下、 每层从左至右的顺序遍历。
    在这里插入图片描述

3.3.6 最优二叉树

  • 最优二叉树又称哈夫曼树,又称霍夫曼树,是一类带权路径长度最短的树。
      • 是一个人为的概念,表示计算机对每个结点的访问频率。
    • 路径长度
      • 是每一个结点到根结点的路径的长度。
    • 结点的带权路径长度
      • 是指从该结点到根结点之间的路径长度与该结点权的乘积。
    • 树的带权路径长度为树中所有叶子结点的带权路径长度之和。
    • 下图b为最优
      在这里插入图片描述
  • 构造最优二叉树的哈夫曼方法:
    • (1) 根据给定的n个权值{w1,w2,…,wn}构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵树Ti只有一个带权为wi的根结点,其左右子树均空。
    • (2) 在F中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,置新构造二叉树的根结点的权值为其左、 右子树根结点的权值之和。
    • (3) 从F中删除这两棵树,同时将新得到的二叉树加入到F中。
    • 重复(2) (3) 步,直到F中只含一棵树时为止,这棵树便是最优二叉树(哈夫曼树) 。
  • 应用
    • 对字符集中的字符进行编码和译码
    • 进行通信电文的编码和解码

3.3.7 二叉查找树

  • 二叉查找树又称为二叉排序树。 它或者是一棵空树,或者是具有如下性质的二叉树:
    • (1) 若它的左子树非空,则左子树上所有结点的关键码值均小于根结点的关键码值。
    • (2) 若它的右子树非空,则右子树上所有结点的关键码值均大于根结点的关键码值。
    • (3) 左、 右子树本身就是两棵二叉查找树
  • 对二叉查找树进行中序遍历,可得到一个关键码递增有序的结点序列。
  • 二叉查找树的作用:使用二叉查找树来查找树中的数值比普通的二叉树更为方便。
    在这里插入图片描述

3.4 图

3.4.1 图的相关概念

  • 一个图G(Graph) 是由两个集合:V和E所组成的,V是有限的非空顶点(Vertex) 集合,E是用顶点表示的边(Edge) 集合,图G的顶点集和边集分别记为V(G) 和E(G) ,而将图G记作G=(V,E)。

  • 可以看出,一个顶点集合与连接这些顶点的边的集合可以唯一表示一个图。

  • 在图中,数据结构中的数据元素用顶点表示,数据元素之间的关系用边表示。

  • 有向图

    • 在这里插入图片描述
  • 无向图

    • 图中每条边都是无方向的。 顶点vi和vj之间的边用(vi,vj)表示。 在无向图中,(vi,vj)和(vj,vi)表示的是同一条边。
    • 在这里插入图片描述
  • 完全图

    • 若一个无向图具有n个顶点,而每一个顶点与其他n-1个顶点之间都有边,则称之为无向完全图。
    • 显然,含有n个顶点的无向完全图共有n(n-1)/2条边,类似地,有n个顶点的有向完全图中弧的数目为n(n-1),即任意两个不同顶点之间都存在方向相反的两条弧。

3.4.2 图的存储结构

  • (1) 邻接矩阵表示法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • (2) 邻接链表表示法
    • 邻接链表是为图的每一个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点vi的表(对于有向图是以vi为尾的弧)
    • 邻接链表中的表节点有表节点和表头节点两种类型:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.5 排序算法

  • 常见的排序算法
  • 1、 直接插入排序
    • 按顺序插入待排关键字,插入时依次查找位置,直接插入,后面的依次后移。
    • 定第一个
  • 2、 冒泡排序
    • 依次把相邻的两个记录进行比较,然后交换位置。
    • 泡泡
  • 3、 简单选择排序
    • 每次选择最小的,与第一个没有排过序的记录交换。
    • 定最小
  • 4、 希尔排序
    • 间隔若干个空的记录分为一组,进行直接插入排序,依次将间隔缩小到1为止。
    • 又称 缩小增量排序
    • 定步长
  • 5、 快速排序
    • 设两个指针指示头尾,从尾开始,首尾交替轮流和枢轴记录(第一个记录) 进行比较,并交换位置。
    • 定基数
  • 6、 堆排序
    • 反复将待排序列建立成堆,并取堆顶。
  • 7、 归并排序
    • 两两归并为一组,再四个记录归并为一组,依此类推。

在这里插入图片描述

3.5.1 直接插入排序

  • 具体做法是:在插入第i个记录时,R1,R2,… ,Ri-1已经排好序,将记录Ri的关键字ki依次与关键字ki-1,ki-2,… ,k1进行比较,从而找到Ri应该插入的位置,插入位置及其后的记录依次向后移动。
  • 待排序列:35 12 67 29 51
    • 第1步:35
    • 第2步:12 35
    • 第3步:12 35 67
    • 第4步:12 29 35 67
    • 第5步:12 29 35 51 67

3.5.2 冒泡排序

  • 首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换两个记录的值,然后比较第二个记录和第三个记录的关键字,依此类推。
  • 待排序列: 35 12 67 29 51
    在这里插入图片描述

3.5.3 简单选择排序

  • n个记录进行简单选择排序的基本方法是:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n) 个记录进行交换,当i等于n时所有记录有序排列。
  • 待排序列: 35 12 67 29 51
    在这里插入图片描述

3.5.4 希尔排序

  • 希尔排序又称“缩小增量排序” ,是对直接插入排序方法的改进。
  • 先将整个待排记录序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
  • 待排序列: 48 37 64 96 75 12 26 48 54 03

在这里插入图片描述

3.5.5 快速排序

  • 通过一趟排序将待排的记录划分为独立的两部分,称为前半区和后半区,其中,前半区中记录的关键字均不大于后半区记录的关键字,然后再分别对这两部分记录继续进行快速排序,从而使整个序列有序。
  • 具体做法: 附设两个位置指示变量i和j,它们的初值分别指向序列的第一个记录和最后一个记录。 设枢轴记录(通常是第一个记录) 的关键字为pivot,则首先从j所指位置起向前搜索,找到第一个关键字小于pivot的记录时将该记录向前移到i指示的位置,然后从i所指位置起向后搜索,找到第一个关键字大于pivot的记录时将该记录向后移到j所指位置,重复该过程直至i与j相等为止。
  • 待排序列: a[8]={39,58,32,47,46,19,25,55}
    在这里插入图片描述

3.5.6 堆排序

  • 堆: 对于n个元素的关键字序列{k1,k2,…,kn},当且仅当满足下列关系时称其为堆。
  • (ki≤k2i 并且 ki≤k2i+1)或(ki≥k2i 并且 ki≥k2i+1
  • 基本思想: 对一组待排序记录的关键字,首先把它们按堆的定义排成一个序列(即建立初始堆) ,从而输出堆顶的最小关键字(对于小顶堆而言) 。 然后将剩余的关键字再调整成新堆,便得到次小的关键字,如此反复,直到全部关键字排成有序序列为止。
    在这里插入图片描述

3.5.7 归并排序

  • 基本思想: 把一个有n个记录的无序文件看成是由n个长度为1的有序子文件组成的文件,然后进行两两归并,得到n /2个长度为2或1的有序文件,再两两归并,如此重复,直至最后形成包含n 个记录的有序文件为止。
  • 待排序列: 39 19 32 25 46 58 47 55
    在这里插入图片描述

3.6 查找算法

  • 常见的查找算法
  • 1、 顺序查找
  • 2、 折半查找(二分查找)
  • 3、 索引顺序查找(分块查找)
  • 4、 树表查找
  • 5、 哈希查找

3.6.1 查找表及查找效率

  • 查找表定义
    • 是指由同一类型的数据元素(或记录) 构成的集合。
  • 静态查找表
    • 只进行“查询” 和“检索” 操作。
  • 动态查找表
    • 除了查询和检索外可能还会进行插入和删除操作。
  • 关键字
    • 是数据元素(或记录)的某个数据项的值,用它来识别(标识)这个数据元素(或记录)。
  • 查找
    • 根据给定的某个值,在查找表中确定是否存在一个其关键字等于给定值的记录或数据元素。
  • 平均查找长度(ASL)
    • 对于查找算法来说,其基本操作是“将记录的关键字与给定值进行比较” 。 因此,通常以“其关键字和给定值进行比较的记录个数的平均值” 作为衡量查找算法好坏的依据。

3.6.2 顺序查找

  • 从表中的一端开始,逐个进行记录的关键字和给定值的比较,若找到一个记录的关键字与给定值相等,则查找成功; 若整个表中的记录均比较过,仍未找到关键字等于给定值的记录,则查找失败。
  • 查找效率低,但是算法简单且适应面广。
    在这里插入图片描述

3.6.3 折半查找(二分查找)

  • 基本思想: 先令查找表中间位置记录的关键字和给定值比较,若相等,则查找成功; 若不等,则缩小范围,直至新的查找区间中间位置记录的关键字等于给定值或者查找区间没有元素时(查找不成功) 为止。
  • 这种方法要求查找表进行顺序存储并且按关键字有序排列
  • 查找效率比顺序查找要高,但要求关键字有序排列。
  • 适用于表不易变动,且又经常进行查找的情况。
    在这里插入图片描述

3.6.4 折半查找断定树

  • 从折半查找的过程来看,可以用一棵二叉树来描述。 通常称这个描述折半查找二叉树的过程称为折半查找判定树。
    在这里插入图片描述

3.6.5 树表查找

  • 二叉查找树是一种动态查找表,表结构本身是在查找过程中动态生成的。
  • 设关键字序列为{46,25,54,13,29,91}
    在这里插入图片描述

3.6.6 索引顺序查找(分块查找)

  • 是对顺序查找的一种改进
  • 将表分成若干块,每一块中的关键字不一定有序,但块之间是有序的。

在这里插入图片描述

3.6.7 哈希查找

  • 前面几种查找方法中,记录的存储位置和关键码之间不存在确定的关系,因此查找时都要建立在对关键字进行比较的基础之上。
  • 哈希函数
    • 关键字作为自变量,关键字存放的地址作为因变量。
    • 根据键值直接访问的数据结构
    • 随机预言机是完美的哈希函数
    • 具有单向性
  • Hi=Hash(Key)
  • 这一映射过程称为哈希造表或散列,所得的存储位置称为哈希地址或散列地址。
  • 冲突
    • 对于某个哈希函数Hash和两个关键字K1和K2,如果K1≠ K2而Hash(K1)=Hash(K2),则称出现了冲突。
  • 采用哈希法主要考虑的两个问题是哈希函数的构造和冲突的解决。
  • 冲突的处理:
    • 1)开放定址法
      • 在这里插入图片描述
    • 2) 链地址法
      • 它将具有相同哈希函数值的记录组织成一个链表,当链域的值为NULL时,表示已没有后继记录。
      • 地址里存放的是指针,而不是关键字,将哈希函数值相同的记录组成一个链表

3.7 图的相关算法

3.7.1 生成树与最小生成树

  • 生成树
    • 设图G=(V,E)是个连通图,如果其子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。
    • 在这里插入图片描述
  • 最小生成树: 对于连通网来说,边是带权值的,生成树的各边也带权值,于是就把生成树各边的权值总和称为生成树的权,把权值最小的生成树称为最小生成树。
    • 求最小生成树的两种算法: 普里姆算法、 克鲁斯卡尔算法。
    • 在这里插入图片描述

3.7.2 普里姆算法

在这里插入图片描述

3.7.3 克鲁斯卡尔算法

在这里插入图片描述

第四章 操作系统基础

4.1 进程管理

4.1.1 操作系统的基本概念

  • 操作系统的定义:能有效地组织和管理系统中的各种软/硬件资源,合理地组织计算机系统的工作流程,控制程序的执行,并且向用户提供一个良好的工作环境和友好的接口。
  • 操作系统两个重要的作用:
    • (1) 通过资源管理提高计算机系统的效率;
    • (2) 改善人机界面向用户提供友好的工作环境
  • 操作系统的4个特征
    • 并发性
    • 共享性
    • 虚拟性
    • 不确定性
  • 操作系统的五大功能
    • 进程管理
    • 文件管理
    • 存储管理
    • 设备管理
    • 作业管理
  • 需要会看进程资源图
    • 在这里插入图片描述
    • 对于a
      • R1有2个资源,R2有3个资源 (几个圆圈
      • R1还有0个资源,R2还有0个资源(几个往外的箭头
      • 所以P1阻塞,P2阻塞(看P的往外的箭头,若指向无资源的R,则阻塞
      • 该图不可化简,是死锁的(看是否有非阻塞节点P,如有可以把非阻塞节点P的所有箭头删除
    • 对于b
      • R1有2个资源,R2有3个资源
      • R1还有0个资源,R2还有1个资源
      • 所以P1非阻塞,P2阻塞,P3非阻塞
      • 该图可化简,是非死锁的

4.1.2 进程的状态转换

  • 运行:当一个进程在处理机上运行时,则称该进程处于运行状态。
  • 就绪:一个进程获得了除处理机外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。
  • 阻塞:也称等待睡眠状态,一个进程正在等待某一事件发生而暂时停止运行。
    在这里插入图片描述

4.1.3 进程的基本概念

  • 进程是程序的一次执行。
  • 进程通常是由程序. 数据和进程控制块(PCB) 组成的。
  • 进程是资源分配和独立运行的基本单位,进程两个基本属性
    • 可拥有资源的独立单位
    • 可独立调度和分配的基本单位

4.1.4 进程间的同步与互斥

  • 进程间的同步:是指在系统中一些需要相互合作,协同工作的进程,这样的相互联系称为进程的同步。
  • 进程间的互斥:是指系统中多个进程因争用临界资源而互斥执行。
  • 临界资源:是指有些资源一次只能供一个进程使用。如打印机. 共享变量等。

4.1.5 信号量机制(P. V操作)

  • 信号量是一个整型变量,根据控制对象的不同被赋予不同的值。
    • (1) 公用信号量:实现进程间的互斥,初值为1或资源的数目。
    • (2) 私用信号量:实现进程间的同步,初值为0或某个正整数。
  • 信号量S的物理意义:S≥0表示某资源的可用数,S<0,则其绝对值表示阻塞队列中等待该资源的进程数。
  • PV操作是实现进程同步与互斥的常用方法,P操作和V操作是低级通信原语,在执行期间不可分割。其中,P操作表示申请一个资源,V操作表示释放一个资源。
  • P操作
    • P操作的定义:S=S-1,若S≥0,则执行P操作的进程继续执行; 若S<0,则置该进程为阻塞状态(因为无可用资源),并将其插入阻塞队列。
    • P操作可以理解为:
if((S=S-1)0)
继续执行本进程
else //(S=S-1)<0
挂起本进程(本进程等待),转到另一个进程
  • 1
  • 2
  • 3
  • 4
  • V操作
    • V操作定义:S=S+1,若S>0,则执行V操作的进程继续执行; 若S≤0,则从阻塞状态唤醒一个进程,并将其插入就绪队列,然后执行V操作的进程继续。
    • P操作可以理解为:
if ((S=S+1)>0)
不唤醒队列中的等待进程,继续执行本进程
else //(S=S+1)≤0
唤醒队列中的等待进程,同时继续执行本进程
  • 1
  • 2
  • 3
  • 4
  • 需要会看PV图
    • 在这里插入图片描述
    • 前趋图可以看出
      • P1 完成开始P2,P2完成开始P3、P4,(P3、P4)完成开始P5
    • 所以(这里可以简单理解v是通知,p是获取,方便做题)
      • a:V(S1)
      • b:P(S1)
      • c:V(S2)、V(S3)
      • d:P(S2)
      • e:V(S4)
      • f:P(S3)
      • g:P(S4)、P(S5)

4.1.6 生产者消费者问题

  • 生产者进程P1不断地生产产品送入缓冲区,消费者进程P2不断地从缓冲区中取产品消费。
    在这里插入图片描述

4.1.7 进程调度

  • 高级调度:又称“长调度”“作业调度”或“接纳调度”,它决定处于输入池中的哪个后备作业可以调入主系统做好运行的准备,成为一个或一组就绪进程。
  • 中级调度:又称“中程调度”或“对换调度”,它决定于交换区中的哪个就绪进程可以调入内存,以便直接参与对CPU的竞争。
  • 低级调度:又称“短程调度”或“进程调度”,它决定处于内存中的哪个就绪进程可以占用CPU。低级调度是操作系统中最活跃. 最重要的调度程序,对系统的影响很大。
    在这里插入图片描述
  • 4种常用的进程调度算法:
    • (1) 先来先服务:有利于长作业,不利于短作业; 有利于CPU繁忙的作业,不利于I/O繁忙的作业。主要用于宏观调度。
    • (2) 时间片轮转:主要用于微观调度,通过时间片轮转提高进程并发性和响应时间特性,从而提高资源的利用率。
    • (3) 优先级调度:让每一个进程都拥有一个优先数,数值大的表示优先级高,系统在调度时总选择优先数大的占用CPU。分为静态优先级和动态优先级两种。
    • (4) 多级反馈调度:是时间片轮转算法和优先级算法的综合与发展。优点有:
      • 第一,照顾了短进程以提高系统吞吐量,缩短了平均周转时间;
      • 第二,照顾I/O型进程以获得较好的I/O设备利用率和缩短响应时间;
      • 第三,不必估计进程的执行时间,动态调节优先级。

4.1.8 死锁

  • 死锁:是指两个以上的进程互相都要求对方已经占有的资源导致无法继续运行下去的现象。
  • 例:现有5个进程,每个进程都需要4个资源,而系统一共有15个资源,会发生死锁吗?在这里插入图片描述
  • 系统中共有n个进程共享同一类资源,当每个进程都需要k个资源时,至少需要多少个资源才不会发生死锁?
    • 至少需要资源:M =(k-1)×n+1
  • 产生死锁的4个必要条件:互斥条件. 请求保持条件. 不可剥夺条件、环路条件
  • 死锁的处理策略有:鸵鸟策略. 预防策略. 避免策略和检测与解除死锁
  • 死锁预防:采用某种策略限制并发进程对资源的请求。
  • 死锁避免:如银行家算法。
  • 死锁检测:系统定时地运行一个程序来检测是否发生死锁,若有,则设法加以解除。
  • 死锁解除:有资源剥夺法和撤销进程法。

4.1.9 线程

  • 进程两个基本属性:可拥有资源的独立单位; 可独立调度和分配的基本单位
  • 引入线程后:线程作为调度和分配的基本单位,进程作为独立分配资源的单位。
  • 一个进程中有多个线程,共享该进程的资源。
  • 线程分为用户级线程和内核支持线程。
  • 用户级线程不依赖于内核。该类线程的创建. 撤销和切换都不利用系统调用来实现。
  • 内核支持线程依赖于内核。该类线程的创建. 撤销和切换都利用系统调用来实现。
  • 线程是进程中的一个实体,是被系统独立分配和调度的基本单位,线程基本上不拥有资源,只拥有一点运行中必不可少的资源(如程序计数器. 一组寄存器和栈),它可与同属一个进程的其他线程共享进程所拥有的全部资源。
  • 线程也具有就绪. 运行和阻塞3种基本状态,由于线程具有传统进程所具有的特性,故称为“轻型进程” ; 传统进程称为“重型进程” 。线程可创建另一个线程,同一个进程中的多个线程可并发执行。

4.2 存储管理

4.2.1 基本概念

  • 逻辑地址(虚拟地址. 相对地址) :
    • 程序员使用的地址只是用符号命名的一个地址,称为符号名地址,这个地址并不是主存中真实存在的地址。
  • 物理地址(绝对地址
    • 是主存中真实存在的地址。
  • 存储器的层次结构
    • 在这里插入图片描述

4.2.2 地址重定位

  • 一个程序,没有运行时,存储在外存,程序运行时,需要装载到内存中,就需要把程序中的指令和数据的逻辑地址转换为对应的物理地址,这个转换的过程称为地址重定位。
  • 静态重定位:在程序装入主存时已经完成了逻辑地址到物理地址的变化,在程序的执行期间不会再发生变化。
  • 动态重定位:在程序运行期间完成逻辑地址到物理地址的变换。

4.2.3 分区存储管理

  • 把主存划分成若干个区域,每个区域分配给一个作业使用。这就是分区存储管理方式。分为固定分区. 可变分区和可重定位分区。
    • 固定分区:系统生成时已经分好区。
    • 可变分区:是一种动态分区方式,存储空间的划分是在作业装入时进行的,故分区的个数是可变的,分区的大小刚好等于作业的大小。
    • 可重定位分区:分配好的区域可以移动。
      在这里插入图片描述

4.2.4 分页存储管理

  • 分页原理:
    • 将进程的地址空间划分成若干个大小相等的区域,称为
    • 将主存的空间也划分成与页相同大小的若干个物理块,称为页框
    • 在为进程分配主存时,将进程中若干页分别装入多个不相邻接的块中。
  • 地址结构:
    • 在这里插入图片描述
  • 页表:
    • 当进程的多个页面离散地分配到主存的多个物理块时,系统应能保证在主存中找到进程要访问的页面所对应的物理块,为此,系统为每个进程建立了一张页面映射表,简称页表。
      在这里插入图片描述
      在这里插入图片描述

4.2.5 分段存储管理

  • 在分段存储管理中,将用户程序或作业的地址空间按内容划分为段,比如主程序一段,子程序一段,数据专门放一段,每个段的长度是不等的,但是每个段占用一个连续的分区。进程中的各个段可以离散地分配到主存的不同分区中。在系统中为每个进程建立一张段映射表,简称为“段表” 。
  • 在这里插入图片描述在这里插入图片描述

4.2.6 段页式存储管理

  • 先将整个主存划分成大小相等的存储块(页框),将用户程序按程序的逻辑关系分为若干个段,然后再将段划分成页。
  • 段页式系统中同时有段表和页表
    • 段表:段号. 页表始址. 页表长度。
    • 页表:页号. 物理块号。
    • 逻辑地址:段号. 段内页号. 页内地址
    • 物理地址:块号. 页内地址
  • 在这里插入图片描述
  • 在这里插入图片描述

4.2.7 虚拟存储管理

  • 程序局部性原理:程序在执行时将呈现出局部性规律,即在一段时间内,程序的执行仅限于某个部分,它所访问的存储空间也局限于某个区域内。
    • (1) 时间局限性:程序中的某条指令一旦执行,则不久的将来很有可能再次被访问; 某个存储单元如果被访问,不久的将来它很可能再次被访问。
    • (2) 空间局限性:一旦程序访问了某个存储单元,则不久的将来,其附近的存储单元也最有可能被访问。
  • 如果我们运行程序的时候,允许将作业的一部分装入主存即可运行程序,而其余部分可以暂时留在磁盘上,等需要的时候再装入主存。这样一来,一个小的主存空间就可以运行比它大的一个作业。从用户角度看,系统具有的主存容量比实际的主存容量要大得多,称为虚拟存储器。

4.2.8 请求分页系统的实现

  • 在纯分页的基础上增加了请求调页功能,页面置换功能。
  • 在请求分页系统中,每当所要访问的页面不在主存时便产生一个缺页中断。
  • 在这里插入图片描述

4.2.9 页面置换算法

  • 最佳置换算法
    • 是一种理想化的算法,即选择那些是永不使用的,或者是在最长时间内不再被访问的页面置换出去。
  • 先进先出置换算法(FIFO)
    • 优先淘汰最先进入主存的页面,也就是在内存中停留时间最长的页面。
  • 最近最少未使用算法(LRU)
    • 优先淘汰最近这段时间用得最少的页面。系统为每一个页面设置一个访问字段,记录这个页面自上次被访问以来所经历的时间T,当要淘汰一个页面时,选择T最大的页面。
  • 最近未用置换算法(NUR)
    • 优先淘汰最近一段时间未引用过的页面。系统为每一个页面设置一个访问位,访问位为1代表访问过,为0代表没有被访问过,置换页面时选择访问位为0的置换出去。

4.3 设备管理

4.3.1 I/O设备管理软件

  • 设备管理的目标主要是如何提高设备的利用率,即提高CPU与I/O设备之间的并行操作速度,并为用户提供方便. 统一的界面。
  • 为了提供设备的利用率,我们采用了“分层构造” 的思想,即把设备管理软件组织成为一系列的层次。
  • 主要分为4层:中断处理程序. 设备驱动程序. 与设备无关的系统软件和用户级软件
  • 各层之间既相互独立,又彼此协作。
    在这里插入图片描述
  • 例:某用户进程现在需要读取硬盘中的数据。
    • ① 与设备无关软件检查高速缓存中有没有要读的数据块,如果有,则直接从高速缓存中调取; 如果没有,则调用设备驱动程序,向I/O硬件发出一个请求。
    • ② 用户进程转为阻塞状态,等待磁盘操作的完成。磁盘操作完成时,硬件产生一个中断,转入中断处理程序。
    • ③ 中断处理程序检查中断的原因,认识到这时磁盘读取数据的操作已经完成,于是唤醒用户进程取回从磁盘读取的信息,此次I/O请求结束。
    • ④ 用户进程得到了需要读取的数据内容,由阻塞转为就绪状态,继续运行。

4.3.2 设备管理采用的相关技术

  • 通道技术
  • DMA技术
  • 缓冲技术
  • Spooling技术
    • 目的:缓和CPU的高速性和I/O设备的低速性之间的矛盾。
    • 原理:Spooling技术引入了两个程序,分别实现脱机输入输出操作。预输入程序将输入设备上的数据通过输入缓冲区再传输到高速磁盘的输入井; 缓输出程序将高速磁盘中输出井中的数据通过输出缓冲区传输到输出设备。CPU读写数据只需要在高速磁盘上进行,大大提高了工作效率。而且输入输出操作与CPU数据的处理同时进行,这种在联机情况下实现的输入输出与CPU工作并行的技术叫做Spooling或假脱机操作。
    • 在这里插入图片描述

4.3.3 磁盘调度算法

在这里插入图片描述

  • 磁盘调度分为移臂调度和旋转调度两类,先进行移臂调度,再进行旋转调度磁盘调度目标是使磁盘的平均寻道时间最少
  • 读取磁盘数据的时间 = 寻道时间 + 旋转延迟 + 数据传输时间
  • 移臂调度算法
    • 先来先服务:根据进程请求的先后次序进行调度。保证所有进程的请求都得到回应,但是平均寻道时间可能很长。
    • 最短寻道时间优先:选择访问的磁道与当前磁头所在的磁道距离最近的,使得每次的寻道时间最短。
    • 扫描算法(类似电梯调度) :不仅考虑到要访问的磁道与当前磁道的距离,更优先考虑的是磁头当前的移动方向。
    • 单向扫描调度算法:在扫描算法的基础上,规定磁头只做单向移动
  • 旋转调度算法:
    • 如果进程请求访问的是不同编号的扇区(无论是否在同一磁道),则总是让首先到达磁头位置下的扇区先进行读写操作。
    • 如果进程请求访问的是相同编号的扇区(无论是否在同一磁道),旋转调度时可以任选一个扇区进行读写操作。

4.4 文件管理与作业管理

4.4.1 文件的结构和组织

  • 文件的逻辑结构:从用户角度看到的文件组织形式就是文件的逻辑结构,但实际上这些文件在内存上的存放方式可能并不是这样的。
    • 有结构的记录式文件
    • 无结构的流式文件
  • 文件的物理结构:从实现的角度看,文件在存储器上的存放方式。
    • 连续结构
    • 链接结构
    • 索引结构
    • 多个物理块的索引表

4.4.2 文件的目录结构

  • 一级目录结构
    • 只有一张目录表,不允许重名,查找速度慢,不能实现文件共享。
  • 二级目录结构
    • 由主文件目录和用户目录组成。
  • 多级目录结构
    • 我们熟悉的Windows系统,以及UNIX系统都采用这种多级目录结构。
  • 绝对路径
    • 是指从根目录“\” 开始的完整文件名,即它是由从根目录开始的所有目录名以及文件名构成。
  • 相对路径
    • 是从当前工作目录下的路径名。
  • 下图选 c、a
    在这里插入图片描述

4.4.3 文件存储空间的管理

  • 在将文件保存到外存时,我们首先要知道哪些存储空间是“占用” 的,哪些存储空间是“空闲” 的。因此我们需要对磁盘空间进行管理。

  • 常用的空闲空间的管理方法有空闲区表. 位示图. 空闲块链和成组链接法

  • 空闲区表

    • 操作系统为磁盘的所有空闲区建立一张空闲表。它适用于连续文件结构。
    • 在这里插入图片描述
  • 位示图

    • 在外存上建立一张位示图(bitmap),记录文件存储器的使用情况。每一位对应文件存储器上的一个物理块,0表示空闲,1表示占用。
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 空闲块链

    • 每一个空闲物理块中设置一个指针,它指向下一个空闲物理块,所有空闲物理块构成一个链表,链表的头指针放在文件存储器的一个特定位置上(如管理块中)。
  • 成组链接法

    • 在系统中将空闲块分成若干个组,每100个空闲块为一组,每组的第一个空闲块登记了下一组空闲块的物理盘块号和空闲块总数。

4.4.4 作业调度算法

  • 先来先服务
    • 按作业到达的先后顺序进行调度。
  • 短作业优先
    • 按作业运行时间的长短进行调度,即启动要求运行时间最短的作业。
  • 响应比高优先
    • 响应比高的作业优先启动。响应比:RP = 作业响应时间/作业执行时间=(作业等待时间+作业执行时间) /作业执行时间
  • 优先级调度算法
    • 按照系统设定的优先级或者用户指定的优先级,优先级高的先调度。
  • 均衡调度算法
    • 根据系统的运行情况和作业本身的特性对作业进行分类,力求均衡地使用系统的各种资源,即注意发挥系统效率,又使用户满意。
  • 在这里插入图片描述

第五章 网络基础知识

5.1 计算机网络概述与网络硬件基础

5.1.1 计算机网络的分类

  • 局域网(LAN):传输距离有限,传输速度高,以共享网络资源为目的的网络系统。
  • 城域网(MAN):规模介于局域网和广域网之间的一种较大范围的高速网络,一般覆盖临近的多个单位和城市。
  • 广域网(WAN):又称远程网,它是指覆盖范围广. 传输速率相对较低. 以数据通信为主要目的的数据通信网。
    在这里插入图片描述

5.1.2 网络拓扑结构

  • 概念:是指网络中通信线路和节点的几何顺序,用以表示整个网络的结构外貌,反映各节点之间的结构关系。

  • 常见的网络拓扑结构有总线型. 星型. 环型. 树型和分布式结构等。

  • 总线型

    • 结构简单,节点的增. 删和位置的变动较容易。因此系统的扩充性能好。
    • 缺点:负载重时,线路的利用率较低。网络延迟时间不确定,故障隔离和检测困难
    • 在这里插入图片描述
  • 星型

    • 特点
      • 维护管理容易,重新配置灵活;
      • 故障隔离和检测容易; 网络延迟时间短;
      • 各节点与中央交换单元直接连通,各节点之间通信必须经过中央单元转换;
    • 缺点:
      • 网络共享能力差;
      • 线路利用率低,中央单元负荷重。
    • 在这里插入图片描述
  • 环型

    • 特点
      • 环型网中信息的流动方向是固定的,两个节点仅有一条通路,路径控制简单;
      • 有旁路设备,节点一旦发生故障,系统自动旁路,可靠性高; 结构简单,节点的增. 删和位置的变动较容易。
    • 缺点
      • 信息要串行穿过多个节点,在网中节点过多时传输效率低,系统响应速度慢;
      • 由于环路封闭,扩充较难
    • 在这里插入图片描述
  • 树型

    • 特点:同总线型结构
    • 在这里插入图片描述
  • 分布式

    • 特点
      • 分布式网络具有较高的可靠性,当一条线路有故障时,不会影响整个系统工作;
      • 资源共享方便,网络响应时间短;
    • 缺点
      • 由于节点与多个节点连接,故节点的路由选择和流量控制难度大
      • 管理软件复杂,硬件成本高。

5.1.3 网络互连设备

在这里插入图片描述

5.1.3.1 物理层
  • 中继器:
    • 它是在物理层上实现局域网网段互连的,用于扩展局域网网段的长度。
    • 在以太网中最多只能使用4个中继器。
  • 集线器:
    • 可以看成是一种特殊的多路中继器,其优点是当网络系统中某条线路节点出现故障时,不会影响网上其他节点的正常工作。
    • 分为无源和有源。无源集线器不对信号作任何处理,只负责将多段介质连接在一起。有源集线器对传输信号进行再生和放大。
5.1.3.2 数据链路层
  • 网桥
    • 用于连接两个局域网网段,对帧进行过滤。
    • 过滤帧:网桥检查帧的源地址和目的地址,如果不在同一网段上,就把帧转发到另一个网段上,如果在,则不转发。
    • 隔离不同网段:将不同楼层的网络分成不同的网络段,段中间用网桥连接,这样可以缓解网络通信繁忙的程度,提高通信效率; 另外还可以提高网络的可靠性,一个网络段发生故障不会影响另一个网络段
  • 交换机
    • 按MAC地址(物理地址) 进行数据转发,比网桥的转发性能要高,数据延迟要小。
    • 交换机的工作过程:从某一节点收到帧后,在其内存的MAC地址表(端口号-MAC地址) 中进行查找,确认该MAC地址的网卡连接在哪一个节点,然后将帧转发至该节点。如果没有找到该MAC地址,就将数据包广播到所有节点,拥有该MAC的网卡收到广播后做出应答,交换机将该MAC地址添加到MAC地址列表中。
    • 交换机有三种交换技术:端口交换. 帧交换和信元交换。
5.1.3.3 网络层
  • 路由器
    • 用于连接多个逻辑上分开的网络,例如不同的子网。
    • 路由器具有很强的异种网互连能力。例如:即使两个互连的网络最低两层的协议不同,也可通过支持多协议的路由器进行连接。
    • 路由器最主要的功能是选择路径。在路由器的存储器中维护着一个路径表,记录各个网络的逻辑地址,用于识别其他网络。
    • 路由器的工作过程:收到某个网络向另一个网络发送的信息包时,打开信息包,并解读信息包中的数据,获得目的网络的逻辑地址(IP地址),使用复杂的程序决定该由哪条路径发送最合适,然后重新打包并转发出去。
  • 三层交换机
    • 不仅包括所有交换机的功能,还包含了网络层的部分功能。一次路由,多次交换。
    • 工作原理:可以总结为“一次路由,多次交换” 。当三层交换机第一次收到一个数据包时必须通过路由功能寻找转发端口,同时记住目标MAC地址和源MAC地址,以及其他相关信息,当再次收到目标地址和源地址相同的帧时就直接进行交换了,不再调用路由功能。三层交换机不但具有路由功能,而且比通常的路由器转发得更快。
5.1.3.4 应用层
  • 网关
    • 主要功能是进行协议转换。
    • 当要连接不同类型而协议差别又较大的网络时,要选用网关设备。它可以将协议进行转换,并将数据重新分组,以便在两个不同类型的网络之间进行通信。

5.1.4 网络传输介质

  • 双绞线
  • 同轴电缆
  • 光纤
  • 微波
  • 红外线和激光
  • 卫星通信

5.2 网络的协议与标准

  • 对比
    在这里插入图片描述

5.2.1 OSI参考模型

在这里插入图片描述

5.2.2 TCP/IP协议簇

  • TCP/IP协议是Internet的核心协议,是迄今为止发展最为成熟的互联网络协议系统。
  • TCP/IP包含以下五个特性
    • 逻辑编址
      • 每一台连入互联网的设备都要分配一个IP地址,一个IP地址包含网络号,子网络号和主机号,因此可以通过IP地址很方便地找到对应的设备。
    • 路由选择
      • 在TCP/IP协议中包含了专门用于定义路由器如何选择网络路径的协议,即IP数据包的路由选择。
    • 域名解析
      • 为了方便用户记忆,专门设计了一种更方便的字母式地址结构,称为域名。将域名映射为IP地址的操作,称为域名解析。
    • 错误检测与流量控制
      • TCP/IP协议可以检测数据信息的传输错误,确认已传递的数据信息已被成功接收,监测网络系统中的信息流量,防止出现网络拥塞。
5.2.2.1 TCP/IP协议簇–网际层协议
  • IP
    • IP所提供的服务通常被认为是无连接的和不可靠的,它将差错检测和流量控制之类的服务授权给了其他的各层协议,这正是TCP/IP能够高效率工作的一个重要保证。
    • 其主要功能包括:
      • (1) 将上层数据(TCP/UDP数据) 或同层的其他数据(如ICMP数据) 封装到IP数据报中;
      • (2) 将IP数据报传送到最终目的地;
      • (3) 为了使数据能够在链路层上进行传输对数据进行分段;
      • (4) 确定数据报到达其他网络中的目的地的路径
  • ARP和RARP
    • ARP负责将IP地址转换为物理地址(MAC地址)
    • RARP负责将物理地址转换为IP地址。
    • 网络中的任何设备(主机. 路由器和交换机等) 均有唯一的物理地址,该地址通过网卡给出,每个网卡出厂后都有不同的编号,即用户所购买的网卡有着唯一的物理地址。而IP协议又使用了IP地址,因此,在数据传输过程中,必须对IP地址和物理地址进行相互转换。
  • ICMP(网络控制信息协议)
    • 是一个专门用于发送差错报文的协议。由于IP是一种尽力传送的协议,传送的数据报有可能丢失. 重复. 延迟或乱序,因此IP需要一种避免差错并在发生差错时报告的机制。
    • 主要功能有:通告网络故障. 通告网络拥堵. 协助解决故障。
5.2.2.2 TCP/IP协议簇–传输层协议
  • TCP
    • TCP提供了一个可靠的. 面向连接的. 全双工的数据传输服务。
    • 它采用了一种叫做“重发” 的技术。即在TCP传输过程中,发送方启动一个定时器,然后传输数据包,接收方收到后给发送方发送一个“确认” 信息,如果超过时间发送方还没有收到确认信息,就重新发送这个数据包。
    • 利用TCP建立和关闭连接时,均需要通过三次握手。
      • 1) 源主机发送一个数据包,表示想与目的主机进行通信。
      • 2) 目的主机发送一个确认进行响应,表示愿意进行通信。
      • 3) 源主机再发送一个确认来响应,该确认中可包含真正要发送的数据包。
    • TCP协议一般用于传输数据量比较少,且对可靠性要求高的场合。
  • UDP
    • UDP是一种不可靠的. 无连接的协议,可以保证应用程序进程间的通信。
    • UDP的主要作用是将UDP消息展示给应用层,它并不负责重新发送丢失的或出错的数据信息,不对接收到的无序IP数据报重新排序,不消除重复的IP数据报,不对已收到数据进行确认,也不负责建立或终止连接。
  • 总结
    • TCP面向连接的. 可靠的,但是它是以牺牲通信量来实现的,也就是会降低传输速率。如果传输的数据量不多,对传输速度要求不高,但是对可靠性要求较高的时候,则用TCP。
    • UDP无连接的. 不可靠的,但是它可以实现高速传输。如果传输的数据量大,要求传输速度快,但对可靠性要求不高,或者已知网络是可靠的情况下,可以用UDP。
5.2.2.3 ==TCP/IP协议簇–应用层协议 ==
  • TFTP(Trivial File Transfer Protocol 简单文件传输协议)
    • 是用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂. 开销不大的文件传输服务。
    • 建立在UDP之上,提供不可靠的数据流传输服务,不提供存取授权与认证机制,使用超时重传方式来保证数据的到达。
  • FTP(File Transport Protocol 文件传输协议)
    • 是网络上两台计算机传送文件的协议。
    • 运行在TCP之上,是通过Internet将文件从一台计算机传输到另一台计算机的一种途径。
    • FTP在客户机与服务器之间需要建立两条TCP连接,一条用于传送控制信息(使用21端口),另一条用于传送文件内容(使用20端口) 。
  • SFTP(SSH File Transfer Protocol 安全文件传输协议)
    • 一种通过网络传输文件的安全方法,它要求客户端用户必须由服务器进行身份验证,并且数据传输必须通过安全通道(SSH) 进行,不传输明文密码或文件数据。
    • 建立在TCP之上,默认端口号22
  • Telnet(远程登录协议)
    • 将用户计算机与远程主机连接起来,在远程计算机上运行程序,将相应的屏幕显示传送到本地机器,并将本地的输入送给远程计算机。
    • 建立在TCP之上,使用23端口。
  • HTTP(Hypertext Transfer Protocol 超文本传输协议)
    • 是用于从WWW服务器传输超文件到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。
    • 建立在TCP之上
  • HTTPS(Hypertext Transfer Protocol Secure 超文本传输安全协议)
    • 是以安全为目标的HTTP通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。
    • HTTPS在HTTP的基础上加入SSL(安全套接层) 。
  • DHCP(Dynamic Host Configuration Protocol 动态主机配置协议)
    • 自动分配IP地址
    • 建立在UDP之上。
  • DNS(Domain Name System 域名系统)
    • 进行域名解析的,域名虽然便于人们记忆,但是机器只能识别IP地址,它们之间的转换工作称为域名解析。
  • SNMP(Simple Network Management Protocol 简单网络管理协议)
    • 是一种用于网络设备管理的协议,它允许网络管理员监视. 配置和控制网络中的设备,以确保网络的正常运行和性能优化。
    • 建立在UDP之上。
  • SMTP(Simple Mail Transfer Protocol 简单邮件传输协议)
    • 是一种提供可靠且有效的电子邮件传输协议,主要用于传输系统之间的邮件信息,并提供与电子邮件有关的通知。
    • 建立在TCP之上,端口号25。
    • 与电子邮件相关的协议还有POP3(端口号110) . IMAP

5.3 Internet基础知识

5.3.1 域名

  • 域名的格式
    • 计算机主机名.本地名.组名.最高层域名
    • 例:
      • www.hust.edu.cn
      • www.cnnic.net.cn
      • www.5566.net
      • www.sina.com
  • URL的格式
    • 协议://主机.域名[:端口号]/路径/文件名
    • 例:
      • http://210.42.87.56:80/ducument/admin/a1/index.html
      • https://www.abc.com:443/text/a2/login.htm
      • ftp://ftp.hust.edu.cn/a3/img/b4.jpg
  • https是一种通过计算机网络进行安全通信的传输协议,经由http进行通信,利用SSL/TLS建立全
    信道,加密数据包。https使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的
    隐私与完整性。

5.3.2 IP地址

  • IP地址的格式
    • 一个IP地址占4字节(32位),转成十进制后,为4个十进制数字,中间用“.” 隔开。每个十进制数字的取值范围为0~255。
    • 129.102.4.11 → 10000001 01100110 00000100 00001011
  • IP地址的分类
    • IP地址可以分为5类:A类. B类. C类. D类. E类。
    • 在这里插入图片描述

5.3.3 子网掩码

  • 子网掩码
    • 用于区分网络号和主机号。
    • 子网掩码是结合IP地址来看的,单独的子网掩码没有意义,它是用来识别具体的IP地址中哪些是网络号,哪些是主机号。
    • 子网掩码中,网络号用1表示,主机号用0表示。例如,C类IP地址的子网掩码默认为255.255.255.0,即:
      11111111 11111111 11111111 00000000

在这里插入图片描述

  • 该网络中最多可以有26-2台主机(主机号全0和全1有特殊用途,不可以做为主机地址,故减去) 。
  • 我们可以看到:子网掩码中,左边连续为1的位数就是网络地址,右边连续为0的就是主机地址。子网掩码并不一定都是刚刚那样的格式,我们还可以使用可变长子网掩码(VLSM) 。
  • :如果子网172.6.32.0/20被划分为子网172.6.32.0/26
    • 则被划分为(2的6次方)个子网 (6=26-20)
    • 每个子网有(2的6次方-2)个主机地址(6=32-26)

5.3.4 IPv6

  • 现在的IP协议的版本号为4,所以也称之为IPv4,IPv4的IP地址共32位,4个字节,最多可以有232个IP地址。
  • IPv6的地址空间为128位,共16个字节,理论上最多可以有2128个IP地址。
  • IPv6采用冒号十六进制记法。16位为一组,用相应的十六进制表示,各组之间用“:” 分隔。
    • 例如:686E:8C64:FFFF:FFFF:0:1180:96A:FFFF
  • 允许0压缩,即一连串的0可以用一对冒号表示
    • 如:FF05:0:0:0:0:0:0:B3FF05::B3
  • IPv6还可以和IPv4结合使用
    • 如:0:0:0:0:0:0:128.10.1.1::128.10.1.1

5.3.5 Internet服务

  • 使用各类Internet服务时,可以使用端口号进行区分,TCP和UDP协议的端口号为16位,支持065535的端口号。其中01023为公共端口,1024~65535需要注册登记。
    1. 域名服务(DNS)
    1. 远程登陆服务(Telnet)
    1. 电子邮件服务
    1. 万维网服务(WWW)
    1. 文件传输服务(FTP) 。

5.4 信息安全与网络安全

5.4.1. 常见的网络攻击技术

  • 主动攻击与被动攻击
    • 主动攻击
      • 主动攻击会导致某些数据流被篡改或者产生虚假的数据流。如:篡改消息、伪造消息、重放和拒绝服务。
    • 被动攻击
      • 与主动攻击不同的是,被动攻击中攻击者并不对数据信息做任何修改,也不产生虚假的数据流。如窃听、流量分析等攻击方式。
  • 具体攻击技术
  • 篡改消息
    • 是指一个合法消息的某些部分被修改、删除、延迟、重新排序等。
    • 如修改传输消息中的数据,将“允许甲执行操作” 改为“允许乙执行操作” 。
  • 伪造(伪装、假冒)
    • 是指某个实体假扮成其他实体,从而以欺骗的方式获取一些合法用户的权利和特权。
  • 重放
    • 是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。
  • 拒绝服务(DOS)
    • 是指攻击者不断地对网络服务系统进行干扰,改变其正常的作业流程,执行无关程序使系统响应减慢甚至瘫痪,影响正常用户的使用,甚至使合法用户被排斥而不能进入计算机网络系统或不能得到相应的服务。
  • 窃听(截取)
    • 是指攻击者在未经用户同意和认可的情况下获得了信息或相关的数据。
  • 流量分析(通信量分析)
    • 是指攻击者虽然从截获的消息中无法得到消息的真实内容,但攻击者还是能通过观察这些数据报的模式,分析确定出通信双方的位置、通信的次数及消息的长度,获知相关的敏感信息。
  • 字典攻击
    • 一种破解用户密码或密钥的一种攻击方式。事先将所有可能的密码口令形成一个列表(字典),在破解密码或密钥时,逐一将字典中的密码口令(或组合) 尝试进行匹配。
  • 社会工程学攻击
    • 是指通过与他人进行合法的交流,来使其心理受到影响,做出某些动作或者是透露一些机密信息的方式。这通常被认为是一种欺诈他人以收集信息、行骗和入侵计算机系统的行为。
  • SQL注入攻击
    • 把SQL命令插入Web表单的输入域或页面的请求查找字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响) 动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
  • 会话劫持
    • 是指攻击者在初始授权之后建立一个连接,在会话劫持以后,攻击者具有合法用户的特权权限。例如,一个合法用户登录一台主机,当工作完成后,没有切断主机。然后,攻击者乘机接管,因为主机并不知道合法用户的连接已经断开,于是,攻击者能够使用合法用户的所有权限。典型的实例是“TCP会话劫持” 。
  • 漏洞扫描
    • 是一种自动检测远程或本地主机安全漏洞的软件,通过漏洞扫描器可以自动发现系统的安全漏洞。
  • 缓冲区溢出
    • 攻击者利用缓冲区溢出漏洞,将特意构造的攻击代码植入有缓冲区漏洞的程序之中,改变漏洞程序的执行过程,就可以得到被攻击主机的控制权。

5.4.2. 安全的分类

  • 物理安全
    • 物理安全是保护计算机网络设备、设施以及其他媒体免遭地震、水灾、火灾等环境事故及人为操作失误及各种计算机犯罪行为导致的破坏。主要是场地安全与机房安全。
  • 网络安全
    • 与网络相关的安全。
  • 系统安全
    • 主要指操作系统的安全。
  • 应用安全
    • 与应用系统相关的安全。

5.4.3. 防火墙技术

  • 防火墙阻挡对网络的非法访问和不安全数据的传递,使得本地系统和网络免于受到许多网络安全威胁。防火墙主要用于逻辑隔离外部网络与受保护的内部网络。
  • 防火墙技术经历了包过滤、应用代理网关和状态检测技术三个发展阶段。
  • 包过滤防火墙
    • 处于网络层和数据链路层,一般有一个包检查块(包过滤器),通过该检查模块,对每一个传入和传出网络的IP包打开进行检查,例如源地址、目的地址、协议和端口等,对于不符合包过滤规则的包进行记录,发出报警并丢弃该包。
    • 优点
      • (1)过滤型的防火墙通常直接转发报文,它对用户完全透明,速度较快
      • (2)包过滤通常被包含在路由器数据包中,所以不需要额外的系统来处理。
    • 缺点
      • (1) 它可以控制站点与网络之间的相互访问,但不能控制传输数据的内容,因为内容是应用层数据。
      • (2) 访问控制粒度太粗糙,不能防范黑客攻击,不能处理新的安全威胁。
  • 应用代理网关防火墙
    • 能彻底隔断内网与外网的直接通信,内网用户对外网的访问变成了防火墙对外网的访问,然后再由防火墙转发给内网用户。
    • 所有通信都必须经应用层代理软件转发,访问者任何时候都不能与服务器建立直接的TCP连接,应用层的协议会话过程必须符合代理的安全策略要求。
    • 优点
      • 可以检查应用层、传输层和网络层的协议特征,对数据包的检测能力比较强。
    • 缺点
      • 难以配置,处理速度非常慢。
  • 状态检测技术防火墙
    • 它结合了代理防火墙的安全性和包过滤防火墙的高速等优点,在不损失安全性的基础上,提高了代理防火墙的性能。
    • 状态监测不仅仅根据规则表来检查每一个进出的包,更考虑了数据包是否符合会话所处的状态,因此提供了完整的对传输层的控制能力,同时也改进了流量处理速度。
    • 因为它采用了一系列优化技术,使防火墙性能大幅度提升,能应用在各类网络环境中,尤其是在一些规则复杂的大型网络上。

5.4.4. 入侵检测与防御

  • 入侵检测与防御技术主要有两种
    • 入侵检测系统(IDS)
      • 注重的是网络安全状况的监管,通过监视网络或系统资源,寻找违反安全策略的行为或遭到入侵攻击的迹象,并发出报警。因此绝大多数IDS系统都是被动的。
    • 入侵防御系统(IPS)
      • 是在入侵检测系统的基础上发展起来的,不仅能够检测到网络中的攻击行为,同时可以主动地对攻击行为发出响应,对入侵活动和攻击性网络流量进行拦截,避免造成损失。

第六章 数据库技术基础

6.1 数据库系统的三级模式结构

  • 数据库的三级模式结构
    • 在这里插入图片描述
  • 数据抽象
    • 物理层:描述数据在存储器中是如何存储的。
    • 逻辑层:描述数据库中存储什么数据以及这些数据间存在什么关系。
    • 视图层:描述整个数据库的某个部分。
  • 三级模式
    • 外模式
      • 也称用户模式或子模式
      • 是用户与数据库系统的接口,是用户用到的那部分数据的描述。
    • 概念模式
      • 也称模式
      • 是数据库中全部数据的逻辑结构和特征的描述,只涉及型的描述,不涉及具体的值。
    • 内模式
      • 也称存储模式
      • 是数据物理结构和存储方式的描述,定义所有的内部记录类型、索引和文件的组织方式,以及数据控制方面的细节。
  • 两级映象
    • 模式/内模式映像
    • 外模式/模式映像
  • 数据的独立性:
    (1) 数据的物理独立性:它是指当数据库的内模式发生改变时,数据的逻辑结构不变。
    (2) 数据的逻辑独立性:它是指用户的应用程序与数据库的逻辑结构是相互独立的,数据的逻辑结构发生变化后,用户程序也可以不修改,但是,为了程序能够正确执行,需要修改外模式/模式之间的映像。

6.2 数据模型

  • 数据模型
    • 就是对现实世界数据特征的抽象。
    • 常用的数据模型
      • 概念数据模型
        • 也称为信息模型
        • 按用户的观点对数据和信息建模,是现实世界到信息世界的第一层抽象,强调其语义表达功能,易于用户理解,是用户和数据库设计人员交流的语言,主要用于数据库设计
        • 这类模型中最著名的是实体联系模型,简称E-R模型
      • 基本数据模型
        • 是按照计算机系统的观点对数据建模,是现实世界数据特征的抽象,用于DBMS的实现。
        • 目前常用的有:层次模型,网状模型、关系模型和面向对象数据模型
  • 数据模型的三要素
    • 数据结构
      • 是所研究的对象类型的集合,是对系统静态特征的描述。
    • 数据操作
      • 对数据库中各种对象(型) 的实例(值) 允许执行的操作的集合,包括操作及操作规则。
    • 数据的约束条件
      • 是一组完整性规则的集合。

6.3 E-R模型

  • 实体-联系(E-R)方法是概念模型中常用的方法,该方法直接从现实世界中抽象出实体和实体间的联系,然后用非常直观的E-R图来表示数据模型。

  • 实体

    • 实体是现实世界中可以区别于其他对象的“事物” 或“物体”,每个实体由一组特性(属性) 来表示,其中的某一部分属性可以唯一标识某个实体,如职工号。
    • 在这里插入图片描述
  • 联系

    • 两个不同实体之间的联系

      • 在这里插入图片描述
    • 两个以上不同实体集之间的联系

      • 1:1:1

      • 1:1:*

      • 1:*:*

        • 一个特护病房有多个病人和多个医生,一个医生只负责一个病房,一个病人只属于一个病房。
        • 在这里插入图片描述
      • *:*:*

        • 一个供应商可以为多个项目供应多种零件,每个项目可用多个供应商供应的零件,每种零件可由不同的供应商供应。
        • 在这里插入图片描述
    • 同一实体集内的二元联系

      • 同一实体集内的两个实体之间相互存在着一定的关系。
      • 在这里插入图片描述
  • 属性

    • 简单属性和复合属性
      • 简单属性原子的、不可再分
      • 复合属性可以细分为更小的部分。如通信地址可以进一步细分为省、市、街道、邮编等。
    • 单值属性和多值属性
      • 一个属性有单个值或多个值如职工的亲属姓名
    • NULL属性
      • 当实体在某个属性上没有值或属性值未知时,使用NULL值。表示无意义或不知道
    • 派生属性
      • 可以从其他属性得来
      • 如参加工作时间和工作年限,身份证号和年龄等
  • 扩充的E-R模型

    • 弱实体

      • 一个实体的存在必须以另一个实体为前提。
      • 在这里插入图片描述
    • 特殊化

      • 某些实体一方面具有一些共性,另一方面还具有各自的特殊性。
      • 这样,一个实体集可以按照某些特征区分为几个子实体。
      • 在这里插入图片描述

第七章 关系数据库

7.1 关系数据库概述

7.1.1 相关名词

  • 关系
    • 在关系数据库中,实体以及实体间的联系都是用关系来表示的。类似于程序设计语言中变量的概念。
  • 关系模式
    • 是对关系的描述。类似于程序设计语言中类型定义的概念。
  • 关系模型
    • 是由若干个关系模式组成的集合。
  • 属性
    • 用来描述某一个事物的特征。
    • 每个属性的取值范围所对应一个值的集合。
  • 候选码
    • 若关系中的某一属性或属性组的值能唯一标识一个元组,则称该属性或属性组为候选码。
  • 主码
    • 又称为主键,若一个关系有多个候选码,则选定其中一个为主码。
  • 主属性
    • 包含在任何候选码中的各个属性称为主属性。
  • 非主属性
    • 不包含在任何候选码中的属性称为非主属性。
  • 外码
    • 如果关系模式R中的属性或属性组非该关系的码,但它是其他关系的码,那么该属性集对关系模式R而言是外码。
  • 全码
    • 关系模型的所有属性组是这个关系模式的候选码,称为全码。
  • 元组/记录
  • 字段
    • 数据项
  • 元数
    • 属性的个数(列数)
  • 基数
    • 记录的个数(行数)
  • n元关系
    • 元数为几,就是几元关系。

7.1.2 关系数据库模式

  • 关系模式可以表示为:R(U,D,dom,F)
    • R表示关系名
    • U是组成该关系的属性名集合
    • D是属性的域
    • dom是属性向域的映像集合
    • F为属性间数据的依赖关系集合。
  • 通常将关系模式简记为:R(U)或 R(A1,A2,A3,…,An)
    • R为关系名
    • A1,A2,A3,…,An为属性名或域名。
  • 例:学生关系S有学号Sno、学生姓名Sname、系名SD、年龄SA属性; 课程关系C有课程号Cno、课程名Cname、先修课程号PCno属性; 学生选课关系SC有学号Sno、课程号Cno、成绩Grade属性。
    • 定义关系模式及主码如下(未考虑F,即属性间的依赖关系) 。
      • (1) 学生关系模式S(Sno,Sname,SD,SA)
      • (2) 课程关系模式C(Cno,Cname,PCno),Dom(PCno)=Cno
      • (3) 学生选课关系模式SC(Sno,Cno,Grade)

7.1.3 关系的三种类型

  • 基本关系(基本表或基表)
    • 它是实际存在的表,是实际存储数据的逻辑表示。
  • 查询表
    • 查询结果对应的表。
  • 视图表
    • 它是一种虚拟表,是由基本表或其他视图表导出的表。
    • 它本身是不独立存储在数据库的,数据库只存放它的定义

7.1.4 关系的完整性约束

  • 关系的完整性约束
    • 是对关系的某种约束条件,用来保证用户对数据库作出修改时不会破坏数据的一致性,防止对数据的意外破坏。
  • 实体完整性
    • 是指基本关系R的主属性不能取空值
  • 参照完整性
    • 现实世界的实体之间往往存在某种联系,在关系模型中实体及实体间的联系是用关系来描述的,这样自然就存在着关系与关系间的引用
    • 如:S(学号,姓名,所属院系编号,年龄)、D(院系编号,学院名称,学院地址,系主任)
      • S的“所属院系” 属性取值要参照D的“院系编号”取值,当然可能为空值(如新员工刚入职,还未分配具体部门的时候部门编号应取空值)
  • 用户定义完整性
    • 是针对某一具体的关系数据库的约束条件,反映某一具体应用所涉及到的数据必须满足的语义要求
    • 如 银行卡的余额必须大于0

7.2 关系运算

在这里插入图片描述

7.2.1 基本的关系代数运算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2.2 扩展的关系运算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.3 元组演算、域演算与查询优化

7.3.1 元组演算

  • 元组关系演算是非过程化查询语言,简称元组演算。
  • 它只描述所需信息,而不给出获得该信息的具体过程。
  • 在元组演算中,其元组演算表达式中的变量是以元组为单位的,其一般形式为:{t|P(t)}
    • 其中,t是元组变量,P(t)是元组演算公式,公式是由原子公式组成。
  • 原子公式:
    • R(t)
      • R是关系名,t是元组变量,R(t)表示:t是关系R中的一个元组。
    • t[i] θ C 或 C θ t[i]
      • t[i]表示元组变量t的第i个分量,C是常量,θ为算术比较运算符。
    • t[i]θ u[j]
      • t和u是两个元组变量。t[i]θ u[j]表示元组变量t的第i个分量与元组变量u的第j个分量之间满足θ运算
  • 公式的定义
    • 若一个公式的一个元组变量前有全称量词⩝或存在量词∃符号,则称该变量为约束变量,否则称之为自由变量。
    • 公式可递归定义如下:
      • 原子公式是公式。
      • 如果φ1和φ2是公式,那么,¬φ1,φ1∨φ2,φ1∧φ2,φ1⇒φ2也都是公式。分别表示如下命题:¬φ1表示“φ1不为真”,φ1∨φ2表示“φ1或φ2为真”,φ1∧φ2表示“φ1和φ2都为真” ; φ1⇒φ2表示“若φ1为真则φ2为真” 。
      • 如果是φ1公式,那么,∃t(φ1)是公式。∃t(φ1)表示这样一个命题:“如果有一个t使φ1为真,则∃t(φ1)为真,否则∃t(φ1)为假” 。
      • 如果是φ1公式,那么,⩝t(φ1)是公式。⩝t(φ1)表示这样一个命题:“如果对所有的t使φ1为真,则⩝t(φ1)为真,否则⩝t(φ1)为假” 。
    • 公式中运算符的优先顺序为:
      • θ > ⩝和∃ > ¬ > ∧和∨ > ⇒,加括号时,括号中的运算符优先

在这里插入图片描述
在这里插入图片描述

7.3.2 域演算

  • 域关系演算简称域演算。在域演算中,表达式中的变量是表示域的变量,可将关系的属性名视为域变量
  • 域演算表达式的一般形式为:
    • {t1,…,tk|P(t1,…,tk)}
    • 其中,t1,…,tk是域变量,P(t1,…,tk)是域演算公式。
  • 原子公式:
    • R(t1,…,ti,…,tk)
      • R是k元关系,ti是元组变量t的第i个分量,R(t1,…,ti,…,tk)表示这样一个命题:以t1,…,ti,…,tk为分量的元组在关系R。
    • tiθC 或 Cθti
      • ti表示元组变量t的第i个分量,C是常量,θ为算术比较运算符。
    • tiθuj
      • ti和uj是两个域变量。tiθ uj表示元组变量t的第i个分量与元组变量u的第j个分量之间满足θ运算。
  • 公式的定义
    • 若一个公式的一个元组变量前有全称量词⩝或存在量词∃符号,则称该变量为约束变量,否则称之为自由变量。
    • 公式可递归定义如下:
      • 原子公式是公式。
      • 如果φ1和φ2是公式,那么,¬φ1,φ1∨φ2,φ1∧φ2,φ1⇒φ2也都是公式。
      • 如果是φ1公式,那么,∃ti1)是公式。
        • ∃ti1)表示这样一个命题:“如果有一个ti使φ1为真,则∃ti1)为真,否则∃ti1)为假” 。
      • 如果φ1(t1,…,ti,…,tk)是公式,那么,⩝ti1)是公式。
        • ⩝t(φ1)表示这样一个命题:“如果对所有的ti使φ1(t1,…,ti,…,tk)为真,则⩝ti1)为真,否则⩝ti1)为假” 。公式中运算符的优先顺序为:θ > ⩝和∃ > ¬ > ∧和∨ > `⇒,加括号时,括号中的运算符优先。

在这里插入图片描述

7.3.3 查询优化

  • 查询优化是指为查询选择最有效的查询计划的过程。一个查询可能会有多种实现方法,关键是如何找出一个与之等价的且操作时间又少的表达式,以节省时间、空间,提高查询效率。
  • 在关系代数运算中, 笛卡儿积连接运算最耗费时间和空间的。
  • 优化的准则:
    • (1) 提早执行选取运算。
      • 对于有选择运算的表达式,应优化成尽可能先执行选择运算的等价表达式,以得到较小的中间结果,减少运算量和从外存读块的次数。
    • (2) 合并乘积与其后的选择运算为连接运算
    • (3) 将投影运算与其后的其他运算同时进行,以避免重复扫描关系。
    • (4) 将投影运算和其前后的二目运算结合起来,使得没有必要为去掉某些字段再扫描一遍关系。
    • (5) 在执行连接前对关系适当地预处理,就能快速地找到要连接的元组。
      • 方法有两种:索引连接法、排序合并连接法。
    • (6) 存储公共子表达式
      • 对于有公共子表达式的结果应存于外存(中间结果),这样,当从外存读出它的时间比计算的时间少时,就可节约操作时间。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.4 关系数据库设计基础知识

7.4.1 函数依赖

  • 函数依赖
    • 定义:设R(U)是属性集U上的关系模式,X、Y是U的子集。若对R(U)的任何一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数决定Y或Y函数依赖于X,记作:X→Y
    • 如果X→Y,那么对于任意两个相同的X,所对应的Y是一定相同的。
    • 如果X→Y,但Y⊈X,则称X→Y是非平凡的函数依赖。一般情况下总是讨论非平凡的函数依赖。
    • 如果X→Y,但Y⊆X,则称X→Y是平凡的函数依赖
    • 函数依赖的定义要求关系模式R的任何可能的r都满足上述条件。因此不能仅考察关系模式R在某一时刻的关系r,就断定某函数依赖成立。
    • 函数依赖是语义范畴的概念,我们只能根据语义来确定函数依赖。
  • 完全函数依赖与部分函数依赖
    • 定义:
    • 在R(U)中,如果X→Y,并且对于X的任何一个真子集X',都有X'不能决定Y,则称Y对X完全函数依赖,记作:X→Y。
    • 如果X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作:X→Y。部分函数依赖也称局部函数依赖。
    • 例:
      • 选课关系SC1(学号,课程号,成绩),F={(学号,课程号) → 成绩}。
        • (学号,课程号) → 成绩,学号⇸成绩,课程号⇸成绩。
      • 选课关系SC2(学号,课程号,学生姓名,课程名称,成绩)
        • F={(学号,课程号)→ 成绩,(学号,课程号) → 课程名称,(学号,课程号) → 学生姓名,学号→学生姓名,课程号 → 课程名称}。
  • 传递函数依赖
    • 定义:在R(U,F)中,如果X→Y,Y→Z,Y⊈X,Y⇸X,则称Z对X传递依赖
    • 例:供应商(Sno,Sname,Status,City,Pno,Qty),及函数依赖集如下,判断该关系是否存在传递函数依赖和部分函数依赖。F={Sno→Sname, Sno→Status, Status→City,(Sno,Pno)→Qty}

7.4.2 码

  • 候选码和主码
    • 设K为R(U,F)中的属性的组合,若K→U,且对于K的任何一个真子集K’,都有K’不能决定U
      • 则K为R的候选码
      • 若有多个候选码,则选一个作为主码。
    • 候选码通常也可以称为候选关键字,主码通常也可以称为主关键字或主键
    • 包含在任何一个候选码中的属性叫做主属性,否则叫做非主属性。
      • 例:选课关系SC1(Sno,Cno,Sname,Cname,G),选课关系SC2(Sno,Cno,Sname,Cname)
  • 外码
    • 若R(U)中的属性或属性组X非R的码,但X是另一个关系的码
      • 则称X是R的外码(Foreign Key) 或称外键。
    • 例:学生(学号,姓名,班主任,所属学院),教师(职工号,姓名),学院(编号,名称)

7.4.3 多值依赖

  • 定义:若关系模式R(U)中,X,Y,Z是U的子集,并且Z=U-X-Y。当且仅当对R(U)的任何一个关系r,给定一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关,则称“Y多值依赖于X” 或“X多值决定Y” 成立。记为:X→→Y
  • 例:参考书目(课程,教师,参考书),课程→→参考书
    • 如果Z=∅,为平凡的多值依赖;如果Z≠∅,则为非平凡的多值依赖。
    • 在这里插入图片描述
  • 多值依赖具有如下6条性质:
    • 1、多值依赖具有对称性。即若X→→Y,则X→→Z,其中Z=U-X-Y。
    • 2、多值依赖的传递性。即若X→→Y,Y→→Z,则X→→Z-Y。
    • 3、函数依赖可以看成是多值依赖的特殊情况。
    • 4、若X→→Y,X→→Z,则X→→YZ。
    • 5、若X→→Y,X→→Z,则X→→Y ⋂ Z。
    • 6、若X→→Y,X→→Z,则X→→Z-Y。

7.5 规范化

在这里插入图片描述

7.5.1 1NF(第一范式)

  • 定义:若关系模式R的每一个分量是不可再分的数据项,则关系模式R属于第一范式。记为R∈1NF。
  • 例:学生(学号,姓名,学院编号,学院名称,课程号,成绩),F={学号→姓名, 学号→学院编号, 学院编号→学院名称,(学号,课程号)→成绩}
  • 简单理解列中不可再分。例如,一个地址字段不应该被分解为省份、城市等子字段。
  • 存在的问题:
    • 数据冗余
    • 更新异常(修改操作后数据不一致)
    • 插入异常
    • 删除异常
      在这里插入图片描述

7.5.2 2NF(第二范式)

  • 定义:若关系模式R∈1NF,且每一个非主属性完全依赖于码,则关系模式R∈2NF。
  • 换句话说:当1NF消除了非主属性对码的部分函数依赖,则称为2NF。
  • 例:学生(学号,姓名,学院编号,学院名称,课程号,成绩),F={学号→姓名, 学号→学院编号, 学院编号→学院名称,(学号,课程号)→成绩}
  • 简单理解一个表如果包含学号和课程编号作为联合主键,而姓名和课程名称分别只与学号和课程编号有关,那么这个表就不满足2NF。
    • 将学生关系分解为:学生1(学号,姓名,学院编号,学院名称) ∈ 2NF,学生2(学号,课程号,成绩) ∈ 2NF
      在这里插入图片描述

7.5.3 3NF(第三范式)

  • 定义:若关系模式R(U,F)中不存在这样的码X,属性组Y及非主属性Z(Z⊈Y) 使得X→Y,(Y⇸X) Y→Z成立,则关系模式R∈3NF。
  • 即:当2NF消除了非主属性对码的传递函数依赖,则称为3NF。
  • 例:学生1(学号,姓名,学院编号,学院名称)∈2NF,但∉3NF。
    • 将学生1分解为:学生11(学号,姓名,学院编号)∈3NF,学生12(学院编号,学院名称)∈3NF
      在这里插入图片描述

7.5.4 BCNF(巴克斯范式)

  • 定义:关系模式R∈1NF,若X→Y且Y⊈X时,X必含有码,则关系模式R∈BCNF。
  • 也就是说,当3NF消除主属性对码部分函数依赖和传递函数依赖,则称为BCNF。
  • 结论:一个满足BCNF的关系模式,应有如下性质:
    • (1) 所有非主属性对每一个码都是完全函数依赖;
    • (2) 所有主属性对每一个不包含它的码,也是完全函数依赖;
    • (3) 没有任何属性完全函数依赖于非码的任何一组属性。
  • 例:R(Pno,Pname,Mname)的属性表示零件号、零件名和厂商名,如果约定,每种零件号只有一个零件名,但不同的零件号可以有相同的零件名; 每种零件可以有多个厂商生产,但每家厂商生产的零件应有不同的零件名。
    • 函数依赖集如下:(Pname,Mname)→Pno,Pno→Pname候选码为(Pname,Mname)或(Pno,Mname)
    • 分解为:R1(Pno,Pname)∈BCNF,R2(Pno,Mname)∈BCNF

7.5.5 4NF(第四范式)

  • 定义:关系模式R∈1NF,若对于R的每个非平凡多值依赖X→→Y且Y⊈X时,X必含有码,则关系模式R(U,F)∈4NF。
  • 4NF是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。
  • 注意:如果只考虑函数依赖,关系模式最高的规范化程度是BCNF如果考虑多值依赖,关系模式最高的规范化程度是4NF
  • 例:学生(学号,选修课程,兴趣爱好)
    • 学生1(学号,选修课程) ∈4NF
    • 学生2(学号,兴趣爱好) ∈4NF
  • 例:书目(ISBN,书名,作者,排名,出版社)
    • 书目1(ISBN,作者,排名) ∈4NF
    • 书目2(ISBN,书名,出版社) ∈BCNF

在这里插入图片描述

7.6 Armstrong公理系统

7.6.1 Armstrong公理系统

  • Armstrong公理系统(函数依赖的公理系统) :设关系模式R(U,F),其中U为属性集,F是U上的一组函数依赖,那么有如下推理规则:
    • (1) A1自反律:若Y⊆X⊆U,则X→Y为F所蕴涵。
    • (2) A2增广律:若X→Y为F所蕴涵,且Z⊆U,则XZ→YZ为F所蕴涵。
    • (3) A3传递律:若X→Y,Y→Z为F所蕴涵,则X→Z为F所蕴涵。
  • 根据上述三条推理规则又可推出下述三条推理规则:
    • (1) 合并规则:若X→Y,X→Z,则X→YZ为F所蕴涵。
    • (2) 伪传递律:若X→Y,WY→Z,则XW→Z为F所蕴涵。
    • (3) 分解规则:若X→Y,Z⊆Y,则X→Z为F所蕴涵

7.6.2 函数依赖的闭包F+及属性的闭包XF+

  • 函数依赖的闭包F+
    • 定义:关系模式R(U,F)中为F所逻辑蕴含的函数依赖的全体称为F的闭包,记为:F+
    • 例:R(U,F),U=(A,B,C,D) ,F={A→B,B→C,AC→D}
  • 属性的闭包XF+
  • 定义:设F为属性集U上的一组函数依赖,X⊆U,XF+={A|X→A能由F根据Armstrong公理导出},则称XF+为属性集X关于函数依赖集F的闭包。
    • 即:属性集X的闭包XF+是指所有能由X决定的属性集合。

7.6.3 候选码的求解方法

  • 给定一个关系模式R(U,F),U={A1,A2,…,An},F是R的函数依赖集,那么,可以将属性分为如下四类:
    • L:仅出现在函数依赖集F左部的属性
    • R:仅出现在函数依赖集F右部的属性
    • LR:在函数依赖集F左右部都出现的属性
    • NLR:在函数依赖集F左右部都未出现的属性
  • 根据候选码的特性,对于给定一个关系模式R(U,F),可以得出如下结论:
    • 结论1:若X(X⊆U)是L类属性,则X必为R的任一候选码的成员。若XF+=U,则X必为R的唯一候选码。
    • 结论2:若X(X⊆U)是R类属性,则X不是R的任一候选码的成员。
    • 结论3:是X(X⊆U)是NLR类属性,则X必为R的任一候选码的成员。
    • 结论4:若X(X⊆U)是`L类和NLR类属性组成的属性集,若XF+=U,则X必为R的唯一候选码。
  • 解题方法
    • 第1步、根据题意,将所有的属性分类
      • L:只在左边出现,一定是
      • R:只在右边出现,一定不是
      • LR:左右都出现,有可能是,也有可能不是
      • NLR:左右都没出现,一定是
    • 第2步、将所有的L类和NLR类属性组合起来,设为P,求其闭包PF+,如果是全集U,那么它就是候选码
    • 第3步、如果PF+不是全集U,则依次LR类属性跟P组合起来求闭包,只要其闭包是全集U,就是候选码

7.6.4 最小函数依赖集

  • 如果函数依赖集F满足下列条件,则称F为一个最小函数依赖集,或称极小函数依赖集最小覆盖
    • (1) F中的任一函数依赖的右部仅有一个属性,即无多余的属性;
    • (2) F中不存在这样的函数依赖X→A,使得F与F-{X→A}等价,即无多余的函数依赖;
    • (3) F中不存在这样的函数依赖X→A,X有真子集Z使得F与F-{X→A}⋃{Z→A}等价,即去掉各函数依赖左边的多余属性。
  • 即:
    • (1) 所有函数依赖的右侧只有一个属性
    • (2) 没有冗余的函数依赖
    • (3) 所有函数依赖的左侧没有冗余的属性

7.7 模式分解及分解后的特性

7.7.1 无损连接

  • 分解

  • 无损连接
    • 无损连接是指将一个关系模式分解成若干个关系模式后,通过自然连接和投影等运算仍能还原到原来的关系模式,则称这种分解为无损连接分解。
  • 定理:关系模式R(U,F)的一个分解ρ ={ R1(U1,F1),R2(U2,F2)},具有无损连接的充分必要的条件是:U1⋂U2→U1-U2∈F+或U1⋂U2→U2-U1∈F+
    • 注意:这个定理只适用于分解为两个子模式的情况,分解为多个子模式的时候不适用
  • 例:对给定的关系模式R(U,F),U={A,B,C},F={A→B},有两个分解:ρ1 ={AB,BC}和 ρ2 ={AB,AC}。请判断这两
    个分解是否无损。

7.7.2 保持函数依赖

  • 定义:设关系模式R(U,F)的一个分解 ρ ={R1(U1,F1), R2(U2,F2),…,Rk(Uk,Fk)},如果(F1⋃F2⋃F3⋃…⋃Fk)+ = F+,则称分解ρ保持函数依赖。
  • 例:判断是否保持函数依赖:
    • (1)关系R(A1,A2,A3)上的函数依赖集F={A1A3→A2,A1A2→A3},R上的一个分解为ρ={(A1,A2),(A1,A3)}
    • (2)给定关系模式R(A1,A2,A3,A4),R上的函数依赖集F = {A1A3→A2,A2→A3},若将R分解为ρ={(A1,A2,A4),(A1,A3)}
    • (3)给定关系模式R(U,F),U ={A,B,C,D},F={A→B,BC→D},对关系R分解为R1(A,B,C)和R2(A,C,D)

第八章 SQL语言

8.1 SQL概述与数据库定义

8.1.1 SQL的基本组成

  • 数据定义语言
    • SQL DDL提供定义关系模式和视图、删除关系和视图、修改关系模式的命令。
  • 交互式数据操纵语言
    • SQL DML提供查询、插入、删除和修改的命令。
  • 事务控制
    • SQL提供定义事务开始和结束的命令。
  • 嵌入式SQL和动态SQL
    • 用于嵌入到某种通用的高级语言中混合编程。其中,SQL负责操纵数据库,高级语言负责控制程序流程。
  • 完整性
    • SQL DDL包括定义数据库中的数据必须满足的完整性约束条件的命令,对于破坏完整性约束条件的更新将被禁止。
  • 权限管理
    • SQL DDL中包括说明对关系和视图的访问权限。
  • SQL语言中完成核心功能的9个动词:
    • (1) 数据查询:Select
    • (2) 数据定义:Create、Drop、Alter
    • (3) 数据操纵:Insert、Update、Delete
    • (4) 数据控制:Grant、Revoke

8.1.2 SQL的数据类型

在这里插入图片描述

8.1.3 表的创建、修改和删除

1、创建表 
CREATE TABLE <表名> (<列名><数据类型>[列级完整性约束条件]
[<列名><数据类型>[列级完整性约束条件]][<表级完整性约束条件>]);
注:[ ]表示可选,< >表示必填。

2、修改表
语句格式:ALTER TABLE <表名> [ADD <新列名><数据类型>[列级完整性约束条件]]
[DROP <完整性约束名>]
[Modify <列名><数据类型>]);
如:
ALTER TABLE S ADD Zap CHAR(6); //在表S中新增一列ZAP,该列的数据为空
ALTER TABLE S MODIFY Status INT; //将表S的Status属性的数据类型更改为INT
ALTER TABLE S ADD Constraint C_cno CHECK(......) //在表S中新增CHECK约束,取名为C_cno

3、删除表
语句格式:DROP TABLE <表名>
如:
DROP TABLE S; //表删除后,不再是数据库模式的一部分


例:
建立一个供应商、 零件数据库。
其中关系供应商S(Sno,Sname,Status,City),关系零件P( Pno,Pname,Color,Weight,City) 。
该数据库要满足如下要求:
( 1) 供应商代码不能为空,且值是唯一的,供应商的名称也是唯一的。
( 2) 零件号不能为空,且值是唯一的; 零件名不能为空。
( 3) 一个供应商可以供应多个零件,而一个零件可以由多个供应商供应。

Create Table S (
Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(30) UNIQUE,
Status CHAR(8),
City CHAR(20),
PRIMARY KEY(Sno)); // 此处隐含Sno唯一且不为空,列级完整性约束可不写
Create Table P (Pno CHAR(6),
Pname CHAR(30) NOT NULL,
Color CHAR(8),
Weight NUMERIC(6,2),
City CHAR(20),
PRIMARY KEY(Pno));
Create Table SP (Sno CHAR(5),
Pno CHAR(6),
Status CHAR(8),
Qty NUMERIC(9),
PRIMARY KEY(Sno,Pno),
FOREIGN KEY (Sno) REFERENCES S(Sno),
FOREIGN KEY (Pno) REFERENCES P(Pno))
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 1)、实体完整性约束
    • (1) 在列后面加 PRIMARY KEY
    • (2) 在最后加PRIMARY KEY(属性名1,属性名2)
      • 主码为属性组(两个或以上属性的组合)只能用这种方法
  • 2)、参照完整性约束
    • (1) 在列后面加 References 表名(属性名)
    • (2) 在最后面加,有几个外码,就写几行。
      • Foreign Key (属性名) References 表名(属性名)[ON DELETE [CASCADE|SET NULL]
      • ON DELETE CASCADE 表示删除被参照关系的元组时,同时删除参照关系中的元组
      • ON DELETE SET NULL表示删除被参照关系的元组时,将参照关系的相应属性值置为空值
  • 3)、属性值上的约束
    • (1) NOT NULL:表示不允许取空值
    • (2) UNIQUE:表示取值唯一
    • (3) NOT NULL UNIQUE:表示取值唯一且不为空
    • (4) CHECK限制列中值的取值范围
      • 如:CHECK (Sex=‘男’ OR Sex=‘女’),CHECK (余额>=0),CHECK (年龄>=18 AND 年龄<=60)
  • 4)、全局约束
    • 1) 基于元组的检查子句:这种约束是对单个关系的元组值加以约束。

      • 例:入职日期小于等于离职日期,可以用 CHECK (入职日期<=离职日期)
      • 在这里插入图片描述
    • 2) 基于断言的语法格式:

      • CREATE ASSERTION <断言名> CHECK (<条件>)
      • 在这里插入图片描述

8.1.4 索引的创建和删除

1、建立索引:
语句格式:CREATE [UNIQUE][CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]);
• 次序:ASC(升序)DESC(降序),默认为升序。
• UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录。
• CLUSTER:表明要建立的索引是聚簇索引,意为索引项的顺序是与表中记录的物理顺序一致的索引组织
如:
CREATE UNIQUE INDEX S_Sno on S(Sno); //在表S的Sno列上建立索引S_Sno,默认为升序
CREATE UNIQUE INDEX P_Pno on P(Pno); //在表P的Pno列上建立索引P_Pno,默认为升序
CREATE UNIQUE INDEX J_Jno on J(Jno); //在表J的Jno列上建立索引J_Jno,默认为升序
CREATE UNIQUE INDEX SPJ_NO on SPJ(Sno ASC,Pno DESC,Jno ASC);
//在表SPJ上建立索引SPJ_NO,属性Sno按升序,Pno按降序,Jno按升序

2、删除索引
语句格式:DROP INDEX <索引名>
例:DROP INDEX StudentIndex; //删除索引StudentIndex
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 索引的概念
    • 数据库中的索引与书籍中的索引类似,在一本书中,利用索引可以快速查找到所需信息,无须阅读整本书。在数据库中,索引使数据库无须对整个表进行扫描,就可以在其中找到所需数据。
    • 比如在字典中,我们按字母建立索引。在数据库中,索引是某个表中的一列或者若干列的值的集合,和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
  • 索引的作用
  • (1) 通过创建唯一索引,可以保证数据记录的唯一性。
  • (2) 可以大大加快数据检索速度。
  • (3) 可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义
  • (4) 在使用ORDER BY和GROUP BY子句中进行检索数据时,可以显著减少查询中分组和排序的时间。
  • (5) 使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。索引分为聚集索引和非聚集索引。聚集索引是指索引表中索引项的顺序与表中记录的物理顺序一致的索引。

8.1.5 视图的创建和删除

1、创建视图
CREATE VIEW 视图名(列表名)
AS SELECT 查询子句
[WITH CHECK OPTION];
• 视图的创建中,必须遵循如下规定:
(1) 子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语。
(2WITH CHECK OPTION表示对UPDATE,INSERT,DELETE操作时保证更新、插入或删除的行满足视图
定义中的谓词条件(即子查询中的条件表达式)
(3) 组成视图的属性列名或者全部省略或者全部指定。如果省略属性列名,则隐含该视图由SELECT
子查询目标列的主属性组成

2、删除视图
语句格式:DROP VIEW 视图名
如:DROP VIEW CS_STUDENT //删除视图CS_STUDENT


例:学生关系模式S(Sno,Sname,Sage,Sex,SD,Email,Tel)
,建立计算机系(CS表示计算机系)学生的视图
,并要求进行修改、插入操作时保证该视图只有计算机系的学生。
CREATE VIEW CS_STUDENT //创建视图CS_STUDENT
AS SELECT Sno,Sname,Sage,Sex //选择学号、姓名、年龄、性别列
FROM Student //从学生表中查询
Where SD='CS' //选择系名等于“CS” 的行
WITH CHECK OPTION; //以后对该视图进行修改、插入操作时DBMS会自动加上SD='CS'的条件,保证视图中只有计算机系的学生
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

8.2 数据操作

  • SQL的数据操作功能包括
    • SELECT(查询)
    • INSERT(插入)
    • DELETE(删除)
    • UPDATE(修改)

在这里插入图片描述

  • Select 基本结构
语句格式:SELECT [ALL | DISTINCT]<目标列表达式>[,<目标列表达式>]FROM <表名或视图名>[,<表名或视图名>]
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING <条件表达式>]]
[ORDER BY <列名2>[ASC | DESC]]
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

  • 简单查询
    • π Sno,Snamesex=‘男’(S)) 可以改成 select 语句
最基本的查询语句:
Select Sno,Sname
from S
where sex='男'
; 

更名操作:使用AS可以给列和表重命名。
Select 学生表.sno as 学号,Sname as 姓名,Grade 成绩 //AS是可以省略的
from S 学生表,SC 课程表 //表也可以重命名
where 学生表.Sno=课程表.Sno and 学生表.SD='计算机'; //表重命名后,引用时一定要用新名称,这里不能再用S和SC

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 连接查询
    • 如果涉及两个以上的表,则称为连接查询。
1) 检索选修了课程号为'C1'的学生号和学生姓名:
Select S.Sno,Sname
from S,SC
where S.Sno=SC.Sno and SC.Cno='C1'
;2) 检索选修课程名为“操作系统” 的学生号和学生姓名:
Select S.Sno,Sname
from S,SC,C
where S.Sno=SC.Sno and SC.Cno=C.Cno and C.Cname='操作系统'
;3) 检索至少选修了课程号为“C1” 和“C3” 的学生号:
Select Sno
from SC SC_X,SC SC_Y
where SC_X.Sno=SC_Y.Sno and SC_X.Cno='C1' and SC_Y.Cno='C3'
;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 子查询
    • 子查询也称嵌套查询。嵌套查询是指一个SELECT-FROM-WHERE查询块中可以嵌入另一个查询块之中。在SQL中允许多重嵌套。
    • IN(在……集合中) | NOT IN(不在……集合中)
    • EXISTS(存在) | NOT EXISTS(不存在)
1) 检索选修了课程号为'C1'的学生号和学生姓名:
Select Sno,Sname
from S
where Sno INSelect Sno
				from SC
				Where Cno='C1')
;2) 检索选修课程名为“操作系统” 的学生号和学生姓名:
Select Sno,Sname
from S
where Sno IN (Select Sno
				from SC
				Where Cno IN (Select Cno
								From C
								Where Cname='操作系统'
								)
			)
;3) 查询没有被任何同学选修的课程号和课程名
Select Cno,Cname 
from C
where NOT EXISTS (select * 
					from SC 
					where SC.Cno=C.Cno
					)
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 聚集函数
    • 聚集函数是一个值的集合为输入,返回单个值的函数。
    • SQL提供了5个预定义集函数:
      • 平均值AVG()
      • 最小值MIN()
      • 最大值MAX()
      • 求和SUM()
      • 计数COUNT()

在这里插入图片描述
在这里插入图片描述

1) 查询课程C1的最高分和最低分以及高低分之间的差距
Select MAX(Grade)
	,MIN(Grade)
	,MAX(Grade)-MIN(Grade)
From SC
Where Cno='C1'
;2) 查询其他系比计算机系所有学生年龄都要小的学生姓名和年龄。
Select Sname
	,Age
From S
Where Age<ALL(Select Age
			From S
			Where SD='计算机'
			)
AND SD<>'计算机'
;

Select Sname
	,Age
From S
Where Age<(SELECT MIN(Age)
			From S
			Where SD='计算机'
			)
AND SD<>'计算机'
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 分组查询
1GROUP BY子句
对元组进行分组,此时聚集函数只用于每个分组。
(1) 
Select AVG(Grade)
from SC
;
(2) 
Select Sno
	,AVG(Grade)
from SC
GROUP BY Sno
;


2HAVING子句:
假如元组在分组前按照某种方式加上限制,使得不需要的分组为空。可以在GROUP BY子句后面加上HAVING子句。其实就是分组后做一个选择,去掉不满足HAVING后面的那个条件的分组。
(3) 
Select Sno
	,AVG(Grade)
from SC
GROUP BY Sno
HAVING AVG(Grade)>85
;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 字符串操作
    • 字符串常用LIKE来进行匹配操作,“%” 匹配任意长度字符串; “_” 匹配任意一个字符。模式是区分大小写的。
1) 查询住址包含“科技路” 的学生姓名:
Select Sname
from S
Where Addr LIKE '%科技路%'
;

(2)查询名字为‘国庆’ 的学生姓名、 年龄和所在系:
Select Sname
	,Sage
	,SD
from S
Where Sname LIKE '__国庆'
;

为了使模式中包含特殊字符,即%和_,允许使用ESCAPE关键词来定义转义符,LIKE语句后面紧跟“ESCAPE'\'” 表明转义符'\' 后面的特殊字符为普通字符。
LIKE 'ab\%cd%'escape'\' //匹配所有以ab%cd开头的字符串
LIKE 'ab\\cd%'escape'\' //匹配所有以ab\cd开头的字符串

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 集合操作
    • UNION(并) 、 UNION ALL(不去掉重复行)
    • INTERSECT(交)
    • EXCEPT(差)
1UNION(并) 、 UNION ALL(不去掉重复行)
查询在银行有贷款或者有存款的所有客户身份证号:
select customer_no from 贷款
union
select customer_no from 存款
;

2INTERSECT(交)
查询在银行既有贷款又有存款的客户身份证号:
select customer_no from 贷款
intersect
select customer_no from 存款
;

3EXCEPT(差)
查询只在银行有贷款而没有存款的客户身份证号:
select customer_no from 贷款
except
select customer_no from 存款
; 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 外连接
1LEFT JOIN(左外连接)
SELECT S.Sno
	,Sname
	,SC.Cno
	,Grade
FROM S
LEFT JOIN SC
ON S.Sno=SC.Sno
;

2RIGHT JOIN(右外连接)
SELECT S.Sno
	,Sname
	,SC.Cno
	,Grade
FROM S
RIGHT JOIN SC
ON S.Sno=SC.Sno
;

3FULL JOIN(全外连接)
SELECT S.Sno
	,Sname
	,SC.Cno
	,Grade
FROM S
FULL JOIN SC
ON S.Sno=SC.Sno
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • INSERT INTO语句
    • 用于向表中插入新的行。
语句格式:
INSERT INTO 表名 VALUES (1,2)
INSERT INTO 表名(列名1,列名2) VALUES (1,2)

例:
INSERT INTO SC VALUES ('3001', 'C1', '84');

INSERT INTO SC(SNO,CNO) VALUES ('3001', 'C2');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • DELETE语句
    • DELETE语句用于删除表中的行。
    • 注意:不同于DORP TABLE SC,DELETE只是删除表中的数据,但是关系模式仍然存在,表SC仍然存在于数据库中。
语句格式:DELETE FROM 表名 WHERE 条件表达式

例:
DELETE FROM SC WHERE Cno='C1';

也可以删除表中的所有数据:
DELETE FROM 表名
例:
DELETE FROM SC;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • UPDATE语句
    • 用于修改表中的数据
语句格式:
UPDATE 表名 SET 列名=新值 WHERE 条件表达式

例:
UPDATE SC
SET Grade = 90
WHERE Sno='3001' 
AND Cno='C2'
; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 视图的查询与更新
1、 视图的查询
例:建立计算机系(CS表示计算机系) 学生的视图,并要求进行修改、 插入操作时保证该视图只有计算机系的学生。
CREATE VIEW CS_STUDENT AS 
SELECT Sno
	,Sname
	,Sage
	,Sex
FROM Student
Where SD='CS'
WITH CHECK OPTION
;

此时要查询计算机系年龄小于20岁的学生的学号及年龄的SQL语句如下:
SELECT Sno,Sage FROM CS_Student WHERE Sage<20
系统执行该语句时,通常先将其转换成等价的对基本表的查询,然后执行查询语句。
也就是查询视图时,系统先从数据字典中取出视图的定义,然后将定义中的查询语句和对该视图的查询语句结合起来,形成一个修正的查询语句。对上例修正之后的查询语句为:
SELECT Sno,Sage FROM Student WHERE SD='CS' AND Sage<20;

2、 视图的更新
SQL对视图的更新必须遵循以下规则:
(1) 从多个基本表通过连接操作导出的视图不允许更新。
(2) 对使用了分组、 聚集函数操作的视图不允许进行更新操作。
(3) 如果视图是从单个基本表通过投影、 选取操作导出的则允许进行更新操作,且语法同基本表。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

8.3 授权与触发器

8.3.1 授权(GRANT)

语句格式:
GRANT 权限 ON TABLE/DATABASE 表名/数据库名
TO 用户1,用户2/PUBLIC
[WITH GRANT OPTION]
;

PUBLIC:表示将权限授予所有人
WITH GRANT OPTION:表示获得了这个权限的用户还可以将权限赋给其他用户。

例:用户要求把数据库SPJ中供应商S、 零件P、 项目J表赋予各种权限。各种授权要求如下:
(1) 将对供应商S、 零件P、 项目J的所有操作权限赋给用户User1及User2。
GRANT ALL PRIVILEGES
ON TABLE S,P,J
TO USER1,USER2
;2) 将对供应商S的插入权限赋给用户User1,并允许将此权限赋给其他用户。
GRANT INSERT
ON TABLE S
TO USER1 WITH GRANT OPTION
;3) DBA把数据库SPJ中建立表的权限赋给用户User1。
GRANT CREATETAB
ON DATABASE SPJ
TO User1
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

在这里插入图片描述

8.3.2 收回授权(REVOKE)

语句格式:
REVOKE 权限 ON TABLE/DATABASE 表名/数据库名
FROM 用户1,用户2/PUBLIC
[RESTRICT | CASCADE]
;

RESTRICT:表示只收回语句中指定的用户的权限
CASCADE:表示除了收回指定用户的权限外,还收回该用户赋予的其他用户的权限。

例:
-- 将用户User1及User2对供应商S、 零件P、 项目J的所有操作权限收回:
REVOKE ALL PRIVILEGES ON TABLE S,P,J FROM User1,User2;
-- 将所有用户对供应商S的所有查询权限收回:
REVOKE SELECT ON TABLE S FROM PUBLIC;
-- 将User1用户对供应商S的供应商编号Sno的修改权限收回。
REVOKE UPDATE(Sno) ON TABLE S FROM User1;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

8.3.3 触发器概述

  • 触发器主要有以下三方面的特点:
    • (1) 当数据库程序员声明的事件发生时,触发器被激活。声明的事件可以是对某个特定关系的插入、 删除或更新。
    • (2) 当触发器被事件激活时,不是立即执行,而是首先由触发器测试触发条件,如果事件不成立,响应该事件的触发器什么都不做。
    • (3) 如果触发器声明的条件满足,则与该触发器相连的动作由DBMS执行。动作可以阻止事件发生,可以撤销事件。
  • 创建触发器时需指定:
    • (1) 触发器名称
    • (2) 在其上定义触发器的表
    • (3) 触发事件:触发器将何时激发
    • (3) 触发条件:满足什么条件时执行触发动作
    • (4) 触发动作:指明触发器执行时应做的动作
  • 触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
  • 不能在临时表或系统表上创建触发器,但触发器可以引用临时表
  • 不能传递参数,是sql语句的集合,可以通过触发器来强制实现数据的完整性和一致性
  • 不能包含事务控制语句内部可以使用DDL语句
  • 只能被动触发,用户不能直接调用触发器,由触发事件激活,并由数据库服务器自动执行。

8.3.4 创建触发器

CREATE TRIGGER 触发器名称 [BEFORE | AFTER]
[DELETE | INSERT | UPDATE OF 列名] //触发事件
ON 表名
[REFERENCING <临时视图名>]
[FOR EACH ROW | FOR EACH STATEMENT]
[WHEN <触发条件>] //WHEN后面跟触发条件,指明当什么条件满足时,执行下面的触发动作
BEGIN
<触发动作> //BEGIN...END 中定义触发动作,即当触发条件满足时,需要数据库做什么
END [触发器名称]


BEFORE/AFTER:指明是在执行触发语句之前激发触发器还是执行触发语句之后激发触发器。
DELETE:当一个DELETE语句从表中删除行时激发触发器。
INSERT:当一个INSERT语句向表中插入行时激发触发器。
UPDATE/UPDATE OF(列名):当UPDATE修改表中的值时,激发触发器,也可加(OF 列名)指定是某一列的值被修改时激发触发器。
REFERENCING:触发器运行过程中,系统会生成两个临时视图,分别存放更新前和更新后的值,对于行级触发器,为OLD ROW
NEW ROW,对于语句级触发器,为OLD TABLE和NEW TABLE。
	REFERENCING new row AS nrow / REFERENCING old row AS orow 。
FOR EACH ROW:表示为行级触发器,对每一个被影响的元组(即每一行)执行一次触发过程。
FOR EACH STATEMENT:表示为语句级触发器,对整个事件只执行一次触发过程,为默认方式


例:银行数据库关系模式如下:
Account(Account-no, branch-name, balance) 账户(账号,支行名称,余额)
Loan(Loan-no,branch-name,amount) 贷款(贷款号,支行名称,金额)
Depositor(customer-name,Account-no) 存款(存款人姓名,账号)
假设银行处理透支时,不是将账户的余额设为负值,而是将账户余额设置为0,并且建立一笔贷款,其金额为透支金额。
这笔贷款的贷款号等于该透支账户的账号。

CREATE TRIGGER overdraft_trigger AFTER UPDATE ON Account //在Account表上建立触发器,触发事件是“修改后”
Referencing new row as nrow //引用修改后的“行”为临时视图,命名为nrow
For each row //表示其为行级触发器,即对每一行都执行一次触发
WHEN nrow.balance<0 //触发条件是修改后的行的balance属性值小于0,即账户余额为负。
BEGIN ATOMIC //ATOMIC关键字表示下面的语句为原子性的,即:要么都做,要么都不做。
INSERT INTO borrower
		( Select customer-name, Account-no
		From depositor
		Where nrow.account-no = depositor.account-no 
		); //将透支客户的信息单独存储在borrower表中
INSERT INTO loan values
		( nrow.account-no, nrow.branch-name, -nrow.balance ); //建立一笔贷款,将该笔记录插入到贷款表loan中
UPDATE account set balance=0
	Where account.account-no = nrow.account-no; //将Account表中的余额设为0
END
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

8.3.5 更改与删除触发器

1、 更改触发器
语句格式:
ALTER TRIGGER <触发器名> [BEFORE|AFTER]
DELETE|INSERT|UPDATE OF [列名]
ON 表名|视图名
AS
BEGIN
要执行的SQL语句
END

2、 删除触发器
语句格式:DROP TRIGGER <触发器名>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

8.4 嵌入式SQL与存储过程

8.4.1 嵌入式SQL

  • SQL提供了将SQL语句嵌入到某种高级语言中的方式,通常采用预编译的方法。
  • 1、 区分主语言与SQL语句的方式:
    • EXEC SQL <SQL语句>
  • 2、 向主语言传递SQL语句执行的状态信息的方式:
    • SQLCA,即SQL通信区,是系统默认定义全局变量
  • 3、 主变量(共享变量) :
    • 主语言通过主变量向SQL语句提供参数,主变量是由主语言的程序定义的,并用SQL的DECLARE语句说明。
    • 在SQL语句中,为了与SQL中的属性名区分,在引用共享变量时, 前面需要加“:”
例:EXEC SQL BEGIN DECLARE SECTION;
char Msname[4], Msex[3], givensno[5];
int Mage;
char SQLSTATE[6]; //特殊的共享变量,解释SQL语句的执行状况
EXEC SQL END DECLARE SECTION;1) 根据共享变量givensno值查询学生关系students中学生的姓名、 年龄和性别。
EXEC SQL SELECT sname,age,sex
INTO :Msname, :Mage, :Msex
FROM students
WHERE sno = :givensno
;2) 某学生选修了一门课程,将其插入学生选课表SC中,假设学号、 课程号、 成绩已分别赋给主变量HSno、
Hcno 和 Hgrade。
EXEC SQL INSERT INTO SC(Sno,Cno,Grade)
Values (:HSno, :HCno, :Hgrade)
;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

8.4.2 游标

  • SQL语言是面向集合的,一条SQL语句可以产生或处理多条记录。
  • 而主语言是面向记录的,一组主变量一次只能放一条记录,所以,引入游标,通过移动游标指针来决定获取哪一条记录。同时引入指示变量来解决主语言无空值的问题。
1、 定义游标:
语句格式:EXEC SQL DECLARE <游标名称> CURSOR FOR <SELECT语句>
• 它只是一条说明性语句,定义游标后,其中的SELECT语句并不执行。

2、 打开游标:
语句格式:EXEC SQL OPEN <游标名称>
• 该语句执行游标定义中的SELECT语句,同时游标处于活动状态。游标是一个指针,此时指向查询结果的第一行之前。

3、 推进游标:
语句格式:EXEC SQL FETCH 游标名 INTO 变量表
• 该语句执行时,游标推进一行,并把游标指向的行(称为当前行) 中的值取出,送到共享变量中。

4、 关闭游标:EXEC SQL CLOSE 游标名
• 该语句关闭游标,使它不再和查询结果相联系。游标关闭后,后面还可以再打开

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

8.4.3 存储过程

  • 是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
  • 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、 输出参数、 返回单个或多个结果集以及返回值。
  • 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快
  • 数据库对象,可以定义变量,可以嵌套使用,可以一次编译,多次执行,可以包含流程控制被编译后保存在数据库中
CREATE PROCEDURE 存储过程名(IN|OUT|IN OUT 参数1 数据类型,IN|OUT|IN OUT 参数2 数据类型…)
[AS] //参数的数据类型只需要指明类型名即可,不需要指定宽度。具体宽度由外部调用者决定
BEGIN
<SQL语句>
END


IN:为默认值,表示该参数为输入型参数,在过程体中值一般不变。
OUT:表示该参数为输出参数,可以作为存储过程的输出结果,供外部调用者使用。
IN OUT:既可作为输入参数,也可作为输出参数。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

第九章 非关系型数据库No SQL

9.1 CAP理论

  • 简单地说,就是对于一个分布式系统,一致性(Consistency) 、 可用性和分区容忍性三个特点最多只能三选二
    • 一致性(Consistency)
      • 是指系统在执行了某些操作后仍处于一个一致的状态。
    • 可用性(Availablity)
      • 是指对数据的所有操作都有成功的返回。简言之,就是任何请求不管成功或失败都有响应。
    • 分区容忍性(Partition tolerance)
      • 这一概念的前提是在网络发生故障的时候。
      • 在网络连接上,一些结点出现故障,使得原本连通的网络变成了一块一块的分区,若允许系统继续工作,那就是分区可容忍的。

9.2 ACID理论

  • 原子性(Atomicity)
    • 事务的所有操作在数据库中要么都做要么都不做
  • 一致性(Consistency)
    • 一个事务独立执行的结果,将保持数据的一致性,即数据不会因为事务的执行而遭受破坏。
  • 隔离性(Isolation)
    • 一个事务的执行不能被其他事务干扰
    • 并发事务在执行过程中可能会对同一数据进行操作,这些事务的操作应该不会相互干扰,是相互隔离的。
  • 持久性(Durability)
    • 一个事务一旦提交,它对数据库的改变必须是永久的,即使系统出现故障也是如此。

9.3 BASE理论

  • 由于CAP理论的存在,为了提高性能,出现了ACID的一种变种BASE,它是一个弱一致性的理论,只要求最终一致性
    • BA(Basically Available)
      • 基本可用
    • S(Soft state)
      • 软状态,可以理解为“无连接的” 的,而与之相对应的是“面向连接” 的。
    • E(Eventual consistency)
      • 最终一致性,最终整个系统看到的数据是一致的

9.4 各种NoSQL数据库的分类与特点

在这里插入图片描述

第十章 系统开发和运行知识

10.1 软件生存周期

  • 软件生存周期包括可行性分析与项目开发计划、 需求分析、 概要设计、 详细设计、 编码和单元测试、 综合测试及维护阶段。
  • 1、 可行性分析与项目开发计划
    • 主要任务是确定软件的开发目标及可行性。该阶段应该给出问题定义、 可行性分析和项目开发计划。
  • 2、 需求分析
    • 需求分析阶段的任务不是具体地解决问题,而是准确地确定软件系统必须做什么,确定软件系统的功能、 性能、 数据和界面等要求,从而确定系统的逻辑模型
  • 3、 概要设计
    • 在本阶段,开发人员需要将确定的功能需求转换成相应的体系结构。概要设计就是设计软件的结构,明确软件有哪些模块组成,模块的层次以及功能。与此同时,还要设计应用系统的总体数据结构和数据库结构
  • 4、 详细设计
    • 主要任务就是对每个模块完成的功能进行描述,不是编写程序,而是设计出程序的详细规格说明,使程序员可以根据它们写出实际的程序代码。
  • 5、 编码和单元测试
    • 就是把每个模块的结构转换成计算机可接受的程序代码,即写成某种特定程序设计语言表示的源程序清单,并仔细测试编写出每一个模块。
  • 6、 综合测试
    • 综合测试阶段的关键任务是通过各种类型的测试(及相应的调试) 使软件达到预定的要求。最基本的测试是集成测试和验收测试。
  • 7、 维护
    • 维护阶段是软件生存期中时间最长的阶段。软件一旦交付正式投入运行后便进入软件维护阶段。该阶段的关键任务是通过各种必要的维护活动使系统持久地满足用户的需要。每一项维护活动都应该准确地记录下来,作为正式的文档资料加以保存。

10.2 软件生存周期模型

10.2.1 瀑布模型

  • 瀑布模型是将软件生存周期各个活动规定为依线性顺序连接的若干阶段的模型。它规定了由前至后、 相互衔接的固定次序,如同瀑布流水,逐级下落。瀑布模型假设,一个待开发的系统需求是完整的、 简明的、 一致的,而且可以先于设计和实现完成之前产生。
    在这里插入图片描述

  • 优点

    • 容易理解,管理成本低
    • 强调开发的阶段性早期计划及需求调查和产品测试。
  • 不足

    • 客户必须能够完整、 正确和清晰地表达他们的需要
    • 在开始的两个或三个阶段中,很难评估真正的进度状态
    • 当接近项目结束时,出现了大量的集成和测试工作;
    • 直到项目结束之前,都不能演示系统的能力。
    • 在瀑布模型中,需求或设计中的错误往往只有到了项目后期才能够被发现,对于项目风险的控制能力较弱,从而导致项目常常延期完成,开发费用超预算。

10.2.2 增量模型

  • 增量模型融合了瀑布模型的基本成分和原型实现的迭代特征,它假设可以将需求分段为一系列增量产品,每一增量可以分别地开发。该模型采用随着日程时间的进展而交错的线性序列,每一个线性序列产生软件的一个可发布的“增量” 。增量模型强调每一个增量均发布一个可操作的产品。
    在这里插入图片描述

  • 优点

    • 第一个可交付版本所需要的成本和时间很少;
    • 开发由增量表示的小系统所承担的风险不大;
    • 由于很快发布了第一个版本,因此可以减少用户需求的变更;
    • 运行增量投资,即在项目开始时,可以仅对一个或两个增量投资。
  • 不足

    • 如果没有对用户的变更要求进行规划,那么产生的初始增量可能会造成后来增量的不稳定;
    • 如果需求不像早期思考的那样稳定和完整,那么一些增量就可能需要重新开发,重新发布;
    • 管理发生的成本、 进度和配置的复杂性,可能会超出组织的能力。

10.2.3 演化模型

  • 主要针对事先不能完整定义需求的软件开发,是在快速开发一个原型的基础上,根据用户在使用原型的过程中提出的意见和建议对原型进行改进,获得原型的新版本。重复这一过程,最终可得到令用户满意的软件产品。
  • 优点
    • 任何功能一经开发就能进入测试,以便验证是否符合产品的需求,可以帮助引导出高质量的产品要求。
  • 缺点
    • 如果不加控制地让用户接触开发中尚未稳定的功能,可能对开发人员及用户都会产生负面影响。

10.2.4 螺旋模型

  • 将瀑布模型和演化模型结合起来,加入了两种模型均忽略的风险分析,弥补了两种模型的不足。

在这里插入图片描述

  • 螺旋模型将开发过程分为几个螺旋周期,每个螺旋周期大致和瀑布模型相符合。
    • (1) 制订计划
      • 确定软件的目标,选定实施方案,明确项目开发的限制条件。
    • (2) 风险分析
      • 分析所选的方案,识别风险,消除风险。
    • (3) 实施工程
      • 实施软件开发,验证阶段产品。
    • (4) 用户评估
      • 评价开发工作,提出修正建议,建立下一个周期的开发计划。
  • 螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,继而做出应有的反应。因此特别适用于庞大、 复杂并且具有高风险的系统。

10.2.5 喷泉模型

  • 喷泉模型是一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法。
  • 它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性。
  • 喷泉模型使开发过程具有迭代性和无间隙性。
  • 该模型的各个阶段没有明显的界限,开发人员可以同步进行。

在这里插入图片描述

  • 优点
    • 可以提高软件项目的开发效率,节省开发时间。
  • 不足
    • 由于喷泉模型在各个开发阶段是重叠的,在开发过程中需要大量的开发人员,不利于项目的管理。此外这种模型要求严格管理文档,使得审核的难度加大。

10.3 典型的软件开发方法

10.3.1 结构化开发方法

  • 是一种传统的信息系统开发方法,由结构化分析、 结构化设计和结构化程序设计构成,它是一种面向数据流的开发方法。
  • 其精髓是自顶向下、 逐层分解和模块化设计,它的基本原则是功能的分解与抽象
  • 结构化方法的开发过程一般是先把系统功能视为一个大的模块,再根据系统分析与设计的要求对其进行进一步的模块分解或组合。
  • 结构化方法特别适合于数据处理领域的问题,但是不适合解决规模较大的、 比较复杂的项目,且难以适应需求的变化。

10.3.2 原型化开发方法

  • 根据用户初步需求,利用系统开发工具,快速地建立一个系统模型展示给用户,在此基础上与用户交流,最终实现用户需求的信息系统快速开发的方法。
  • 原型法的优点主要在于能更有效地确认用户需求。
  • 原型化方法比较适合于用户需求不清、 业务理论不确定、 需求经常变化的情况。当系统规模不是很大也不太复杂时,采用该方法是比较好的。

10.3.3 面向对象开发方法

  • 面向对象开发方法的基本出发点是尽可能按照人类认识世界的方法和思维方法来分析和解决问题。客观世界是由许多具体的事物、 事件、 概念和规则组成的,这些均可被看成对象,面向对象方法正是以对象作为最基本的元素,它也是分析问题、 解决问题的核心。
  • 使用面向对象的方法构造的系统具有更好的复用性。面向对象的方法使系统的描述及信息模型的
    表示与客观实体相对应,符合人们的思维习惯,因此可以缩短开发周期。

10.3.4 敏捷方法

  • 敏捷开发的总体目标是通过“尽可能早地、 持续地对有价值的软件的交付” 使客户满意。通过在软件开发过程中加入灵活性,敏捷方法可以使用户能够在开发周期的后期增加或改变需求。

10.4 软件项目管理

  • 1、 成本估算
    2、 风险分析
    3、 进度管理
    4、 人员管理

10.4.1 软件项目管理-进度管理之Gantt图(甘特图) 和项目计划评审技术(PERT) 图

  • 进度安排的常用图形描述方法有Gantt图(甘特图) 和项目计划评审技术(PERT) 图。
  • Gantt图
    • 在这里插入图片描述

    • 优点

      • Gantt图能清晰地描述每个任务从何时开始,到何时结束
      • 任务的进展情况
      • 各个任务之间的并行性
    • 缺点

      • 不能清晰地反映出各任务之间的依赖关系
      • 难以确定整个项目的关键所在
      • 不能反映计划中有潜力的部分。
  • PERT图
    • 在这里插入图片描述

    • 优点

      • PERT图不仅给出了每个任务的开始时间结束时间和完成该任务所需的时间
      • 还给出了任务之间的关系,即哪些任务完成后才能开始另外一些任务
      • 以及如期完成整个工程的关键路径
      • 图中的松弛时间则反映了完成某些任务时可以推迟其开始时间或延长其完成所需的时间。
        • 图中松弛时间为0的这些任务是完成整个工程的关键路径,1 → 2 → 3 → 4 → 6 → 8 → 10 → 11
    • 缺点

      • PERT图不能反映任务之间的并行关系

10.4.2 软件项目管理-人员管理之组织形式

  • 程序设计小组的组织形式可以有多种,如主程序员组、 无主程序员组和层次式程序员组等。
  • (1) 主程序员组
    • 主程序员组由一名主程序员、 一名后备程序员、 一名资料员和若干名程序员组成。
    • 优点
      • 这种组织形式便于集中领导,步调统一,容易按规范办事
    • 缺点
      • 不利于发挥个人的积极性。
  • (2) 无主程序员组
    • 无主程序员组中的成员之间相互平等,工作目标和决策都由全体成员民主讨论,根据需要也可以轮流坐庄。
    • 优点
      • 这种组民主气氛比较足,依赖个人的成分少,有利于发挥每个人的积极性
    • 缺点
      • 但这种组中交流量大,往往职责不明确,出了问题谁也不负责,而且不利于与外界的联系。
  • (3) 层次式程序员组。
    • 层次式组中有一位组长,组长负责全面的工作,他领导若干名高级程序员,每个高级程序员又领导若干名程序员。
    • 适用场景
      • 这种组适合于具有层次结构特点的更大型的软件项目,该项目可分成若干个子项目,每个高级程序员负责一个子项目,然后再对子项目分解,并分配给程序员。

10.5 需求分析

10.5.1 需求分析的任务

  • 需求分析主要是确定待开发软件的功能、 性能、 数据和界面等要求。具体来说,可有以下五个方面:
    • (1) 确定软件系统的综合要求
    • (2) 分析软件系统的数据要求
      • 包括基本元素、 数据元素之间的逻辑关系、 数据量和峰值等。常用的数据描述方法是实体-关系模型(E-R模型) 。
    • (3) 导出系统的逻辑模型
      • 在结构化分析方法中可用数据流图来描述; 在面向对象分析方法中可用类模型来描述。
    • (4) 修正项目开发计划
    • (5) 如有必要,可开发一个原型系统
      • 对一些需求不够明确的软件,可以先开发一个原型系统,以验证用户的需求。

10.5.2 需求的分类

  • 软件需求包括功能需求、 非功能需求和设计约束三方面的内容。
    • (1) 功能需求
      • 所开发的软件必须具备什么样的功能。
    • (2) 非功能需求
      • 是指产品必须具备的属性或品质,如可靠性、 性能、 响应时间、 容错性和扩展性等。
    • (3) 设计约束
      • 也称为限制条件、 补充规约,这通常是对解决方案的一些约束说明。

10.6 结构化分析方法

  • 结构化分析(Structured Analysis, SA)方法是一种面向数据流的需求分析方法,适用于分析大型数据处理系统,是一种简单、 实用的方法,现在已经得到广泛的使用。
  • 结构化分析方法的基本思想是自顶向下、 逐层分解
  • 分解和抽象是人们控制问题复杂性的两种基本手段。
    • 对于一个复杂的问题,人们很难一下子考虑问题的所有方面和全部细节,通常可以把一个大问题分解成若干个小问题,每个小问题再分解成若干个更小的问题,经过多次逐层分解,每个最底层的问题都是足够简单,容易解决的,于是复杂的问题也就迎刃而解了。这个过程就是分解的过程。
  • SA方法的分析结果由以下几部分组成:一套分层的数据流图、 一本数据字典、 一组小说明(也
    称加工逻辑说明) 、 补充材料。

10.7 面向对象分析方法

10.7.1 面向对象的基本概念

  • 对象
    • 在面向对象的系统中,对象是基本的运行时的实体,它既包括数据(属性) ,也包括作用于数据的操作(行为) 。
  • 消息
    • 对象之间进行通信的一种构造叫作消息。
    • 一个类定义了一组大体上相似的对象。类是在对象之上的抽象,对象是类的具体化,是类的实例
  • 继承
    • 继承是父类和子类之间共享数据和方法的机制。这是类之间的一种关系,在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
  • 多态
    • 在收到消息时,对象要予以响应。不同的对象收到同一消息可以产生完全不同的结果,这一现象叫作多态。
    • 客户类无需知道所调用方法的特定子类的实现。
  • 动态绑定和静态绑定
    • 绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。
    • 在一般的程序设计语言中,绑定是在编译时进行的,叫作静态绑定。动态绑定则是在运行时进行的,
    • 因此,一个给定的过程调用和代码的结合直到调用发生时才进行。

10.7.2 UML 2.0

  • 包括13种图,常见的图:
  • (1) 类图
    • 类图描述一组类、 接口、 协作和它们之间的关系
  • (2) 对象图
    • 对象图描述一组对象及它们之间的关系。对象图描述了在类图中所建立的事物的实例的静态快照
  • (3) 用例图
    • 用例图描述一组用例、 参与者与它们之间的关系。
  • (4) 序列图
    • 序列图是一种交互图,交互图展现了一种交互,它由一组对象或参与者以及它们之间可能发送的消息构成。交互图专注于系统的动态视图。序列图是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动,是强调消息的时间次序的交互图。
  • (5) 通信图
    • 通信图也是一种交互图,它强调收发消息的对象或参与者的结构组织。序列图强调的是时序,通信图强调的是对象之间的组织结构(关系)。
  • (6) 状态图
    • 状态图描述一个状态机,它由状态、 转换、 事件和活动组成。状态图关注系统的动态视图。
  • (7) 活动图
    • 活动图是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程。活动图专注于系统的动态视图,它强调对象间的控制流程。
  • (8) 构件图
    • 构件图描述一组构件之间的组织和依赖。构件图专注于系统的静态实现视图。它与类图相关,通常把构件映射为一个或多个类、 接口或协作。
  • (9) 部署图
    • 部署图描述了运行时的处理节点以及其中的构件的配置。部署图给出了体系结构的静态实施视图。它与构件图相关,通常一个节点包含一个或多个构件。

10.8 数据流图

• 数据流图(DFD) 是结构化分析方法中用来描述系统的逻辑模型的。它是面向数据流来建模的。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • (1) 数据流
    • 由一组固定成分的数据组成,表示数据的流向。DFD中描述的是数据流,而不是控制流。除了流向数据存储或从数据存储流出的数据流不必命名外,每个数据流都必须有一个合适的名字,以反映该数据流的含义。
  • (2) 加工
    • 描述了输入数据流到输出数据流之间的变换,也就是输入数据流经过什么处理后变成了输出数据流。每个加工有一个名字和编号。编号能反映出该加工位于分层DFD中的哪个层次和哪张图中,也能够看出它是哪个加工分解出来的子加工
  • (3) 数据存储
    • 数据存储用来表示存储的数据,每个数据存储都有一个名字。(…表或…信息表或…文件)
  • (4) 外部实体
    • 外部实体是指存在于系统之外的人员或组织或其它系统,它指出系统所需数据的发源地和系统所产生的数据的归宿地。

10.9 系统设计

  • 系统设计的主要目的就是为系统制定蓝图,在各种技术和实施方法中权衡利弊,精心设计,合理使用各种资源,最终勾画出新系统的详细设计方案。
  • 系统设计分为概要设计和详细设计。

10.9.1 概要设计的基本任务

  • (1) 设计软件系统总体结构
    • 将一个复杂的系统按功能划分成模块; 确定每个模块的功能; 确定模块之间的调用关系; 确定模块之间的接口,即模块之间传递的信息; 评价模块结构的质量。
  • (2) 数据结构及数据库设计
  • (3) 编写概要设计文档
    • 文档主要有概要设计说明书、 数据库设计说明书、 用户手册以及修订测试计划。
  • (4) 评审
    • 对设计部分是否完整地实现了需求中规定的功能、 性能等要求进行评审

10.9.2 详细设计的基本任务

  • 详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统。
  • (1) 对每个模块进行详细的算法设计。
  • (2) 对模块内的数据结构进行设计。
  • (3) 对数据库进行物理设计,即确定数据库的物理结构。
  • (4) 其他设计。
  • (5) 编写详细设计说明书。
  • (6) 评审
    • 对处理过程的算法和数据库的物理结构都要评审。

10.10 系统设计的基本原理

  • 抽象
    • 抽象是一种技术,重点说明一个实体的本质方面,而忽略或者掩盖不很重要或非本质的方面。
  • 模块化
    • 在软件的体系结构中,模块是可组合、 分解和更换的单元。模块化是指将一个待开发的软件分解成若干个小的简单部分——模块,每个模块可独立地开发、 测试,最后组装成完整的程序。模块化的目的是使程序的结构清晰,容易阅读、 理解、 测试和修改。
  • 信息隐蔽
    • 信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封闭在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。信息隐蔽原则对提高软件的可修改性、 可测试性和可移植性都有重要的作用。
  • 模块独立
    • 模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。
    • 衡量模块独立程度的标准有两个:耦合性和内聚性。
    • (1) 耦合性
      • 耦合性是指模块之间联系的紧密程度。耦合性越高,则模块的独立性越差。
      • 1) 无直接耦合
        • 指两个模块间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。
      • 2) 数据耦合
        • 指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递
      • 3) 标记耦合
        • 两个模块之间传递的是数据结构,如高级语言中的数据组名、 记录名、 文件名等这些名字即为标记。
        • 如模块A给模块B传递数据结构x。
      • 4) 控制耦合
        • 指一个模块调用另一个模块时,传递的是控制变量,被调模块通过该控制变量的值有选择地执行块内的某一功能。
      • 5) 公共耦合
        • 指通过一个公共数据环境相互作用的那些模块之间的耦合。
      • 6) 内容耦合
        • 是耦合性程度最高的。当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部,这种模块之间的耦合为内容耦合。
    • (2)内聚
      • 内聚是指模块内部各元素之间联系的紧密程度,例如一个完成多个功能的模块的内聚度就比完成单一功能的模块的内聚度低。内聚度越低,模块的独立性越差。
      • 1) 偶然内聚
        • 指一个模块内的各个处理元素之间没有任何联系。
      • 2) 逻辑内聚
        • 指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
      • 3) 时间内聚
        • 把需要同时执行的动作组合在一起形成的模块为时间内聚模块。
      • 4) 通信内聚
        • 指模块内所有处理元素都在同一个数据结构上操作,或者指各处理使用相同的输入数据或产生相同的输出数据。
      • 5) 顺序内聚
        • 指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入。
      • 6) 功能内聚
        • 这是最强的内聚,指模块内所有元素共同完成一个功能,缺一不可。将软件系统划分模块时,尽量做到高内聚、 低耦合,提高模块的独立性。

10.11 系统测试基础知识

  • 系统测试的目的是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。
  • 在进行信息系统测试时应遵循以下基本原则:
    • (1) 应尽早并不断地进行测试。测试不是在应用系统开发完之后才进行的。
    • (2) 测试工作应避免由原开发软件的人或小组承担。
    • (3) 设计测试方案时,不仅要确定输入数据,而且要根据系统功能确定预期输出结果,将实际输出结果与预期结果相比较就能发现测试对象是否正确。
    • (4) 在设计测试用例时,不仅要设计有效合理的输入条件,也要包含不合理、 失效的输入条件。
    • (5) 在测试程序时,不仅要检验程序是否做了该做的事,还要检验程序是否做了不该做的事。
    • (6) 严格按照测试计划来进行,避免测试的随意性。
    • (7) 妥善保存测试计划、 测试用例,作为软件文档的组成部分,为维护提供方便。
    • (8) 测试例子都是精心设计出来的,可以为重新测试或追加测试提供方便。
  • 测试的类型:软件测试可分为单元测试、 集成测试、 确认测试、 系统测试和回归测试等类别。
    • (1) 单元测试
      • 单元测试也称为模块测试。单元测试侧重于模块中的内部处理逻辑结构和数据结构。
    • (2) 集成测试
      • 集成测试的目的是检查模块之间,以及模块和已集成的软件之间的接口关系。并验证已集成的软件是否符合设计要求。
    • (3) 确认测试
      • 确认测试主要用于验证软件的功能、 性能和其他特性是否与用户需求一致。
    • (4) 系统测试
      • 系统测试的对象是完整的、 集成的计算机系统,系统测试的目的是在真实系统工作环境下,验证完整的软件配置项能否和系统正确连接,并满足系统/子系统设计文档和软件开发合同规定的要求。技术依据是用户需求或开发合同。
    • (5) 回归测试
      • 回归测试的目的是测试软件变更之后, 变更部分的正确性和对变更需求的符合性,以及软件原有的、 正确的功能、 性能和其他规定的要求的不损害性

10.12 软件测试方法

  • 黑盒测试法
    • 黑盒测试也称为功能测试,在完全不考虑软件的内部结构和特性的情况下,测试软件的外部特性。主要用于集成测试、 确认测试和系统测试中。
    • 常用的黑盒测试技术有:等价类划分、 边界值分析、 错误推测和因果图等。
  • 白盒测试法
    • 白盒测试也称为结构测试,主要用于软件单元测试中。它的主要思想是将程序看作是一个透明的白盒,测试人员完全清楚程序的结构和处理算法,按照程序内部逻辑结构设计测试用例
    • 白盒测试常用的技术是逻辑覆盖,循环覆盖和基本路径测试
    • 主要的逻辑覆盖标准有语句覆盖、判定覆盖、 条件覆盖、 条件/判定覆盖、 条件组合覆盖、 路径覆盖等。

10.13 系统维护

  • 系统的可维护性可定义为:维护人员理解、 改正、 改动和改进这个软件的难易程度。
  • 系统可维护性的评价指标:
    • 1) 可理解性:是指别人能理解系统的结构、 界面、 功能和内部过程的难易程度。
    • 2) 可测试性:诊断和测试的容易程度取决于易理解的程度。
    • 3) 可修改性:模块的耦合、 内聚、 作用范围与控制范围的关系等,都对可修改性有影响。
  • 软件维护的一般内容:
    • (1) 正确性维护:是指改正在系统开发阶段已发生而系统测试阶段尚未发现的错误。
    • (2) 适应性维护:是指使应用软件适应信息技术变化和管理需求变化而进行的修改。
    • (3) 完善性维护:这是为扩充功能和改善性能而进行的修改,主要是指对已有的软件系统增加一些在系统分析和设计阶段中没有规定的功能与性能特征。这些功能对完善系统功能是非常必要的。
    • (4) 预防性维护:为了改进应用软件的可靠性和可维护性,为了适应未来的软硬件环境的变化,应主动增加预防性的新的功能。

第十一章 数据库设计

11.1 数据库设计概述

11.1.1 数据库应用系统的生命期

  • 数据库应用系统的生命周期分为数据库规划、 需求描述与分析、 数据库与应用程序设计、 数据库设计实现、 测试、 运行维护6个阶段。
    • 1、 数据库规划
      • 数据库规划的任务是确定软件的开发目标及可行性。该阶段应该给出问题定义、 可行性分析和项目开发计划。
    • 2、 需求描述与分析
      • 需求描述与分析是以用户的角度,从系统中的数据和业务规则入手,收集和整理用户的信息,以特定的方式加以描述,是下一步工作的基础。
    • 3、 数据库与应用程序设计
      • 数据库的设计是对用户数据的组织和存储设计; 应用程序设计是在数据库设计基础上对数据操作及业务实现的设计,包括事务设计和用户界面设计。
    • 4、 数据库设计实现
      • 数据库设计实现是依照设计,使用DBMS支持的数据定义语言实现数据库的建立,用高级语言编写应用程序。
    • 5、 测试
      • 测试是在数据库系统投入使用之前,通过精心制订的测试计划和测试数据来测试系统的性能是否满足设计要求,以便发现问题。
    • 6、 运行维护
      • 数据库应用系统经过测试、 试运行后即可正式投入运行。运行维护是系统投入使用后,必须不断地对其进行评价、 调整和修改,直至系统消亡。

11.1.2 数据库设计的一般策略

  • 数据库设计的一般策略有两种:自顶向下和自底向上。

11.1.3 数据库设计的基本步骤

  • 一般将数据库设计分为如下6个阶段:
    • (1) 用户需求分析
    • (2) 概念结构设计
    • (3) 逻辑结构设计
    • (4) 物理结构设计
    • (5) 数据库实施阶段
    • (6) 数据库运行和维护阶段

11.2 系统需求分析

在这里插入图片描述

11.2.1 需求分析的任务、 方法和目标

  • 需求分析阶段的任务:综合各个用户的应用需求,对现实世界要处理的对象(组织、 部门和企业等) 进行详细调查,在了解现行系统的概况,确定新系统功能的过程中,收集支持系统目标的基础数据及处理方法。
  • (1) 信息要求
    • 用户需要在系统中保存哪些信息,由这些保存的信息要得到什么样的信息,这些信息以及信息间应当满足的完整性要求。
  • (2) 处理要求
    • 用户在系统中要实现什么样的操作功能,对保存信息的处理过程和方式,各种操作处理的频度、 响应时间要求、 处理方式等以及处理过程中的安全性要求和完整性要求。
  • (3) 系统要求
    • 包括安全性要求、 使用方式要求和可扩充性要求。安全性要求:系统有几种用户使用,每一种用户的使用权限如何。使用方式要求:用户的使用环境是什么,平均有多少用户同时使用,最高峰有多少用户同时使用,有无查询相应的时间要求等。可扩充性要求:对未来功能、 性能和应用访问的可扩充性的要求。

11.2.2 需求分析阶段的文档

  • 需求分析阶段的成果是系统需求说明书,主要包括数据流图、 数据字典、 各种说明性表格、 统计输出表和系统功能结构图等。
  • 数据字典(Data Dictionary,DD)是各类数据描述的集合,它是关于数据库中数据的描述,即元数据,而不是数据本身。 如用户将向数据库中输入什么信息,从数据库中要得到什么信息,各类信息的内容和结构,信息之间的联系等。
  • 数据字典包括数据项、 数据结构、 数据流、 数据存储和处理过程5个部分。

11.3 概念结构设计

  • 概念结构设计是在需求分析的基础上,依照需求分析中的信息要求,对用户信息加以分类、 聚集和概括,建立信息模型。
  • 概念结构设计最著名最常用的方法是实体-联系方法,简称E-R方法。 它将现实世界的信息结构统一用实体、 属性以及实体之间的联系来描述。
  • 概念结构设计工作步骤包括:选择局部应用、 逐一设计分E-R图和E-R图合并。
    • 抽象 → 设计局部视图 → 合并取消冲突 → 修改重构消除冗余
    • 1、选择局部应用
      • 选择适当层次的数据流图,让这一层的每一部分对应一个局部应用,实现某一项功能,从这一层入手,就能很好地设计分E-R图。
    • 2、 逐一设计分E-R图
      • 划分好各个局部应用之后,就要对每一个局部应用逐一设计分E-R图,又称为局部E-R图。现实生活中许多事物,作为实体还是属性没有明确的界定,这需要根据具体情况而定,一般遵循以下两条准则:
        • (1) 属性不可再分,即属性不再具有需要描述的性质,不能有属性的属性。
        • (2) 属性不能与其他实体发生联系,联系是实体与实体间的联系。
    • 3、 E-R图合并
      • 根据局部应用设计好各局部E-R图之后,就可以对各分E-R图进行合并。 合并的目的在于解决冲突,消除冗余。
      • 分E-R图合并时,它们之间存在的冲突主要有以下三类:
        • (1) 属性冲突:同一属性可能会存在于不同的分E-R图中,由于设计人员不同或是出发点不同,对属性的类型、 取值范围、 数据单位等可能会不一致。
        • (2) 命名冲突:相同意义的属性,在不同的分E-R图上有着不同的命名,或是名称相同的属性在不同的分E-R图中代表着不同的意义,这些也需要进行统一。
        • (3) 结构冲突:同一实体在不同的分E-R图中有不同的属性,同一对象在某一分E-R图中被抽象为实体而在另一分E-R图中又被抽象为属性。

在这里插入图片描述

11.4 逻辑结构设计

  • 逻辑结构设计就是在概念结构设计的基础上进行数据模型设计,可以是层次模型、网状模型和关系模型。
  • 逻辑结构设计阶段的主要工作步骤包括确定数据模型、 将E-R图转换成指定的数据模型、 确定完整性约束和确定用户视图。
    在这里插入图片描述

11.4.1 E-R图向关系模式的转换

  • 1、 实体向关系模式的转换

    • ER图中的每一个实体单独转换成一个关系模式
      • 对于多值属性采用的方法是将实体的码和每个多值属性独立构成一个关系模式,得到的关系模式属于4NF
    • 实体名对应关系模式的名称
    • 实体的属性转换为关系模式的属性
    • 实体标识符就是关系的码。
    • 如:
      • 班主任(工号,姓名,身份证号,住址)
      • 班级(班级编号,名称,人数)
      • 在这里插入图片描述
  • 2、 一对一联系的转换(1:1):

    • 通常一对一联系不需要将其转换为一个独立的关系模式,只需要将联系归并到关联的两个实体的任意一方,给待归并的一方实体属性集中增加另一方实体的码和该联系的属性即可,归并后的实体码保持不变。
    • 班主任(工号,姓名,身份证号,住址,班级编号,任职时间)
    • 或:班级(班级编号,名称,人数,班主任工号,任职时间)
    • 在这里插入图片描述
  • 3、 一对多联系的转换(1:*):

    • 通常一对多联系也不需要将其转换为一个独立的关系模式,只需要将联系归并到关联的两个实体的多方,给待归并的多方实体属性集中增加一方实体的码和该联系的属性即可,归并后的多方实体码保持不变。
    • 员工(工号,姓名,身份证号,公司编号,入职时间,离职时间)
    • 在这里插入图片描述
  • 4、 多对多联系的转换(*:*):

    • 多对多联系只能转换成一个独立的关系模式,关系模式的名称取联系的名称,关系模式的属性取该联系所关联的两个多方实体的码及联系的属性,关系的码是多方实体的码构成的属性组。
    • 选修(学号,课程编号,成绩,出勤率)
    • 在这里插入图片描述
  • 5、 多对多对多联系的转换(*:*:*):

    • 三方联系的多对多对多(*:*:*) 也是一样,只能转换成一个独立的关系模式,关系模式的属性取三方实体的码及联系的属性,关系模式的码为三方实体的码组成的属性组。 如:一个供应商可以给多个项目供应多种零件,一个项目可以使用多个供应商供应的多种零件。
    • 供应(供应商编号,项目编号,零件编号,供应数量)
    • 在这里插入图片描述
  • 6、 一些特殊情况:

    • 假设被检测者可以选择一家或多家医院做核酸检测,但是同一天只做一次核酸检测。
    • 检测(医院名称,被检测者身份证号,检测日期,检测结果)
    • 在这里插入图片描述
    • 接种(被接种者身份证号,接种日期,医院名称,供应商名称)
    • 在这里插入图片描述

11.4.2 关系模式的规范化

  • 由E-R图转换得来的初始关系模式并不能完全符合要求,还会有数据冗余、 更新异常存在,这就需要经过进一步的规范化处理。
  • (1) 根据语义确定各关系模式的数据依赖。
  • (2) 根据数据依赖确定关系模式的范式,判断关系模式是否达到了3NF或4NF。
  • (3) 如果关系模式不符合要求,要进行分解,达到3NF、 BCNF或4NF。
  • (4) 关系模式的评价及修正。 有时根据处理要求,可能还需要增加部分冗余以满足处理要求,这就需要做部分关系模式的处理,分解、 合并或增加冗余属性,提高存储效率和处理效率。

11.4.3 确定完整性约束

11.4.4 用户视图的确定

  • (1) 根据数据流图确定处理过程使用的视图。
  • (2) 根据用户类别确定不同用户使用的视图。

11.5 数据库的物理设计

  • 数据库在物理设备上的存储结构与存取方法称为数据库的物理结构,它依赖于给定的计算机系统。 为一个给定的逻辑数据模型设计一个最适合应用要求的物理结构的过程,就是数据库的物理设计。

11.5.1 数据库物理设计工作过程

在这里插入图片描述

11.5.2 数据库物理设计工作步骤

  • 物理设计的主要工作步骤包括:确定数据分布、 存储结构和访问方式。
  • 1、 确定数据分布
    • (1) 根据不同应用分布数据。
    • (2) 根据处理要求确定数据的分布。
    • (3) 对数据的分布存储必然会导致数据的逻辑结构的变化,要对关系模式做新的调整,回到数据库逻辑设计阶段做必要的修改。
  • 2、 确定数据的存储结构
    • 存储结构具体指数据文件中记录之间的物理结构。
    • 为提高数据的访问速度,通常会采用索引技术。
      • 在物理设计阶段,要根据数据处理和修改要求,确定数据库文件的索引字段索引类型
  • 3、 确定数据的访问方式
    • (1) 存储记录结构设计。
    • (2) 存储记录布局。
    • (3) 存取方法的设计。

11.6 数据库运行维护与管理

  • 1、 数据库重组和重构
    • 数据库重组
      • 在不改变数据库逻辑和物理结构的情况下,去除数据库存储文件中的废弃空间以及碎片空间中的指针链,使数据库记录在物理上紧连。
    • 数据库重构
      • 数据库系统运行过程中,会因为一些原因而对数据库的结构做修改。
      • 重构包括表结构的修改和视图的修改。
  • 2、 数据库系统的审计
    • 审计是一种DBMS工具,它记录数据库资源和权限的使用情况。 启用审计功能,可以产生审计跟踪信息,包括哪些数据库对象受到了影响,谁在什么时候执行了这些操作。
    • 审计是被动的,它只能跟踪对数据库的修改而不能防止,但作为一个安全性手段,起到对非法入侵的威慑作用,可以据此追究非法入侵者的法律责任。
    • 审计功能的开启会影响系统的性能。
  • 3、 数据库的存储管理
    • 在数据库系统运行过程中,随着数据的不断变更,会影响到系统的响应效率。 通过以下手段进行存储管理,可有效地提高系统性能。
    • (1) 索引文件和数据文件分开存储,事务日志文件存储在高速设备上。
    • (2) 适时修改数据文件和索引文件的页面大小。
    • (3) 定期对数据进行排序。
    • (4) 增加必要的索引项。
  • 4、 数据安全性管理
    • (1) 建立网络安全,主要是防火墙的设置。
    • (2) 操作系统级安全,进行登录用户的管理。
    • (3) DBMS级安全,对访问数据库的用户进行密码验证。
    • (4) 角色和用户的授权管理。
    • (5) 建立视图和存储过程加强安全性。
    • (6) 使用审计功能,为追究非法入侵者法律责任提供证据,发现安全漏洞。
  • 5、 SQL语句的编码检验
    • (1) 尽可能地减少多表查询或建立物化视图
    • (2) 以不相关子查询替代相关子查询
    • (3) 只检索需要的列。
    • (4) 用带IN的条件子句等价替换OR子句
    • (5) 经常提交COMMIT,以尽早释放锁
  • 6、 表设计的评价
    • (1) 如果频繁的访问是对两个相关的表进行连接操作,则考虑将其合并。
    • (2) 如果频繁的访问只是在表中的某一部分字段上进行,则考虑分解表,将该部分单独作为一个表。
    • (3) 对于更新很少的表,引入物化视图。
  • 7、 索引维护和改进
    • (1) 如果查询是瓶颈,则在关系上建立适应的索引,通常在作为查询条件的属性上建立索引,可以提高查询效率。
    • (2) 如果更新是瓶颈,每次更新都会重建表上的索引,引起效率的降低,则考虑删除某些索引。
    • (3) 选择适当的索引类型,如果是经常使用范围查询,则B树索引比散列索引更高效
    • (4) 将有利于大多数据查询和更新的索引设为聚簇索引。

第十二章 事务管理

12.1 事务的基本概念

12.1.1 事务

  • 是一系列的数据库操作,是数据库应用程序的逻辑单位,即应用程序对数据库的操作都应该以事务的方式进行,是恢复和并发控制的基本单位
  • 事务是一个操作序列,这些操作“要么都做,要么都不做” 。具有ACID特性。
  • 事务定义的语句如下:
    • (1) BEGIN TRANSACTION:事务开始。
    • (2) END TRANSACTION:事务结束。
    • (3) COMMIT:事务提交。 该操作表示事务成功地结束,它将通知事务管理器该事务的所有更新操作现在可以被提交或永久地保留。
    • (4) ROLLBACK:事务回滚。 该操作表示事务非成功地结束,它将通知事务管理器出故障了,数据库可能处于不一致状态,该事务的所有更新操作必须回滚或撤销。
例:从账户A转入账户B金额x元。
BEGIN TRANSACTION // 事务开始
read(A); // 读账户A的余额
A=A-x; // A账户金额减去x元
IF(A<0) THEN
print (“金额不足,不能转账”) ;
ROLLBACK; // 撤销该事务,回到事务执行前的状态
ELSE
write(A); // 写入账户A的余额
read(B); // 读账户B的余额
B=B+x;
write(B);
COMMIT; // 提交事务
ENDIF;
END TRANSACTION // 事务结束
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

12.1.2 SQL中事务的开始与结束

  • SQL标准规定当一条SQL语句被执行,就隐式地开始了一个事务,SQL中的Commit work和Rollback work语句之一会结束一个事务。
    • (1) Commit work:提交当前事务。 这意味着该事务所做的更新在数据库中永久保存。 一但事务被提交后,一个新的事务自动开始。
    • (2) Rollback work:回滚当前事务。 这意味着将撤销该事务对数据库的更新。
  • 注意:如果事务已经执行了Commit work,就不能再用Rollback来撤销

12.1.3 事务的特性

  • 事务具4个特性:原子性、 一致性、 隔离性和持久性。
  • 1、 原子性
    • 事务的所有操作在数据库中要么都做要么都不做
  • 2、 一致性
    • 一个事务独立执行的结果,将保持数据的一致性,即数据不会因为事务的执行而遭受破坏
  • 3、 隔离性
    • 一个事务的执行不能被其他事务干扰
    • 并发事务在执行过程中可能会对同一数据进行操作,这些事务的操作应该不会相互干扰,是相互隔离的。
  • 4、 持久性
    • 一个事务一旦提交,它对数据库的改变必须是永久的,即使系统出现故障也是如此。

12.1.4 事务的状态

  • 事务是数据库的基本执行单元,如果事务成功执行,则数据库从一个一致状态进入另一个一致状态。 如果因为某种原因事务没能成功执行,但其已经对数据库进行了修改,这时候可能会导致数据库处于不一致的状态,需要对事务已经造成的变更进行撤销(回滚) 。
    • 1、 活动状态
      • 事务的初始状态,事务执行时处于这个状态。
    • 2、 部分提交状态
      • 当操作序列的最后一条语句执行后,事务就处于部分提交状态。这时,事务虽然已经完全执行,但由于实际输出可能还临时驻留在内存中,在事务成功完成前还有可能出现硬件故障,因此,部分提交状态并不等于事务成功执行。
    • 3、 失败状态
      • 由于硬件或逻辑错误,使得事务不能继续正常执行,事务就进入了失败状态,处于失败状态的事务必须回滚。 这样,事务就进入了中止状态。
    • 4、 中止状态
      • 事务回滚并且数据库恢复到事务开始执行前的状态。
    • 5、 提交状态
      • 当事务成功完成后,称事务处于提交状态。 只有事务处于提交状态后,才能说事务已经提交。
  • 事务的状态转换:
    • 在这里插入图片描述
    • BEGIN TRANSACTION
      • 开始运行事务,使事务进入活动状态
    • END TRANSACTION
      • 说明事物中的所有读写操作都已完成,使事务进入部分提交状态,把事务的所有操作对数据库的影响存入数据库。
    • COMMIT
      • 标志事务已经成功地完成,事务中的所有操作对数据库的影响已经安全地存入数据库,事务进入提交状态,结束事务的运行。
    • ABORT
      • 标志事务进入失败状态,系统撤销事务中所有操作对数据库和其他事务的影响,结束事务的运行。

12.2 数据库的并发控制

12.2.1 事务调度

  • 串行调度

    • 是指多个事务依次串行执行,且只有当一个事务的所有操作都执行完成才执行另一个事务的所有操作。
    • 例:有两个事务T0和T1,事务T0从账号A转2000元到账号B; 事务T1从账号A转20%的款到账号B。 T0和T1的定义如下所示。
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 并发调度

    • 利用分时的方法同时处理多个事务
    • 在这里插入图片描述
  • 可恢复调度

    • 指满足这样的条件的调度:当事务Tj要读事务Ti写的数据时,Ti事务必须要先于事务Tj提交。
    • 在这里插入图片描述

12.2.2 并发操作带来的问题

  • 并发操作带来的数据不一致性有三类:丢失修改、 不可重复读和读脏数据。
  • 1、 丢失修改
    • 两个事务对同一个数据进行修改,导致事务A对数据库的修改被事务B的修改所覆盖
    • 在这里插入图片描述
  • 2、 不可重复读
    • 事务对同一数据进行两次读取的结果不同。 原因是两次读取的间隙数据被另一事务修改了
    • 如下图破坏了事务T1的隔离性。
    • 在这里插入图片描述
  • 3、 读脏数据
    • 某事务读取的数据是其它事务修改后的值,但该修改后来又被撤销了。
    • 在这里插入图片描述

12.2.3 并发调度的可串行性

  • 多个事务的并发执行是正确的,当且仅当其结果与某一次序串行地执行它们的结果相同,称这种调度策略是可串行化的调度。
  • 可串行性是并发事务正确性的准则。 即:一个给定的并发调度,当且仅当它是可串行化的才认为是正确调度。

12.2.4 并发控制技术

  • 并发事务如果对数据读写时不加以控制,会破坏事务的隔离性和一致性。 为了保持事务的隔离性,系统必须对事务之间的相互作用加以控制,最典型的方式就是加锁。
  • 1、 排它锁(Exclusive Locks, 简称X锁)
    • 也称为写锁
    • 用于对数据进行写操作时进行锁定。
    • 如果事务T对数据A加上X锁后,就只允许事务T对数据A进行读取和修改,其他事务对数据A不能再加任何锁,也不能读取和修改数据A,直到事务T释放A上的锁。
  • 2、 共享锁(Share Locks, 简称S锁)
    • 也称为读锁
    • 用于对数据进行读操作时进行锁定。
    • 如果事务T对数据A加上S锁后,事务T就只能读数据A但不可以修改,其他事务可以再对数据A加S锁来读取,只要数据A上有了S锁,任何事务都只能再对其加S锁读取而不能加X锁修改
      在这里插入图片描述

12.2.5 封锁协议

  • (1) 一级封锁协议
    • 是指事务T在修改数据A之前必须先对其加X锁,直到事务结束才释放X锁。 解决了丢失修改的问题。
  • (2) 二级封锁协议
    • 一级封锁协议加上事务T在读取数据A之前必须对其加上S锁,读完后即可释放S锁。 解决了读脏数据的问题。
  • (3) 三级封锁协议
    • 一级封锁协议加上事务T在读取数据A之前必须对其加上S锁,直到事务结束才释放S锁。 解决了不可重复读的问题。
      在这里插入图片描述

12.2.6 两段锁协议

  • 是指同一事务对任何数据进行读写之前必须对该数据加锁;在释放一个封锁之后,该事务不再申请和获得任何其他封锁。
  • 所谓“两段” 的含义是:事务分为两个阶段。 第一阶段是获得封锁,也称为扩展阶段。 第二阶段是释放封锁,也称为收缩阶段。
  • 例:
    • T1:Slock A…Slock B…Xlock C…Unlock B…Unlock A…Unlock C
    • T2:Slock A…Unlock A…Slock B…Xlock C…Unlock C…Unlock B
  • 如果事务遵循两段锁协议,那么它们的并发调度是可串行化的。 两段锁是可串行化的充分条件,但不是必要条件。
    • 即:遵循两段锁协议,一定是可串行化的; 不遵循两段锁协议,可能是可串行化的,也可能不是
  • 注意:采用两段锁协议也有可能产生死锁,这是因为每个事务都不能及时解除被封锁的数据,可能会导致多个事务都要求对方已经封锁的数据而不能继续运行。

12.2.7 事务的隔离级别

  • 1、 READ UNCOMMITTED(读未提交)
    • 可避免丢失修改。
  • 2、 READ COMMITTED(读已提交)
    • 可避免丢失修改、 读脏数据。
  • 3、 REPEATABLE READ(可重复读)
    • 可避免丢失修改、 读脏数据,不可重复读。
  • 4、 SERIALIZABLE(串行化)
    • 最高级别,可避免丢失修改、 读脏数据、 不可重复读、 幻读。
  • 幻读
    • 事务A查询得到N条数据,然后事务B又插入了M条数据,或者改变了这N条数据之外的M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。
    • 简单理解脏读是读错值,幻读是行数变更

12.3 数据库的备份与恢复

12.3.1 数据库系统故障种类

  • 1、事务故障
    • 是由于程序执行错误而引起事务非预期的、 异常终止的故障。 通常有如下两类错误引起事务执行失败:
    • (1) 逻辑错误。 如非法输入、 找不到数据、 溢出、 超出资源限制等原因引起的事务执行失败。
    • (2) 系统错误。 系统进入一种不良状态(如死锁) ,导致事务无法继续执行。
  • 2、 系统故障
    • 是指硬件故障、 软件(如DBMS、 OS或应用程序) 漏洞的影响,导致丢失了内存中的信息,影响正在执行的事务,但未破坏存储在外存上的信息。
    • 恢复仅需要使用日志不需要使用备份
  • 3、 介质故障
    • 是指数据库的存储介质发生故障,如磁盘损坏、 瞬间强磁场干扰等。 这种故障直接破坏了数据库,会影响到所有正在读取这部分数据的事务。

12.3.2 数据库备份

  • 数据转储是将数据库自制到另一个磁盘或磁带上保存起来的过程,又称为数据备份。
  • (1) 静态转储和动态转储
    • 静态转储是指在转储期间不允许对数据库进行任何存取、 修改操作
    • 动态转储是在转储期间允许对数据库进行存取、 修改操作
    • 因此,转储和用户事务可并发执行
      • 假如系统中有运行的事务,如果转储全部数据库应采用动态增量转储。
  • (2) 海量转储和增量转储
    • 海量转储是指每次转储全部数据; 增量转储是指每次只转储上次转储后更新过的数据。
  • (3) 日志文件
    • 在事务处理的过程中,DBMS把事务开始、 事务结束以及对数据库的插入、 删除和修改的每一次操作写入日志文件。
  • (4) 数据库镜像
    • 为了避免磁盘介质出现故障影响数据库的可用性,许多DBMS提供数据库镜像功能用于数据库恢复。

12.3.3 数据库恢复

  • 要使数据库在发生故障后能够恢复,必须建立冗余数据,在故障发生后利用这些冗余数据实施数据库恢笔,常用的是数据转储和日志文件。

  • 数据库恢复基本原理是冗余

  • 1、 故障恢复的两个操作:

    • (1) 撤销事务(UNDO)
      • 将未完成的事务撤销,使数据库恢复到事务执行前的正确状态。
      • 撤销事务的过程:反向扫描日志文件(由后向前扫描) ,查找事务的更新操作; 对该事务的更新操作执行逆操作,用日志文件记录中更新前的值写入数据库,插入的记录从数据库中删除,删除的记录重新插入数据库中; 继续反向扫描日志文件,查找该事务的其它更新操作并执行逆操作直至事务开始标志。
    • (2) 重做事务(REDO)
      • 将已提交的事务重新执行
      • 重做事务的过程:从事务的开始标志起,正向扫描日志文件,重新执行日志文件登记的该事务对数据库的所有操作,直至事务结束标识。
  • 2、 故障恢复策略:

    • (1) 事务故障的恢复
      • 事务故障是事务在运行至正常终止点(SUMMIT或ROLLBACK) 前终止,日志文件只有该事务的开始标识而没有结束标识。 对这类故障的恢复通常是通过撤销(UNDO) 产生故障的事务,使数据库恢复到该事务执行前的正确状态来完成的。
      • 具体做法:
        • 1、 反向扫描日志文件,查找该事务的更新操作。
        • 2、 对事务的更新操作执行逆操作。
        • 3、 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。
        • 注:事务故障的恢复是由系统自动完成的,对用户是透明的
    • (2) 系统故障的恢复
      • 系统故障会使数据库的数据不一致:
      • 一是未完成的事务对数据库的更新可能已经写入数据库;
      • 二是已提交的事务对数据库的更新可能还在缓冲区没来得及写入数据库。
      • 因此对于系统故障,恢复操作是UNDO+REDO
        • 1、 撤销故障发生时未完成的事务(UNDO) 。
        • 2、 重做已经提交的事务(REDO) 。
    • (3) 介质故障的恢复
      • 介质故障时数据库遭到破坏,需要重装数据库,一般需要DBA的参与,装载故障前最近一次的备份和故障前的日志文件副本,再按照系统故障的恢复过程执行撤销(UNDO) 和重做(REDO) 来恢复。
  • 检查点机制(CHECKPOINT)

    • 在日志中设置检查点,当发生故障需要利用日志文件
    • 恢复时,反向扫描日志文件,找到检查点,确认检查点时刻正在执行的事务(活动事务) ,即检查点前有事务开始标志但没有事务结束标志。
    • 对于检查点后提交的事务,执行REDO(重做)
    • 对于检查点后未提交的事务,执行UNDO(撤销)

第十三章 云计算与大数据处理

13.1 云计算基础知识

  • 权威定义
    • 云计算是一种将可伸缩、 弹性、 共享的物理和虚拟资源池以按需自服务的方式供应和管理,并提供网络访问的模式。
  • 狭义
    • 云计算是一种提供资源的网络,使用者可以随时获取“云” 上的资源,按需求量使用,并且可以看成是无限扩展的,只要按使用量付费就可以。
  • 是以一种方便的使用方式和服务模式,通过互联网按需访问资源池模型(例如网络、 服务器、 存储、 应用程序和服务) ,以快速和最少的管理工作为用户提供服务。

13.2 云计算的关键特征

  • 1、 关键特征:
    • 广泛的网络接入
    • 可测量的服务
    • 多租户
    • 按需自服务
    • 快速的弹性和可扩展性
    • 资源池化
  • 2、 其它关键特征:
    • 虚拟化技术
    • 可靠性高
    • 性价比高

13.3 云计算的分类

  • 1、 按云部署模式和云应用范围分类:
    • 1) 公有云
      • 一般是被一个云计算服务提供商所拥有,该组织将云计算服务销售给公众,公有云通常在远离客户建筑物的地方托管(一般为云计算服务提供商建立的数据中心)
    • 2) 社区云
      • 云的基础设施被一些组织所共享,并为一个有共同关注点的社区服务。 可以是该组织或某个第三方负责管理。
    • 3) 私有云
      • 云的基础设施是为一个客户单独使用而构建的,因而提供对数据、 安全性和服务质量的最有效控制。 私有云可部署在企业数据中心中,也可部署在一个主机托管场所,被一个单一的组织拥有或租用。
    • 4) 混合云
      • 云的基础设施由以上两种或两种以上的云(私有、 社区或公有) 组成。
  • 2、 按云计算的服务层次和服务类型分类:
    • 1) 基础设施即服务(Infrastructure as a Service,IaaS)
      • 提供虚拟化的计算资源,如虚拟机、 存储、 网络和操作系统。 其核心技术是虚拟化。
    • 2) 平台即服务(Platform as a Service,PaaS)
      • 为开发、 测试和管理软件应用程序提供按需开发的环境。 其核心技术是分布式并行计算。 PaaS实际上是指将软件研发的平台作为一种服务。
    • 3) 软件即服务(Software as a Service,SaaS)
      • 通过互联网提供按需软件付费应用程序,云计算提供商托管和管理软件应用程序,并允许用户连接到应用程序并通过互联网访问应用程序。 客户可以自己定制、 配置、 组装来得到满足自身需求的软件系统。

13.4 云关键技术

  • 虚拟化技术
  • 分布式数据存储
  • 并行计算
  • 运营支撑管理

13.5 大数据处理基础知识

  • 大数据的特征一般采用5V来描述:
  • 1、 多样性(Variety)
    • 数据类型繁多。 除了以往的以文本为主的结构化数据,非结构化数据越来越多,如音频,视频,图片,地理位置信息等。
  • 2、 速度(Velocity)
    • 处理速度快。 一方面是数据的增长速度快,另一方面是要求数据访问、 处理、 交付的速度快,通常要求具有时效性。 是大数据区别于传统数据挖掘的最显著特征。
  • 3、 大量(Volume)
    • 数据体量巨大。 聚合在一起供分析的数据规模非常庞大。
  • 4、 价值(Value)
    • 价值密度低。 大数据的本质是需要从海量数据中获取具有高价值的数据。
  • 5、 真实性(Veracity)
    • 是指数据是来自于各种、 各类信息系统网络以及网络终端的行为或痕迹。

13.6 大数据处理流程

  • 从大数据生命周期的角度看,大数据处理的基本流程包括:数据采集、 数据分析和数据解释。

在这里插入图片描述

第十四章 数据库主流应用技术

在这里插入图片描述

第十五章 标准化和知识产权基础知识

15.1 标准化基础知识(P562~571)

  • 不想看可以不看

15.2 知识产权基础知识(P571~591)

  • 全部认真看一遍

  • 商标注册看谁先使用

    • 甲、 乙两软件公司于2012年7月12日就其财务软件产品分别申请“用友” 和 “用有” 商标注册。 两财务软件相似,甲第一次使用时间为2009年7月,乙第一次使用时间为2009年5月。 此情形下,( ) 能获准注册。(选择C)
      • A.“用友”
      • B.“用友” 与“用有” 都
      • C.“用有”
      • D. 由甲、 乙抽签结果确定
  • 申请专利看谁先申请,若同一天协商确定

    • 甲、 乙两公司的软件设计师分别完成了相同的计算机程序发明,甲公司先于乙公司完成,乙公司先于甲公司使用。 甲、 乙公司于同一天向专利局申请发明专利。 此情形下,( ) 可获得专利权。(选择D
      • A.甲公司
      • B.甲、 乙公司均
      • C.乙公司
      • D.由甲、 乙公司协商确定谁
  • 软件著作权属于软件开发者,自软件开发完成之日起产生

  • 构成我国保护计算机软件著作权的两个基础法律文件

    • 《中华人民共和国著作权法
    • 《计算机软件保护条例
  • 单个自然人的软件著作权保护期自然人终生及其死亡后50年

第十六章 案例专题一:E-R图

  • 常考的几种情况
    • 1、 两方联系: 两个实体之间产生联系。 说明中的句式类似AB,BA。
    • 2、 三方联系: 当同一联系需要三方同时参与的时候就是三方联系。 说明中的句式类似AB,BC。
    • 3、 弱实体: 一个实体的存在必须以另一个实体为前提。
    • 4、 聚合: 将联系作为实体,与其他的实体产生联系。即两个实体A和B先产生联系,联系本身再与C产生联系,需要用方框把A和B之间的联系框起来。
    • 5、 子实体: 一个实体集可以按照某些特征区分为几个子实体。
    • 6、 同一实体集内的联系: 同一实体集内的两个实体之间相互存在着一定的关系。
    • PS: 三方联系与聚合的区别:
      • 三方联系必须要三方实体同时参与,缺一不可。
      • 而聚合是有先后顺序的,两个实体先产生联系,再与第三个实体产生联系。
  • 总结
    • 1、 问题1补充E-R图: 将题目中的说明多读几遍来确认参与联系的实体以及联系的类型。 确认联系类型的时候一定要优先根据题干的说明来判断,如果题干可以得到的信息较少,或不足以判断,再根据题目中给出的关系模式来。
    • 2、 问题2补充关系模式中的属性: 一般都可以从题目的说明中找到答案,带着问题再去读说明。 如果一下子没有找到,再通读说明,根据具体语义以及E-R图去判断。
    • 3、 问题3稍难,仍然是仔细阅读说明,根据具体的语境再去判断。
    • TIPS: 需求分析、 概念结构设计(E-R图) 、 逻辑结构设计(关系模式) 三者是相互关联的。 我们画E-R图采取的方法为:
      • 1、 依据需求分析中的文字说明来判断
      • 2、 依据逻辑结构设计(关系模式) 来判断
      • 3、 依据现实中的生活经验来判断

16.1 2020年试题一(共15分)

  • 【说明】

    • 某小区快递驿站代为收发各家快递公司的包裹,为规范包裹收发流程,提升效率,需要开发一个信息系统。请根据下述需求描述完成该系统的数据库设计。
  • 【需求描述】

    • (1)记录快递公司和快递员的信息。快递公司信息包括公司名称、地址和一个电话;快递员信息包括姓名、手机号码和所属公司名称。一个快递公司可以有若干个快递员,一个快递员只能属于一家快递公司。
    • (2)记录客户信息,客户信息包括姓名、手机号码和客户等级。驿站对客户进行等级评定,等级高的客户在驿站投递包裹有相应的优惠。
    • (3)记录包裹信息,便于快速查找和管理。包裹信息包括包裹编号、包裹到达驿站时间、客户手机号码和快递员手机号码。快递驿站每个月根据收发的包裹数量,与各快递公司结算代收发的费用。
  • 【问题1】(6分)

    • 【概念模型设计】根据需求阶段收集的信息,设计的实体联系图(不完整)如图1-1所示。根据需求描述,补充图1-1的实体联系图。
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 【问题2】(4分)补充下列逻辑结构设计中的(a)、(b)两处空缺,并描述完整性约束关系。

    • 【逻辑结构设计】
    • 根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
    • 快递公司(公司名称,地址,电话)
    • 快递员(姓名,快递员手机号码,(a) )
    • 客户(姓名,客户手机号码,客户等级)
    • 包裹(编号,到达时间,(b) ,快递员手机号码)
      • (a)公司名称
      • (b)客户手机号码
      • 完整性约束:快递公司关系的主码为公司名称;快递员关系的主码为快递员手机号码,外码为公司名称;客户关系的主码为客户手机号码,包裹关系的主码为编号,外码为客户手机号码和快递员手机号码。
  • 【问题3】(5分)

    • 若快递驿站还兼有缴水电费业务,请增加新的“水电费缴费记录”实体,并给出客户和水电费缴费记录之间的“缴纳”联系,对图1-1进行补充。“水电费缴费记录”实体包括编号、客户手机号码、缴费类型、金额和时间,请给出“水电费缴费记录”的关系模式,并说明其完整性约束。

    • 在这里插入图片描述

    • 水电费缴费记录(编号,客户手机号码,缴费类型,金额,时间)

    • 主码为编号,外码为客户手机号码。

16.2 2021年试题一(共15分)

  • 【说明】某社区蔬菜团购网站,为规范商品收发流程,便于查询客户订单情况,需要开发一个信息系统。请根据下述需求描述完成该系统的数据库设计。

  • 【需求描述】

    • (1)记录蔬菜供应商的信息,包括供应商编号、地址和一个电话。
    • (2)记录社区团购点的信息,包括团购点编号、地址和一个电话。
    • (3)记录客户信息,包括客户姓名和一个电话。客户可以在不同的社区团购点下订单,不直接与蔬菜供应商发生联系。
    • (4)记录客户订单信息,包括订单编号、团购点编号、客户电话、订单内容和日期。
  • 【概念模型设计】

    • 根据需求阶段收集的信息,设计的实体联系图(不完整)如图1-1所示。
    • 在这里插入图片描述
  • 【逻辑结构设计】

    • 根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
    • 蔬菜供货商(供货商编号,地址,电话)
    • 社区团购点(团购点编号,地址,电话)
    • 供货(供货商编号,(a) )
    • 客户(姓名,客户电话)
    • 订单(订单编号,团购点编号,(b) 订单内容,日期)
  • 【问题1】(6分)根据问题描述,补充图1-1的实体联系图。

    • 答:
    • 在这里插入图片描述
  • 【问题2】(4分)补充逻辑结构设计结果中的(a)、(b)两处空缺及完整性约束关系。

      • (a)团购点编号
      • (b)客户电话
      • 完整性约束关系:供货关系中,主码为(供货商编号,团购点编号)的属性组合,外码为供货商编号和团购点编号。订单关系中,客户电话也为外码,参照客户关系中的客户电话。
  • 【问题3】(5分)若社区蔬菜团购网站还兼有代收快递的业务,请增加新的“快递”实体,并给出客户实体和快递实体之间的“收取”联系,对图1-1进行补充。“快递”关系模式包括快递编号、客户电话和日期。

    • 在这里插入图片描述

16.3 2022年试题一(共15分)

  • 【说明】

    • 某市为了规范疫苗接种工作,提升效率,并为抗击疫情提供疫苗接种数据支撑,需要开发一个信息系统。请根据下述需求描述完成该系统的数据库设计。
  • 【需求描述】

    • (1)记录疫苗供应商的信息,包括供应商名称、地址和一个电话。
    • (2)记录接种医院的信息,包括医院名称、地址和一个电话。
    • (3)记录被接种者个人信息,包括姓名、身份证号和一个电话。
    • (4)记录接种者的疫苗接种信息,包括接种医院信息、被接种者信息、疫苗供应商名称和接种日期。为了提高免疫力,接种者可能需要进行多次疫苗接种(每天最多接种一次),但每次都可以在全市任意一家医院进行疫苗接种。
  • 【概念模型设计】

    • 根据需求阶段收集的信息,设计的实体联系图(不完整)如图1-1所示。
    • 在这里插入图片描述
  • 【逻辑结构设计】

    • 根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
    • 供应商(供应商名称,地址,电话)
    • 医院(医院名称,地址,电话)
    • 供货(供应商名称,(a),供货内容)
    • 被接种者(姓名,身份证号,电话)
    • 接种(被接种者身份证号,(b) ,医院名称,供应商名称)
  • 【问题1】(4分)根据问题描述,补充图1-1的实体联系图(不增加新的实体)。

    • 在这里插入图片描述
  • 【问题2】(4分)补充逻辑结构设计结果中的(a)、(b)两处空缺,并标主键和外键完整性约束。

    • (a)医院名称
    • (b)接种日期
    • 供货关系的主码为:(供应商名称,医院名称)的属性组合,外码为供应商名称 和 医院名称。
    • 接种关系的主码为:(被接种者身份证号,接种日期)的属性组合,外码为被接种者身份证号,医院名称,供应商名称。
  • 【问题3】(7分)若医院还兼有核酸检测的业务,检测者可能需要进行多次核酸检测(每天最多检测一次),但每次都可以在全市任意一家医院进行检测。请在图1-1中增加“被检测者”实体和相应的属性、医院和被检测者之间的“检测”联系和必要的属性,并给出新增加的关系模式。“被检测者”实体包括姓名、身份证号、住址和一个电话。“检测”联系需要包括检测日期和检测结果等。

    • 在这里插入图片描述
    • 新增加的关系模式为:
    • 被检测者(被检测者身份证号,姓名,住址,电话)
    • 检测(医院名称,被检测者身份证号,检测日期,检测结果)

16.4 2023年试题一(共15分)

  • 【说明】

    • 某新能源汽车公司为了提升效率,需要开发一个汽车零件采购系统。请根据下述需求描述完成该系统的数据库设计。
  • 【需求描述】

    • (1)记录供应商的信息,包括供应商的名称、地址和一个电话。
    • (2)记录零件的信息,包括零件的编码、名称和价格。
    • (3)记录车型信息,包括车型的编号、名称和规格。
    • (4)记录零件采购信息。某个车型的某种零件可以从多家供应商采购,某种零件也可以被多个车型采用,某家供应商也可以供应多种零件:还包括采购数量和采购日期。
  • 【概念模型设计】

    • 根据需求阶段收集的信息,设计的实体联系图(不完整)如图1-1所示。
    • 在这里插入图片描述
  • 【逻辑结构设计】

    • 根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
    • 供应商(名称,地址,电话)
    • 零件(编码,名称,价格)
    • 车型(编号,名称,规格)
    • 采购(车型编号,供应商名称,(a),(b) ,采购日期)
  • 【问题1】(5分)根据问题描述,补充图1-1的实体联系图(不增加新的实体)。

    • 在这里插入图片描述
  • 【问题2】(3分)补充逻辑结构设计结果中的(a)、(b)两处空缺,并标主键和外键完整性约束。

    • (a)零件编码
    • (b)采购数量
    • 采购关系的主码为:(车型编号,供应商名称,零件编码,采购日期)的属性组合,外码为车型编号、供应商名称、零件编码。
    • (PS:关于主码加不加日期的问题,这里要猜出题人的意思,主要是考虑同一车型在同一供应商采购同一零件是否会有多次,如果有就要加,如果没有就不加。有同学说原题的日期下有下划线,因为不知道原题是什么样子的,如果确实有明显的信息表明,就要加日期,如果没有明显的信息表明,结合生活实际,感觉这种情况还是很有可能发生的,所以最好加上日期吧)
  • 【问题3】(7分)该汽车公司现新增如下需求:记录车型在全国门店的销售情况。门店信息包括门店的编号、地址和电话;售包括销售数量和销售日期等。对原有设计进行以下修改以实现该需求:

    • (1)在图1-1中体现门店信息及其车型销售情况,并标明新增的实体和联系,及其必要属性。

      • 在这里插入图片描述
    • (2)给出新增加的关系模式,并标注主键和外键完整性约束。

      • 新增加的关系模式为:
      • 门店(门店编号,地址,电话)
        • 主键为门店编号,无外键
      • 销售(车型编号,门店编号,销售日期,销售数量)
        • 主键为(车型编号,门店编号)的属性组合,外键为车型编号,门店编号。
        • (关于主码加不加日期的问题,考虑同一门店销售同一车型确实不可能只有一次,所以需要加日期)

第十七章 案例专题二:关系规范化

  • 常考的几个问题

  • 1、 找候选码:

    • 记住候选码的含义: 候选码可以决定关系模式中的所有属性,且候选码的任何一个真子集都不能单独决定全属性
  • 2、 是否满足某一范式,或最高可达到第几范式:将每一个范式的定义记牢,背熟:

    • (1) 有非主属性部分函数依赖的,不满足2NF
    • (2) 有非主属性传递函数依赖的,不满足3NF
    • (3) 有主属性的部分和函数依赖的,不满足BCNF
    • (4) 有多值依赖的,形如X→→Y,X和Y必在一个关系模式,且只有X和Y,不能有其它多余属性。 如果有,不满足4NF
  • 3、 分解关系模式:

    • (1) 有部分函数依赖的情况:R(A,B,C,D,E,F),F={A→(C,D,E),(A,B)→F}分解成R1(A,C,D,E)和R2(A,B,F)
    • (2) 有传递函数依赖的情况:R(A,B,C,D,E,F),F={A→(B,C),B→(D,E,F)}分解成R1(A,B,C)和R2(B,D,E,F)
    • (3) 有多值依赖的情况:R(A,B,C,D,E,F),F={A→→B,A→(C,D,E,F)}分解成R1(A,B)和R2(A,C,D,E,F)
  • 总结

    • 1、 找候选码:
      • 1) 记住候选码的含义,看哪些属性或属性组合可以决定所有的属性
      • 2) 有编号(ID) 的,首要考虑。 一般不把姓名,名称等作为候选码,但题目中没有其它更好选择的除外。
    • 2、 找函数依赖集。 首先根据题目的描述来判断,再结合现实生活中的实际。 可以尝试着写一个该关系模式的范例来判断。
    • 3、 确定范式: 根据找出的函数依赖集,确实是否有部分、 传递函数依赖,再来判断属于第几范式
    • 4、 分解关系模式: 按函数依赖集来分解,即分解要保持函数依赖

17.1 2020年试题二(共15分)

  • 【说明】

    • 某市居委会在新冠病毒疫情期间需分配社区人员到辖区内各个小区,协助小区物业人员进行业主出入登记及体温检测工作。居委会为高效完成工作并记录必要的工作信息,设计了相应的数据库。其中有一个表用来记录工作人员在各个小区的分布情况。表的结构如下:
      • 人员分配(人员编号,人员姓名,小区编号,物业经理姓名,人员职责)
      • 其中人员编号和小区编号唯一,人员职责用于记录该人员需配合小区完成的工作,假设每个人员在同一个小区只负责一项工作,但在不同小区可以负责不同的工作。请回答以下问题。
  • 【问题1】(6分)给出人员分配表中成立且左侧只有一个属性的所有函数依赖关系。题中设计的人员分配表是否满足2NF,请说明原因。

    • (1)函数依赖关系如下:
      • 人员编号→人员姓名,小区编号→物业经理姓名。
    • (2)不满足2NF。
      • 该关系模式的候选码是(人员编号,小区编号),函数依赖集如下:{人员编号→人员姓名,小区编号→物业经理姓名,(人员编号,小区编号)→人员职责},因此存在非主属性人员姓名和物业经理姓名对码(人员编号,小区编号)的部分函数依赖,因此不满足2NF。
  • 【问题2】(3分)如果要将人员分配表规范化为满足3NF,请简要说明解决方案。

    • 可以将人员分配表分解为:
      • 人员分配1(人员编号,人员姓名)
      • 人员分配2(小区编号,物业经理姓名)
      • 人员分配3(人员编号,小区编号,人员职责)
  • 【问题3】(6分)请给出问题2设计结果中各个表的主键和外键。

      • 人员分配1的主键是人员编号,人员分配2的主键是小区编号,人员分配3的主键是(人员编号,小区编号),外键是人员编号和小区编号。

17.2 2021年试题二(共15分)

  • 【说明】

    • 为防控新冠疫情,一些公共设施需要定期消毒。管理部门为高效完成工作并记录必要的工作信息,设计了相应的数据库,其中有一个表用来记录公共汽车的消毒情况。表的结构如下:
      • 消毒记录(日期,车牌号,行驶路线,消毒人员工号,消毒人员姓名)
      • 其中车牌号和消毒人员工号唯一,同辆车保持固定的行驶路线。假设同一人员每天可以负责多辆车的消毒工作。
  • 【问题1】(6分)给出消毒记录表中成立且左侧只有一个属性的所有函数依赖关系。题中设计的消毒记录表是否满足2NF?请用100字以内的文字说明原因。

    • (1)车牌号–>行驶路线,消毒人员工号–>消毒人员姓名
    • (2)不满足2NF,原因如下:该关系模式的候选码为(日期,车牌号),而车牌号–>行驶路线,因此存在非主属性“行驶路线”对候选码的部分函数依赖,不满足2NF。
  • 【问题2】(6分)如果要将消毒记录表规范化为满足3NF,请用100字以内的文字简要说明解决方案,并给出各个新表的主码和外码。

    • 可以分解为:消毒记录1(日期,车牌号,消毒人员工号),消毒记录2(消毒人员工号,消毒人员姓名),消毒记录3(车牌号,行驶路线)
  • 【问题3】(3分)如果每辆车每日有多次消毒,需要记录每次消毒的消毒时间,在问题2设计结果的基础上,如何在不破坏3NF且不增加冗余的前提下做到?请简单说明方案。

    • 人员分配1的主键是人员编号,人员分配2的主键是小区编号,人员分配3的主键是(人员编号,小区编号),外键是人员编号和小区编号。
    • 在问题2的消毒记录1关系模式中增加属性“消毒时间”,即改成:消毒记录1(日期,车牌号,消毒时间,消毒人员工号)

17.3 2022年试题二(共15分)

  • 【说明】

    • 某卡丁车场地为方便车手线上查询自己的圈速成绩,设计了相应的关系模型。模型中有三个表:
      • 冲线记录表(序列号,日期,冲线时刻,圈速,车号,组别,手机号,车手姓名);
      • 赛车表(车号,组别,车型);
      • 车手表(车手姓名,手机号,年龄,性别)。
      • 其中序号号唯一确定一条冲线记录,车型和组别可由车号确定,车手手机号唯一,车手姓名可重复。
  • 【问题1】(3分)冲线记录表中是否含有数据冗余?如果存在冗余,请列同冗余属性。

      • 有,冗余属性为:组别、车手姓名。
  • 【问题2】(6分)请分别给出冲线记录表、赛车表和车手表的主码和外码。

      • 冲线记录表的主码为:序列号,外码为:车号、手机号
      • 赛车表的主码为:车号,外码无。
      • 车手表的主码为:手机号,外码无。
  • 【问题3】(6分)题干描述的冲线记录表是否满足3NF?如果不满足,请给出导致不满足3NF的函数依赖关系,并用50字以内的文字简要说明解决方案。

      • 不满足3NF,导致不满足3NF的函数依赖依赖关系为:序列号→车号,车号→组别;以及序列号→手机号,手机号→车手姓名。解决方案为删除组别和车手姓名两个属性。

17.4 2023年试题二(共15分)

  • 【说明】
    • 一汽车厂商对配件进行统一管理,设计了相应的数据库,其中一个表记录了维修配件的使用信息。其表结构如下:
      • 维修配件使用表(车牌号,维修时间,配件编码,配件名称,配件供应商,配件仓库编码,仓库地址,维修配件数量)
    • 其中,车牌号和配件编码满足唯一性。假设同一辆车在同一次维修情况下可能需要多种维修配件;一种配件只能存放于一个配件仓库,一种配件只能由一个配件供应商提供。维修时间精确到秒。
  • 【问题1】(7分)题中给出的维修配件使用表存在数据冗余,请给出具体的冗余属性,并说明因此会出现哪些异常?
      • 冗余属性为:配件名称、配件供应商,仓库编码,仓库地址。会出现更新,插入,删除异常。
  • 【问题2】(8分)维修配件使用表是否满足BCNF?如果不满足,请对其进行模式分解,使分解后的关系模式满足BCNF,并标记出主键和外键。
      • 不满足BCNF,分解后的关系模式如下:
        • 维修配件使用表(车牌号,维修时间,配件编码,维修配件数量)
          • 主键为(车牌号,维修时间,配件编码)的属性组合,外键为配件编码。
        • 配件表(配件编码,配件名称,配件供应商,配件仓库编码)
          • 主键为配件编码,外键为配件仓库编码。
        • 仓库表(仓库编码,仓库地址)
          • 主键为仓库编码,无外键。

第十八章 案例专题三:SQL

  • 详见 第八章,特别是标黄的部分以及关键字需要注意

18.1 2020年试题三(共15分)

  • 【说明】
    • 某订单管理系统的部分数据库关系模式如下:
      • 客户:CUSTOMERS(Cno,Cname,Cage,Csex),各属性分别表示客户编号、客户姓名、年龄和性别;
      • 商品:GOODS(Gno, Gname, Gprice, Gorigin),各属性分别表示商品编号、商品名称、单价和产地;
      • 订单:ORDERS(Ono, Cno, Gno, Oprice, Onumber),各属性分别表示订单编号、客户编号、商品编号、顾客购买商品的单价和数量。
    • 有关关系模式的说明如下:
    • (1)下划线标出的属性是表的主键。
    • (2)商品表中的Gprice是商品的当前价格,可能会发生变动;订单表中的Oprice是订单成交是的商品单价。
    • (3)一个订单只包含一位顾客购买的一种商品;其商品数量至少1件,最多99件。
【问题1】(3分)
请将下面创建订单表的SQL语句补充完整,要求定义实体完整性约束,参照完整性约束,以及其它完整性约束。
CREATE TABLE ORDERS (
    Ono CHAR(20) PRIMARY KEY
    Cno CHAR(10)(a),
    Gno CHAR(15)(b),
    Oprice NUMERIC(7,2),
    Onumber SMALLINT(c)   
    )
;

【问题2】(5分)
查询所有订单的详细情况,要求输出订单号(Ono)、客户姓名(Cname)、商品名称(Gname)、单价(Oprice)、数量(Onumber)和金额(Oamount),查询结果按照金额从大到小排列。此功能由下面的SQL语句实现,请补全。
SELECT Ono, Cname, Gname, Oprice, Onumber
	,(d)AS Oamount
FROM CUSTOMERS, ORDERS, GOODS
WHERE (e)
AND (f)
(g) BY (h)
;

【问题3】(5分)
创建已售商品信息视图,给出已售商品的编号(Gno)、名称(Gname)、订单个数(Onum)及平均每单的商品数量(GAnum)。此视图的创建语句如下,请补全。
CREATE (i) GOODS_SOLD  AS
SELECT ORDERS.Gno AS Gno, MIN(GOODS.Gname ) AS  Gname
,(j) AS Onum
,(k) AS GAnum
FROM ORDERS,GOODS
WHERE ORDERS.Gno = GOODS.Gno
(l)BY(m)
;

【问题4】(2分)
查询未售出商品的编号和名称。此功能由下面的SQL语句实现,请补全。
SELECT Gno, Gname
FROM(n)
(o)
SELECT Gno,Gname
FROM GOODS_SOLD
; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
(a)REFERENCES CUSTOMERS(Cno)
(b)REFERENCES GOODS(Gno)
(c)CHECK (Onumber BETWEEN 1 AND 99)CHECK (Onumber>= 1 AND Onumber<=99)
(d)ORDERS.Oprice * ORDERS.Onumber  或  Oprice * Onumber
(e)ORDERS.Cno = CUSTOMERS.Cno
(f)ORDERS.Gno=GOODS.Gno      e和f可互换
(g)ORDER
(h)Oamount DESC
(i)VIEW
(j)COUNT(*)
(k)AVG(ORDERS.Onumber)
(l)GROUP
(m)ORDERS.Gno
(n)GOODS
(o)EXCEPT

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

18.2 2021年试题三(共15分)

  • 【说明】
    • 某竞赛管理系统的部分数据库关系模式如下:
      • 选手:PLAYER(Pno, Pname, Sex, Region, Tel)
        • 各属性分别表示参赛选手的编号、姓名、性别、地区和联系电话;
      • 竞赛项目:CONTEST(Cno, Cname, Type, Date)
        • 各属性分别表示竞赛项目的编号、名称、类别和举办日期;
      • 选手参赛:PC(Pno, Cno ,City, Rank,Point)
        • 各属性分别表示选手编号、竞赛项目编号、竞赛所在城市、选手取得的名次和积分。
    • 有关关系模式的说明如下:
      • (1)下划线标出的属性是表的主码。
      • (2)选手参赛表的属性Pno和Cno分别参照了选手表和竞赛项目表的主码。
      • (3)一个选手参加一项竞赛有一个名次和一个积分,名次有4个取值(一,二,三,无)。另外,竞赛所在城市不能为空。
    • 根据以上描述,回答下列问题,将SQL语句的空缺部分补充完整。
【问题1】(5分)
请将下面创建选手参赛表PC的SQL语句补充完整,要求定义实体完整性约束、参照完整性约束,以及其他完整性约束。
CREATE TABLE PC(
Pno CHAR10REFERENCES(a)(Pno),
Cno CHAR3REFERENCES(b)(Cno),
City CHAR20)(c)   
Rank CHAR2)(d)  
Point SMALLINT,
    (e)    
)
;

【问题2】(6分)
查询所有未参加‘AI’类别竞赛的选手,要求输出选手的编号(Pno),查询结果按照选手编号的升序排列。此功能由下面的SQL语句实现,请补全。
SELECT Pno FROM(f)  
WHERE Pno(g)(
SELECT(h)FROM PC, Contest
WHERE(i)  
   (j)  Type ='AI')
   (k)  Pno;

【问题3】(4分)
由于某种原因,编号为'E06'的竞赛项目在正式举办前被取消了。而此前系统中已经记录了一些选手的报名参赛情况,因此需要在系统中删除'E06'的竞赛项目记录,以及该竞赛的所有报名参赛纪录。根据问题1在选手参赛表PC上定义的参照完整性约束,此功能可以由下面的SQL语句实现,请补全。
(l)FROM(m)WHERE Cno='E06';
(n)FROM(o)WHERE Cno='E06';

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

(a)PLAYER
(b)CONTEST
(c)NOT NULL
(d)CHECK (Rank=’一’ or Rank=’二’ or Rank=’三’ or Rank=’无’) 或 CHECK (Rank in (’一’ ,’二’ ,’三’ ,’无’ ))
(e)PRIMARY KEY (Pno,Cno)
(f)PLAYER
(g)NOT IN
(h)Pno
(i)CONTEST.Cno=PC.Cno
(j)AND
(k)ORDER BY
(l)DELETE
(m)PC
(n)DELETE
(o)CONTEST
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

18.3 2022年试题三(共15分)

  • 【说明】
    • 某工程项目管理系统的部分数据库关系模式如下:
      • 项目:PROJECT(Jno, Jname, City, Date)
        • 各属性分别表示项目代码、项目名称、项目所在城市和项目开始日期;
      • 零件:PART(Pno, Pname, Color, Sno, Stock)
        • 各属性分别表示零件代码、零件名称、零件颜色、零件所在仓库代码及库存量;
      • 供应情况:PJC(Pno, Jno ,Qty)
        • 各属性分别表示零件代码、项目代码、使用量。
      • 仓库:STORE(Sno, Sname, Address)
        • 各属性分别表示仓库代码、仓库名称、仓库地址。
    • 有关上述关系模式的说明如下:
      • (1)下划线标出的属性是表的主键。
      • (2)零件表的属性Sno参照了仓库表的主码。一种零件只存放在一个仓库,库存量最低为0。
      • (3)供应情况表的属性Pno和Jno分别参照了零件表和项目表的主码。
    • 根据以上描述,回答下列问题,将SQL语句的空缺部分补充完整。
【问题1】(4分)
请将下面创建零件表PART的SQL语句补充完整,要求定义实体完整性约束、参照完整性约束,以及其他完整性约束。
CREATE (a) PART(
Pno CHAR10)(b)      ,
Pname CHAR20),
Color CHAR4,
Sno CHAR4REFERENCES(c)(Sno),
Stock INT(d) 
)
;

【问题2】(3分)
创建视图PART_USED,给出在项目中已使用零件的代码和使用量。此视图的创建语句如下,请补全。
CREATE VIEW PART_USED AS
SELECT Pno,(e)AS Usage
FROM PJ
(f)BY(g)  
;

【问题3】(4分)
在视图PART_USED的基础上查询所有零件的信息,要求输出每种零件的零件代码、零件名、零件颜色和零件总量(使用量与库存量之和),查询结果按照零件总量降序排列。此功能由下面的SQL语句实现,请补全。
SELECT Pno, Pname, Color,(h)AS Total
FROM PART, PART_USED
WHERE PART.Pno = PART_USED.Pno
 (i)  
 SELECT Pno, Pname, Color, Stock AS Total
FROM PART
WHERE Pno(j)   
( SELECT DISTINCT Pno FROM PJ)
ORDER BY Total(k)
;

【问题4】(4分)
由于某种原因,要拆除代码为‘A006’的仓库,该仓库中的零件转入‘A002’仓库存放。据此更新数据库的功能由下面的SQL语句实现,请补全。
UPDATE(l)SET(m)WHERE Sno=’A006’;
(n)FROM(o)WHERE Sno=’A006’;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
(a)TABLE
(b)PRIMARY KEY
(c)STORE
(d)CHECK (Stock>=0)
(e)SUM(Qty)
(f)GROUP
(g)Pno
(h)Stock+Usage
(i)UnionUnion all
(j)NOT IN
(k)DESC
(l)PART
(m)Sno=’A002’
(n)DELETE
(o)STORE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

18.4 2023年试题三(共15分)

  • 【说明】
    • 某教务管理系统的部分数据库关系模式如下:
      • 学生:STUDENT(Sno, Sname, Ssex, Sage, Sdept),各属性分别表示学号、姓名、性别、年龄、所在系名;
      • 课程:COURSE(Cno, Cname, Cpno, Ceredit),各属性分别表示课程号、课程名、先修课的课程号、学分;
      • 选课:SC(Sno, Cno , Grade),各属性分别表示学号、课程号、成绩。
    • 有关上述关系模式的说明如下:
      • (1)下划线标出的属性是表的主键。
      • (2)课程名取值唯一。
    • 根据以上描述,回答下列问题,将SQL语句的空缺部分补充完整。
【问题1】(3分)
请将下面创建课程表COURSE的SQL语句补充完整,要求定义实体完整性约束、参照完整性约束,以及其他完整性约束。
CREATE TABLE  COURSE(
Cno CHAR(4) PRIMARY KEY,
Cname CHAR(30)(a),
Cpno CHAR4REFERENCES(b),(c),
Ccredit INT;

【问题2】(4分)
有一门课程号为“C036”的新开课,要求所有学生选修。该课程的基本信息已经录入课程表COURSE中,现需在选课表SC中插入该课的选课记录。实现此功能的SQL语句如下,请补全。
(d)INTO SC(Sno,(e))
SELECT Sno,(f)   
FROM(g)  
;
    
【问题3】(4分)
查询每一门课程的间接先修课(先修课的先修课),要求输出课程号和间接先修课的课程号。即使某门课程没有先修课,也需要输出,不过其间接先修课为空。此功能由下面的SQL语句实现,请补全。
SELECT K1.Cno,(h)   
FROM COURSE K1(i)OUTER JOIN COURSE K2   
(j)((k)) 
;

【问题4】(4分)
查询选修了课程表中已有全部课程的学生,要求输出学号和姓名。此功能由下面的SQL语句实现,请补全。
SELECT Sno,Sname FROM STUDENT
WHERE NOT EXISTS
(SELECT * FROM(l)  
WHERE(m)  
(SELECT * FROM(n)  
WHERE(o)))
;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
(a)UNIQUE
(b)COURSE
(c)(Cno)
(d)INSERT
(e)Cno
(f)‘C036’
(g)STUDENT
(h)K2.Cpno
(i)LEFT
(j)ON
(k)K1.Cpno=K2.Cno
(l)COURSE
(m)NOT EXISTS
(n)SC
(o)Sno=STUDENT.Sno AND Cno=COURSE.Cno

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

第十九章 案例专题四:两段锁协议

  • 第十二章需要多看,特别是标黄部分

  • 什么是两段锁协议

    • 是指同一事务对任何数据进行读写之前必须对该数据加锁;在释放一个封锁之后,该事务不再申请和获得任何其他封锁
    • 所谓“两段” 的含义是:事务分为两个阶段。 第一阶段是获得封锁,也称为扩展阶段。 第二阶段是释放封锁,也称为收缩阶段。
    • 例:
      • T1:Slock A…Slock B…Xlock C…Unlock B…Unlock A…Unlock C
      • T2:Slock A…Unlock A…Slock B…Xlock C…Unlock C…Unlock B
    • 如果事务遵循两段锁协议,那么它们的并发调度是可串行化的。 两段锁是可串行化的充分条件,但不是必要条件。
      • 即:遵循两段锁协议,一定是可串行化的; 不遵循两段锁协议,可能是可串行化的,也可能不是
    • 注意:采用两段锁协议也有可能产生死锁,这是因为每个事务都不能及时解除被封锁的数据,可能会导致多个事务都要求对方已经封锁的数据而不能继续运行。
  • 什么是死锁

    • 两个以上进程互相都要求对方已经占有的资源导致无法继续运行下去的现象。
    • 例:现有5个进程,每个进程都需要4个资源,而系统一共有15个资源,会发生死锁吗
    • 在这里插入图片描述
    • 系统中共有n个进程共享同一类资源,当每个进程都需要k个资源时,至少需要多少个资源才不会发生死锁?
      • 至少需要资源:M =(k-1)×n+1
    • 产生死锁的4个必要条件:互斥条件. 请求保持条件. 不可剥夺条件、环路条件
    • 死锁的处理策略有:鸵鸟策略. 预防策略. 避免策略和检测与解除死锁
      • 死锁预防:采用某种策略限制并发进程对资源的请求。
      • 死锁避免:如银行家算法。
      • 死锁检测:系统定时地运行一个程序来检测是否发生死锁,若有,则设法加以解除。
      • 死锁解除:有资源剥夺法和撤销进程法。
  • 触发器、存储过程、游标等关键字需要注意,详见第八章

19.1 2020年试题四(共15分)

  • 【说明】

    • 某网上销售系统的部分关系模式如下:
      • 订单表:orders(o_no, o_date, o_time, p_no, m_no, p_price, nums, amt, status)
        • 其中属性含义分别为:订单号、订单日期、订单时间、产品编码、供应商编码、产品价格、产品数量、订单金额、订单状态(0-未处理、1-已处理、2-已取消)。
      • 产品表:products(p_no, p_name, p_type, price, m_no, p_nums)
        • 其中属性含义分别为:产品编码、产品名称、产品类型、产品价格、供应商编码、库存数量。
  • 【问题1】(5分)

    • 节假日时,由供应商提供商品打折后的新价格,数据存放在临时表中,该临时表的表名为tmp_prices(不同供应商有不同的临时表),其关系模式如下:
      • tmp_prices(p_no,t_price,m_no);
    • 后台维护人员需要根据供应商填写在tmp_prices中的数据来更新产品表中某些产品的价格。下面是基于游标,用SQL实现的价格更新程序,请补全空缺处的代码。
    • 在这里插入图片描述
      • (a)CURSOR
      • (b)OPEN
      • (c)Pno, Pprice, Mno
      • (d)COMMIT; return 0
  • 【问题2】(6分)

    • 假设用户1和用户2同时购买1份A商品,用户3查询和浏览A商品。三个用户对应事务的部分调度序列如表4-1所示(事务中未进行并发控制),其中T0时刻A商品的库存数量p_nums为100。
时间用户1事务用户2事务用户3事务
T0………………
T1Read(p_nums)
T2Read(p_nums)
T3P_nums=p_nums-1
T4P_nums=p_nums-1Read(p_nums)
T5Write(p_nums)
T6Write(p_nums)
T7Read(p_nums)
T8………………
  • 请说明T4、T7时刻,用户3事务读取到的p_nums数值分别是多少。请说明T8时刻事务调度结果是否正确?若不正确请说明属于哪一种数据不一致性。
      • 用户3读到的是100和99。不正确,属于丢失修改和不可重复读。(用户1对p_nums的修改被T2覆盖,T3两次读取的结果不一致)
  • 【问题3】(4分)
    • 为保证并发事务的正确性,系统要求所有事务需遵循两段锁协议。
      • 1)请简要解释两段锁协议,并说明“两段”的含义。
      • 2)请说明两段锁协议是否可以避免死锁?如不能避免,应采取什么措施解决死锁问题。
      • (1)两段锁协议是指对任何数据进行读写之前必须对该数据加锁;
        • 在释放一个封锁之后,事务不再申请和获得任何其他封锁。所谓“两段”的含义是:
        • 事务分为两个阶段。第一阶段是获得封锁,也称为扩展阶段。第二阶段是释放封锁,也称为收缩阶段。
      • (2)两段锁协议不能避免死锁。
        • 死锁的处理策略有预防策略,避免策略和检测与解除死锁。

19.2 2021年试题四(共15分)

  • 【说明】
    • 某企业网上书城系统的部分关系模式如下:
      • 书籍信息表:books(book_no, book_name, press_ no, ISBN, price, sale_type, all_ nums)
        • 其中属性含义分别为:书籍编码、书籍名称、出版商编码、ISBN、销售价格、销售分类、当前库存数量;
      • 书籍销售订单表:orders(order_no, book no, book nums, book_ price, order_ date,amount)
        • 其中属性分别为:订单编码、书籍编码、书籍数量、书籍价格、订单日期和总金额。
      • 书籍再购额度表:booklimit(book_no, sale_type, limit_amount)
        • 其中属性含义分别为:书籍编码、销售分类、再购额度;
      • 书籍最低库存表:bookminlevel(book_no, level)
        • 其中属性含义分别为:书籍编码,书籍最低库存数量;
      • 书籍采购表:bookorders(book_no, order_amount)
        • 其中属性含义分别为:书籍编码和采购数量。
    • 有关关系模式的说明如下:
      • (1)下划线标出的属性是表的主码。
      • (2)根据书籍销售情况来确定书籍的销售分类:销售数量小于1万的为普通类型,其值为0;1万及以上的为热销类型,其值为1。
      • (3)系统具备书籍自动补货功能,涉及到的关系模式有:书籍再购额度表、书籍最低库存表、书籍采购表。其业务逻辑是:当某书籍库存小于其最低库存数量时,根据书籍的销售分类以及书籍再购额度表中的再购额度,生成书籍采购表中的采购订单,完成自动补货操作。
【问题1】(5分)
系统定期扫描书籍销售订单表,根据书籍总的销售情况来确定书籍的销售类别。下面是系统中设置某书籍销售类别的存储过程,结束时需显式提交返回。请补全空缺处的代码。
CREATE PROCEDURE UpdateBookSaleType(IN bno varchar20))
DECLARE
all_nums  number(6;
BEGIN
SELECT    (a)   (book  nums) INTO all  nums FROM orders
WHERE book_no =    (b)   ;
IF all  nums <    (c)     THEN
UPDATE books SET sale_type = 0 WHERE book_no = bno;
ELSE
UPDATE books SET sale_type =    (d)   WHERE book_no = bno;
END IF
   (e)   ;
END

【问题2】(6分)
下面是系统中自动补货功能对应的触发器,请补全空缺处的代码。
CREATE TRIGGER BookOrdersTrigger    (f)   update
of    (g)   on books
   (h)   
WHEN   (i)   <SELECT level FROM bookminlevel
WHERE bookminlevel.book_no=OLD.book_no)
AND   (j)    >=SELECT level FROM bookminlevel
WHERE bookminlevel.book_no= OLD.book_no);
BEGIN
INSERT INTO    (k)   
(SELECT book_no, limit_amount
FROM booklimit as TMP
WHERE TMP.book_no=OLD.book_no
AND TMP.sale_type=OLD.sale_type);
END

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
【问题1】
(a)SUM
(b)Bno
(c)10000
(d)1
(e)COMMIT

【问题2】
(f)AFTER
(g)all_nums
(h)REFERENCING old row as OLD,new row as NEW  
FOR each row
(i)NEW.all_nums
(j)OLD.all_nums
(k)Bookorders


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 【问题3】(4分)
    • 假设用户1和用户2同时购买同一书籍,对应事务的部分调度序列如表4-1所示(事务中未进行并发控制),其中T0时刻该书籍的库存数量all_nums=500。
    • 请说明T4时刻,用户2事务读取到的all_nums数值是多少?
        • T4时刻,用户2事务读取到的all_nums数值是498。
    • 请说明T8时刻,all_nums数据是否出现不一致性问题?如出现,请说明属于哪一种数据不一致性。
        • T8时刻,all_nums出现了不一致性的问题,属于读脏数据,用户2事务读取到的all_nums是被用户1事务修改后的数据,而用户1事务后来又将该次修改撤销,导致用户2事务读的是脏数据。
时间用户1事务用户2事务
T0…………
T1read(all_nums)
T2all_nums=all_nums-2
T3write(all_nums)
T4read(all_nums)
T5all_nums=all_nums-3
T6write(all_nums)
T7ROLLBACK
T8…………

19.3 2022年试题四(共15分)

  • 【说明】
    • 某银行账务系统的部分简化后的关系模式如下:
      • 账户表:accounts(a_no, a_name, a_status, a_bal, open_branch_no, open_branch_name, phone_ no)
        • 属性含义分别为:账户编码、账户名称、账户状态(1-正常、2-冻结、3-挂失)、账户余额、开户网点编码、开户网点名称、账户移动电话。
      • 账户交易明细表:trade_details(t_date, optr_no, serial_no, t_branch, a_no, t_type, t_amt, t_result)
        • 属性含义分别为:交易日期、操作员编码、流水号、交易网点编码、账户编码、交易类型(1-存款、2-取款)、交易金额、交易结果(1-成功、2-失败、3-异常、4-已取消)。
      • 网点当日余额汇总表:branch_sum(b_no,b_date, b_name, all_bal)
        • 属性含义分别为:网点编码、汇总日期、网点名称、网点开户账户的总余额。
    • 系统提供常规的账户存取款交易,并提供账户余额变更通知服务。该账务系统是7*24h不间断的提供服务;网点当日余额汇总操作一般在当日晚上12点左右,运维人员在执行日终处理操作中完成。
【问题1】(6分)
下面是系统日终时生成网点当日余额汇总数据的存储过程,请补全空缺处的代码。
CREATE PROCEDURE BranchBalanceSum(IN s_date CHAR(8)DECLARE
all_balance number(14,2;
v_bran_no varchar(10);
v_bran_name varchar(30);
       (a)      c_sum_bal IS
        SELECT open_branch_no, open_branch_name, sum(a_bal) 
FROM accounts
GROUP BY open_branch_no, open_branch_name;
 BEGIN
  OPEN c_sum_bal;
    LOOP
               (b)      c_sum_bal INTO v_bran_no,       (c)       ;
          IF c_sum_bal NOTFOUND THEN    //未找到记录
   (d)    
          END IF;           
INSERT INTO branch_sum VALUES (v_bran_no, s_date, v_bran_name,all_balance);
    END LOOP
    CLOSE     (e)   ;
  COMMIT;
  EXCEPTION


【问题2】(5分)
当执行存取款交易导致用户账户余额发生变更时,账务系统需要给用户发送余额变更短信通知。通知内容为“某时间您的账户执行了某交易,交易金额为××元,交易后账户余额为××元”。默认系统先更新账户表,后更新账户交易明细表。
下面是余额变更通知功能对应的程序,请补全空缺处的代码。
CREATE TRIGGER BalanceNotice     (g)   INSERT on    (h)   
   (i)   
WHEN   (j)   =1
   DECLARE
       v_phonevarchar(30);
       v_type varchar(30);
       v_bal number(14,2);
       v_msg varchar(300);
BEGIN
SELECT phone_no, a_bal INTO v_phone, v_bal
FROM accounts
WHERE a_no =    (k)   
         IF NEW.t_type=1 THEN v_type: = ’存款’;
         END IF;
         IF NEW.t_type=2 THEN v_type: = ’取款’;
         END IF;
      v_msg: = NEW.t_date &&’,您的账户’ && NEW.a_no && ’上执行了’ && v_type && ‘交易,交易金额为’’ && to_string(NEW.t_amt) && ‘元,交易后账户余额为’ && to_string(v_bal) && ‘元’;
      SendMsg(v_phone,v_msg);  //发送短信
END

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
【问题1】
(a)CURSOR
(b)FETCH
(c)v_bran_name, all_balance
(d)DO BREAKEXIT (此处为跳出LOOP循环,参考20年的题使用DO BREAK,有的机构给的是EXITEXIT为ORACLE中的用法,具体是什么看出题老师的意思了)
(e)c_sum_bal
(f)ROLLBACK


【问题2】
(g)AFTER
(h)trade_details
(i)REFERENCING new row as NEW  
FOR each row
(j)t_result或NEW.t_result
(k)NEW.a_no

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 【问题3】(4分)
    • 假设日终某网点当日余额汇总操作和同一网点某账户取款交易同一时间发生,对应事务的部分调度序列如表4-1所示。
    • (1)在事务提交读隔离级别下,该网点的汇总和取款事务是否成功结束?
        • 余额汇总事务可能无法正常结束,在提交读(READ COMMITTED)隔离级别下,写事务禁止其它事务来进行读写,即事务在写之前需要加X锁,那么取款事务事先加X锁,之后汇总事务无法读取第3个账户的信息。
    • (2)如果该数据库提供了多版本并发控制协议,两个事务是否成功结束?
        • 如果采用多版本并发控制协议(MVCC),两个事务可以成功结束,因为MVCC消除了数据读和写操作的冲突,数据的写操作每次会产生一个新的版本,读和写互相不干扰。
时间某网点账户余额汇总事务账户取款事务
T0…………
T1读第1个账户,汇总
T2读第2个账户,汇总
T3第3个账户发生取款交易
T4commit
T5读第3个账户,汇总
T6……
T7读最后账户,汇总
T8…………

19.4 2023年试题四(共15分)

  • 【说明】
    • 某企业内部信息系统部分简化后的关系模式如下:
      • 员工表:EMPLOYEES(Eid, Ename, Address, Phone, Jid)
        • 属性含义分别为:员工编码、员工姓名、家庭住址、联系电话、岗位级别编码。
      • 岗位级别表:JOB_LEVELS(Jid, Jname, Jbase_salary)
        • 属性含义分别为:岗位级别编码、岗位名称、岗位基本工资。
      • 员工工资表:SALARY(Eid, attendance_wage,merit_pay, overtime_wage, salary, tax, year, month)
        • 属性含义分别为:员工编码、考勤工资、绩效工资、加班工资、最终工资、税、年份、月份。
    • 该企业在每月25日计算员工的工资。首先是根据考勤系统以及绩效系统中的数据,计算出员工的考勤、绩效和加班工资,存入到员工工资表;其次结合员工的岗位基本工资,计算出最终工资,完成对员工工资表记录的更新。最后依据员工工资表完成工资的发放。
【问题1】(6分)
下面是月底25日计算某员工最终工资的存储过程程序,请补全空缺处的代码。
CREATE PROCEDURE SalaryCalculation (      (a)    empId char (8), IN iYear number(4), IN iMonth number(2)DECLARE
attendance number(14,2);
merit number(14,2);
overtime number(14,2);
base number(14,2);
all_salary number(14,2);
    BEGIN
    SELECT attendance_wage,merit_pay, overtime_wage 
INTO      (b)     
FROM SALARY
WHERE Eid= empId FOR UPDATE;
SELECT Jbase_salary INTO :base
FROM EMPLOYEES T1,      (c)    
     WHERE T1.Jid = T2.Jid  AND  T1.Eid = empId;
all_salary = attendance + merit + overtime + base;
UPDATE SALARY SET salary = :all_salary
   WHERE     (d)      AND year = iYear AND month = iMonth;
EXCEPTION WHEN OTHERS THEN      (e)   ;
 END

【问题2】(5分)
为了防止对员工工资表的非法修改(包括内部犯罪),系统特意规定了员工工资表的业务规则:对员工工资表的修改只能在每月25日的上班时间进行。
下面是员工工资表修改业务规则对应的程序,请补全空缺处的代码。
CREATE TRIGGER CheckBusinessRule     (g)   INSERT OR DELETE OR  (h)          on  SALARY
FOR EACH     (i)   
BEGIN
IF  (TO_CHAR(sysdate,’DD’)<>    (j)    )
OR (TO_number(TO_CHAR(sysdate,’HH24’))     (k)     BETWEEN 8 AND 18) 
THEN Raise_Error; //抛出异常
END IF;
END;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
【问题1】
(a)IN
(b):attendence, :merit, :overtime
(c)JOB_LEVELS T2
(d)Eid = empId
(e)这里应该有e和f两个空,题目只有e空,按题意可能是一个COMMIT一个ROLLBACK,发生错误回滚,否则提交 。
(f)ROLLBACK
【问题2】
(g)BEFORE
(h)UPDATE
(i)ROW 
(j)‘25’
(k)NOT 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 【问题3】(4分)
    • 人事部门具有每月对员工进行额外奖罚的权限,该奖罚也反应到员工的最终工资上。假设当某月计算一位员工的最终工资时,同一时间人事部门对该员工执行了奖励2000元的事务操作,对应事务的部分调度序列如表4-1所示。
    • (1)请说明该事务调度存在哪种并发问题?
        • 存在的问题:人事部门更新的最终工资可能被计算最终工资事务的写入所覆盖,即发生丢失修改的问题。
    • (2)采用2PL是否可以解决该并发问题?是否会产生死锁?
        • 采用2PL可以解决上述问题,但是可能会产生死锁。
时间计算最终工资事务人事部门奖罚事务
T0…………
T1读取考勤、绩效和加班工资
T2根据奖罚更新最终工资
T3commit
T4读取岗位工资
T5计算最终工资并写入
T6commit
T7……

第二十章 案例专题五:数据库故障与恢复

  • 检查点机制(CHECKPOINT)
    • 在日志中设置检查点,当发生故障需要利用日志文件恢复时,反向扫描日志文件,找到检查点,确认检查点时刻正在执行的事务(活动事务) ,即检查点前有事务开始标志但没有事务结束标志。
    • 对于检查点后提交的事务,执行REDO(重做)
    • 对于检查点后未提交的事务,执行UNDO(撤销)
  • 解题思路:
    • 1、 找到检查点(CHECKPOINT
    • 2、 观察检查点之前有START标志的事务。
    • 3、 将这些事务分为以下三类:
      • (1) 在检查点之前提交(COMMIT)的事务
        • 这类事务在检查点时已经正常结束,并不是活动事务
        • 它所做的所有操作已经更新到了数据库,在恢复时不用做任何操作
      • (2) 在检查点之后提交的事务
        • 这类事务在检查点时并没有正常结束,是活动事务,故障恢复时需要做REDO(重做) 。
      • (3) 在检查点之前和之后都没有提交的事务
        • 这类事务在检查点时并没有正常结束,是活动事务,故障恢复时需要做UNDO(撤销) 。

20.1 2020年试题五(共15分)

  • 如果一个数据库恢复系统采用检查点机制,且其日志文件如表所示,第一列表示日志记录编号,第二列表示日志记录内容,<Ti,START>表示事务Ti开始执行,<Ti,COMMIT>表示事务Ti提交,<Ti,D,V1,V2>表示事务Ti将数据项D的值由V1修改为V2,请回答以下问题。
日志记录编号日志记录内容
LSN1<T1, START>
LSN2<T1,X,100,1>
LSN3<T2,START>
LSN4<T2,X,1,3>
LSN5<T3,START>
LSN6<T2,Y,50,6>
LSN7<T3,Y,6,8>
LSN8<T3,Z,10,9>
LSN9CHECKPOINT
LSN10<T1,COMMIT>
LSN11<T3,Z,9,10>
LSN12CRASH
  • 【问题1】(6分) 假设系统开始执行前X=100, Y=50, Z=10,系统出错恢复后,X,Y,Z各自的数值是多少?
    • 答:X=1,Y=50,Z=10
  • 【问题2】(4分)系统发生事务故障时,故障恢复有撤销事务(UNDO)和重做事务(REDO)两个操作,请给出系统恢复时需要REDO的事务列表和需要UNDO的事务列表。
    • 答:REDO:T1; UNDO:T2、T3
  • 【问题3】(5分)请简要描述系统出错后,基于检查点的恢复过程。
      • 1、发生故障后,反向扫描日志文件。
      • 2、扫描至检查点,确认当前活动事务为T1,T2,T3。
      • 3、检查点之后T1事务提交了,因此要重做(REDO),方法是从T1事务的开始标记起正向扫描日志文件,重新执行T1对数据库的所有操作,直到事务结束标志。
      • 4、检查点后T2、T3未提交,因此要撤销(UNDO),方法是反向扫描日志文件,将T2和T3对数据库的所有更新操作执行逆操作,直到事务开始标志。

20.2 2021年试题五 (共15分)

  • 如果一个数据库恢复系统采用检查点机制,且其日志文件如表所示,第一列表示日志记录编号,第二列表示日志记录内容,<Ti,START>表示事务Ti开始执行,<Ti,COMMIT>表示事务Ti提交,<Ti,D,V1,V2>表示事务Ti将数据项D的值由V1修改为V2,请回答以下问题。
日志记录编号日志记录内容
LSN1<T1, START>
LSN2<T1,I,22,3>
LSN3<T2,START>
LSN4<T2,L,32,37>
LSN5<T3,START>
LSN6<T2,J,45,5>
LSN7<T1,COMMIT>
LSN8<T3,M,53,15>
LSN9<T3,K,9,11>
LSN10CHECKPOINT
LSN11<T2,COMMIT>
LSN12CRASH
  • 【问题1】(6分)假设各数据项的初始值为:I=22,J=45,K=9,系统出错恢复后,I,J,K的数值会恢复为多少?
    • 答:I=3,J=5,K=9
  • 【问题2】(4分)请给出系统恢复时需要重做(Redo)的事务列表和需要撤销(Undo)的事务列表。
    • 答:Redo:T2;Undo:T3
  • 【问题3】(5分)假设掉电造成磁盘介质损坏,数据库无法启动,请用100字以内的文字简要说明其恢复过程。
    • 答:
      • 更换存储介质,重装数据库
      • 装载故障前最近一次的数据库备份(数据库镜像)和日志文件副本
      • 撤销(UNDO)故障发生时(检查点前)未完成的事务,重做(REDO)(检查点后)已提交的事务

20.3 2022年试题五(共15分)

  • 某数据库系统采用数据转储方式对数据和日志文件进行离线备份,用检查点机制进行恢复。假设部分其日志文件如表5-1所示。日志记录内容中:CHECKPOINT表示检查点,<Ti,START>表示事务Ti开始执行,<Ti,COMMIT>表示事务Ti提交,<Ti,D,V1,V2>表示事务Ti将数据项D的值由V1修改为V2。CRASH表明系统发生断电故障。假设各数据项的初始值为:I=3,J=6,K=11。
日志记录编号日志记录内容
LSN1<T1, START>
LSN2<T1,I,3,5>
LSN3<T2,START>
LSN4<T1,J,6,7>
LSN5<T2,I,5,4>
LSN6<T1,COMMIT>
LSN7CHECKPOINT
LSN8<T2,J,7,8>
LSN9<T3, START>
LSN10<T3,K,11,18>
LSN11<T4, START>
LSN12<T4,K,18,19>
LSN13<T2,COMMIT>
LSN14CRASH
  • 【问题1】(4分)系统发生故障时,满足持久化要求的事务有哪些?不满足持久化要求的事务有哪些?
    • 答: 满足持久化要求的事务有T1;不满足持久化要求的事务有T2、T3、T4
  • 【问题2】(6分)系统恢复后,数据项I、J、K的数值哪些会恢复为初始值?哪些不会恢复为初始值?请给出系统恢复后I、J、K的值。
    • 答:
      • K的数值会恢复为初始值;
      • I、J不会恢复为初始值;
      • I=4,J=8,K=11
  • 【问题3】(3分)如果系统采用先写数据库再记日记的机制,故障发生前已经提交了事务T2,但没有记录到<T2,COMMIT>。请给出系统恢复后I、J、K的值。
    • 答: I=5,J=7,K=11
  • 【问题4】(2分)基于问题2和问题3的结果,请用50字以内的文字简要说明为什么先写日志机制更优。
    • 答:
      • 如果先写入数据文件,后写日志,可能导致数据被修改后,该条修改记录没有来得及写入日志,系统就发生了故障,在恢复时无法恢复该条记录
      • 而先写日志,后写数据文件,即使在写日志与写数据文件的间隙发生了故障,并不影响最终数据库恢复的正确执行

20.4 2023年试题五(共15分)

  • 某装备的组装过程需要经过多道程序,由于工作空间狭小,同时只能有一人在操作间工作,所以在每道工序之间需要先完成使用配件的出库后,操作人员携带配件到操作间进行安装工作,安装过程中需要扫描配件编码以自动记录该配件的安装情况。
  • 假设存在三个事务用于处理某一类配件的某次安装实施,事务T1负责出库登记,T2负责安装登记,T3负责将未使用的配件重新入库。所有三个事务执行完成后,T1出库的数量应等于T2安装的数量与T3重新入库的数量之和。数据项I记录配件的库存数量,数据项J记录成功安装的数量。
  • 某次组装过程出库了12个配件,安装了6个。假设数据库系统采用检查点机制对故障进行恢复,部分日志文件如表5-1所示。日志记录内容中: <Ti,START>表示事务Ti开始执行,<Ti,COMMIT>表示事务Ti提交,<Ti,D,V1,V2>表示事务Ti将数据项D的值由V1修改为V2。例如:<T1,I,22,3>表示事务T1将数据项I的数值从22修改为3。<Ti,D,V>表示将事务Ti回滚,数据项D的值回滚到V。 <Ti,abort>表示事务 Ti回滚结束。CRASH表示系统磁盘出错。请回答以下问题。
日志记录编号日志记录内容
LSN1<T1, START>
LSN2<T1,I,20,8>
LSN3<T2,START>
LSN4<T2,J,0,1>
LSN5<T2,J,1,5>
LSN6<T3,START>
LSN7<T2,J,5,6>
LSN8<T1,COMMIT>
LSN9CHECKPOINT
LSN10<T2,COMMIT>
LSN11<T3,I,8, (a) >
LSN12CRASH
LSN13(b)
LSN14(c)
  • 【问题1】(5分)请用100字以内的文字简要说明数据库系统常见故障类型,并说明表5-1中的日志记录表明数据库出现哪种类型的故障。

    • 答:数据库系统常见的故障类型有:
      • (1)事务故障:是由于程序执行错误而引起事务非预期的、异常终止的故障。
      • (2)系统故障:是指硬件故障、软件(DBMS、OS或应用程序)漏洞的影响,导致丢失了内存中的信息,影响正在执行的事务,但未破坏存储在外存上的信息。
      • (3)介质故障:是指数据库的存储介质发生故障,如磁盘损坏,瞬间强磁场干扰等。
      • 表5-1日志记录中的数据库出现介质故障。
  • 【问题2】(4分)请给出系统恢复时需要重做(Redo)的事务列表和需要撤销(Undo)的事务列表。

      • Redo:T2;Undo:T3
  • 【问题3】(6分)根据题干中所描述的业务逻辑,请填写表5-1日志记录中的空白(a);请给出Undo恢复的补偿日志记录,填写空白(b)和(c)。

      • (a) 14
      • (b) <T3,I,8>
      • (c)<T3,abort>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/980576
推荐阅读
相关标签
  

闽ICP备14008679号