数据库系统学习笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


数据库系统学习笔记

共享锁与排他锁

共享锁(S锁,读锁):用于读取操作,允许多个事务同时读取同一数据对象。

排他锁(X锁,写锁):用于写操作,当一个事务T对数据对象A加上排他锁以后,只有该事务T可以对A读取和修改操作,而其他任何事务都不能再对A加任何类型的锁。

请求的锁 共享锁 排他锁
共享锁(S) 兼容 不兼容
排他锁(X) 不兼容 不兼容

假设有一行数据"余额 = 100元"。

  • 场景: 事务 T1 想要扣款 10 元。
  • 操作: T1 给"余额"加上排他锁
  • 结果:
    • T1 可以读取余额(100)并修改为 90。
    • 此时,事务 T2 想要查询余额,它必须申请共享锁。因为 T1 持有排他锁,T2 的查询请求会被阻塞(排队等待),直到 T1 提交事务并释放锁。这样就避免了 T2 在 T1 修改过程中读到混乱的数据。

本题选择A,T1已对A加了共享锁,其他事务只能对A加共享锁(能读),但不能加排他锁(不能写)。

三级模式

在数据库系统中,三级模式结构包括外模式、概念模式和内模式:

  • 外模式(用户视图层):是用户或应用程序能看到的数据视图,是概念模式的子集,虽然屏蔽了底层复杂性,但仍依赖于DBMS软件实现。
  • 概念模式 (全局逻辑层):描述数据库的全局逻辑结构,是数据库设计人员与用户沟通的工具,完全独立于硬件和软件 ,只关注数据的语义和关系,常用E-R图表示
  • 内模式 (物理存储层):描述数据在磁盘上的存储方式,高度依赖硬件和软件(如存储引擎、文件系统等)。

本题选择C,易错选B。主要是没能正确区分逻辑模型和概念模型

举例说明

  • 概念模型

    "学生选课"系统中有"学生"、"课程"、"选课"三个实体,学生和课程通过选课关联。

    → 这个描述不涉及任何数据库软件,也不管数据怎么存,纯业务语义

  • 逻辑模型

    在 MySQL 中,我们创建 Student(id, name)Course(cid, title)Enrollment(sid, cid) 三张表,并定义主外键。

    → 这已经是在特定 DBMS(MySQL)下 的设计,依赖软件

公共属性(列,外键)

在关系数据库中,实现实体之间的联系是通过表与表之间的公共属性

SQL中的NULL值

SQL 中对空值(NULL)的判断规则:

  • NULL 不是值,而是"未知"或"缺失"的状态。
  • 判断字段是否为空,必须使用 IS NULLIS NOT NULL
  • 严禁使用 =!=<> 等比较运算符与 NULL 进行比较,否则逻辑会失效。
  • NOT (AGE IS NULL) 是合法的逻辑表达式,等价于 AGE IS NOT NULL

本题选择C,NULL表示"未知"或"缺失",不是一个具体的值,任何等值比较都会返回UNKNOWN,而不是TRUE或FALSE

B选项是判断字段是否不为空的标准写法

SQL中的通配符

在 SQL 的 LIKE 子句中,%_通配符,用于进行模糊查询。

结合上一道题目(找出倒数第三个字母为 W 的部门名),这两个符号的具体含义如下:

%含义: 匹配任意长度 的字符串(包括长度为的空字符串)。

  • 例子:
    • '%W':匹配以 W 结尾的字符串(如:AWE, W, ABCW)。
    • 'W%':匹配以 W 开头的字符串(如:WABC, W, WXYZ)。
    • '%W%':匹配包含 W 的字符串(如:AWB, W, ABCW)。

_含义: 匹配单个字符。

  • 例子:
    • '__W':匹配第三个字符是 W 且总长度为 3 的字符串(如:ABW)。
    • 'W__':匹配第一个字符是 W 且总长度为 3 的字符串(如:WAB)。

根据题目要求,"倒数第三个字母为W"可表示为%_W__,即W前有任意数量字符,后有任意两个字符。但选项中无此模式。

选项B:_%W_表示W是第三个字符,结合"至少4个字母",可表示为%_W_%

例如,"ABWCD"中,W是第三个字符,符合"倒数第三个"(若总长度为5)。

综合分析,最合适的选项是B。

OS与DBMS直接的关系

在数据库系统(DBS)中,数据库管理系统(DBMS)是位于用户与操作系统(OS)之间的一层系统软件,其核心职责是管理数据库的存储、检索、更新、事务处理和安全控制等。为了完成这些任务,DBMS需要依赖操作系统提供的底层服务,例如文件管理、内存管理、进程调度和设备驱动等。

因此,DBMS会主动调用OS的接口或服务来完成数据的物理存储、读取或系统资源的分配 ,而不是由OS主动调用DBMS,也不是相互调用或完全独立并发运行。这种调用关系是单向的:DBMS → OS

本题选择B,那为什么有人会说 C?

通常是把"调用"理解成了更宽泛的"调度/启动/运行":

  • OS 会启动 DBMS 进程、调度 DBMS 线程运行------但这不叫"OS 调用 DBMS",而是 OS 在管理进程/线程。
  • 真正的"调用"在体系结构里通常指"上层软件通过接口使用下层服务",这才对应 DBMS → OS

需求分析阶段

数据库设计是一个系统化的过程,通常包含多个阶段,其中需求分析阶段是整个设计流程的起点。在这一阶段,设计者需要与用户沟通,深入理解业务需求、数据操作方式以及系统功能,从而为后续的概念设计、逻辑设计和物理设计提供明确的方向和依据。

本题选择A,网上也有选择C的

虽然题目中提到"应用程序设计",但其工作内容(如功能规划、用户交互、数据处理逻辑等)本质上依赖于对数据需求的准确认知,而这一认知正是从需求分析阶段 开始建立的。因此,应用程序设计的工作可以视为在需求分析基础上展开,其起点应归于数据库设计的需求分析阶段

如果把"应用程序设计"理解为基于表结构的详细设计/实现设计 (具体 SQL、接口、表单、存储过程、事务边界等),那通常要等到逻辑结构(关系模式/表、主外键、约束)确定后 才好展开,所以网上也有选择 C

规范化

关系数据库的规范化理论是数据库设计中的核心内容,其核心目标是如何构造合适的数据逻辑结构。在数据库逻辑设计阶段,规范化通过分解关系模式,消除数据冗余、更新异常、插入异常和删除异常,从而确保数据的一致性和完整性。

本题选择A

  • 选项B"如何构造合适的数据物理结构"属于物理设计范畴,涉及存储结构、索引、分区等,与规范化无关。
  • 选项C"如何构造合适的应用程序界面"属于应用开发或用户界面设计,不属于数据库理论范畴。
  • 选项D"如何控制不同用户的数据操作权限"属于数据库安全与权限管理,是数据库管理系统的功能,而非规范化理论解决的问题。

持久性

在数据库管理系统(DBMS)中,事务的持久性是指一旦事务提交,其对数据库的修改就应永久保存,即使系统发生故障或崩溃,修改结果也不能丢失。

实现持久性的核心机制依赖于恢复管理子系统 。该子系统通过日志记录 (redo log)和检查点(checkpoint)等技术,确保已提交事务的操作能够被持久化到非易失性存储设备(如磁盘)中。当系统崩溃后,恢复管理器可依据日志重做(redo)已提交但尚未写入磁盘的事务操作,从而保证数据不丢失。

本题选择D

  • A. 安全性管理子系统:负责用户权限控制、数据访问安全,与持久性无关。
  • B. 完整性管理子系统:负责约束约束(如主键、外键、约束)以保证数据一致性,不涉及事务提交后的持久化。
  • C. 并发控制子系统:负责协调多个事务的执行顺序,确保隔离性,避免数据冲突,不负责持久化。

并发控制

在数据库系统中,多个用户可能同时访问和修改数据。如果缺乏有效协调,一个用户的操作可能会干扰另一个用户的操作,导致数据不一致或错误结果。为解决此类问题,数据库管理系统需实施并发控制机制。

并发控制的核心目标是在允许多用户并行操作数据的同时,防止因交叉干扰导致的数据错误或逻辑冲突。它通过锁机制、事务隔离级别等技术,确保事务的独立性和数据的一致性。

本题选择C

  • 完整性控制:用于保证数据的正确性、有效性和相容性,例如约束、触发器等,不直接解决用户间操作干扰问题。
  • 安全性控制:用于防止未授权访问或数据泄露,如用户权限管理,不涉及操作顺序或并发冲突。
  • 访问控制:是安全性控制的一部分,控制用户能访问哪些资源,不解决并发操作间的干扰。

数据库设计六阶段

  1. 始于:搞清楚用户要什么(需求分析)。
  2. 画图:用E-R图描述业务逻辑(概念设计)。
  3. 转换:把图变成表(逻辑设计)。
  4. 优化存储:决定表怎么存最快(物理设计)。
  5. 动手建库:写代码,建表,导入数据(实施)。
  6. 长期维护:监控、备份、优化(运行维护)。
  • 选项 A(错误):需求分析阶段的核心是收集和分析用户需求,明确系统功能与数据要求,尚未涉及E-R图或数据模型的转换。
  • 选项 B(错误):概念设计阶段的任务是构建E-R图,用于描述现实世界的实体、属性及关系,是概念模型的建立,而非转换为关系模型。
  • 选项 C(正确):逻辑设计阶段的核心任务正是将概念设计阶段形成的E-R图转换为具体的关系数据模型(即关系模式),包括实体与联系的转化、属性映射、模式优化等,完全符合题干描述。
  • 选项 D(错误):物理设计阶段关注的是为关系模型选择合适的存储结构、索引、分区等物理实现细节,与E-R图转换无关。

这道题考查的是数据库设计各阶段的核心任务,关键在于区分"概念模型构建"与"逻辑模型转换"的界限。E-R图是概念模型,将其转换为关系模型是逻辑设计阶段的标志性工作。

集合运算

  • 并集(Union):符号为 A∪B,表示由属于集合 A 或集合 B 的所有元素组成的集合。例如,若 A = {1, 2},B = {2, 3},则 A∪BAB = {1, 2, 3}。并集强调"或"的关系,只要元素在任一集合中出现即被包含。
  • 交集(Intersection):符号为 A∩B ,表示由同时属于集合 A 和集合 B 的所有元素组成的集合。例如,若 A = {1, 2},B = {2, 3},则 A∩BAB = {2}。交集强调"且"的关系,元素必须在两个集合中同时存在。
  • 差集(Difference):符号为 A−B 或 A∖B,表示由属于集合 A 但不属于集合 B 的所有元素组成的集合。例如,若 A = {1, 2, 3},B = {2, 3, 4},则 A−BAB = {1}。差集体现"剔除"逻辑,从 A 中移除与 B 共有的部分。
  • 补集(Complement):符号为 Ac,表示在全集 U 中不属于集合 A 的所有元素组成的集合。例如,若全集 U = {1, 2, 3, 4, 5},A = {1, 2},则 Ac = {3, 4, 5}。补集依赖于全集的定义,是相对于全集而言的"剩余部分"。
  • 对称差集(Symmetric Difference):符号为 A⊕B或 A△B ,表示属于 A 或 B 但不同时属于两者的元素组成的集合。例如,若 A = {1, 2},B = {2, 3},则 A⊕B= {1, 3}。对称差集可以理解为"异或"逻辑,即只保留独有部分,剔除公共部分。
  • 子集(Subset):符号为 A⊆B,表示集合 A 中的每一个元素都属于集合 B。若 A 是 B 的真子集(即 A ≠ B),则记作 A⊂BAB 。例如,{1, 2} ⊆⊆ {1, 2, 3},且 {1, 2} ⊂⊂ {1, 2, 3}。
  • 空集(Empty Set):符号为 ∅或 {},表示不含任何元素的集合。空集是任何集合的子集,也是集合运算中的"零元"。

本题选择B

S-R表示①部分

S-(S-R)表示②部分,与R∩S等价

无损联接与保持函数依赖

无损联接:想象一下,如果你把一张大表拆成两张小表,之后再通过自然联接(Natural Join)把它们拼回去,如果拼出来的结果和原来一模一样(没有多出数据,也没有丢失数据),这就是无损联接。

保持函数依赖:分解后的各个小表,应该能覆盖原来大表所有的业务规则(即函数依赖)。

  • A. 是无损联接,也是保持FD的分解
  • B. 是无损联接,但不保持FD的分解
  • C. 不是无损联接,但保持FD的分解
  • D. 既不是无损联接,也不保持FD的分解

正确答案是 A。

什么是分布式数据库?

数据分布在计算机网络的不同计算机上,网络中的每个节点具有独立处理的能力,可以执行局部应用,同时,每个节点也能通过网络通信子系统执行全局应用。

数据分布性 数据不是集中在一个服务器上,而是分散存储在多台机器(可能跨机房、跨城市甚至跨国)。
逻辑整体性 对用户或应用程序而言,它看起来就像一个普通的单一数据库,无需关心数据实际存在哪里。
站点自治性 每个节点(站点)可以独立管理自己的本地数据,具有一定的自主控制权。
透明性 系统对用户隐藏了数据分布的复杂性,包括: 位置透明 :你不用知道数据在哪台机器上 复制透明 :你不知道数据是否有备份 分片透明:你不知道数据被拆成了几块

什么是数据库系统?

数据库系统是实现有组织地、动态地存储大量关联数据,方便多用户访问的计算机软、硬资源组成的系统。它包含关联数据的集合、DBMS和用户应用程序等。

数据库管理系统的主要功能是什么?

数据库定义、操作、事务管理、并发控制、安全与权限控制、备份与恢复、数据字典管理等功能

DBS的组成

数据库、数据库管理系统、应用程序、软硬件平台、数据库管理员、用户

简述关系模型的三个组成部分

  • 数据结构:基本数据结构是关系
  • 数据操纵:关系模型提供一组完备的高级关系运算,分为关系代数和关系演算
  • 数据完整性规则:包括实体完整性、参照完整性和用户自定义完整性

关系模型 = 数据结构 (表) + 操作集合 (查询/更新) + 完整性约束(规则)

解释文件系统为什么会存在数据冗余?这种数据冗余会导致哪两种典型的问题?

由于文件系统难于实现数据共享,相同的数据可能会在多个文件中重复出现,即产生数据冗余。

数据冗余会导致数据异常和数据不一致

SQL Server的许可系统为什么蒋用户分成四类?请将他们按层次从高到低排列出来

  • 系统管理员(SA,System Admin)
  • 数据库拥有者(DBO,Database Owner)
  • 公共用户(guest / public)
  • 一般用户(user)

并发操作会带来哪几类数据的不一致性问题?一、二、三级封锁协议分别可以解决哪几类数据不一致性问题?

  • 问题:丢失更新、读脏数据、不可重复读

  • 一级封锁解决丢失更新问题

  • 二级封锁解决丢失更新和度脏数据问题

  • 三级封锁解决丢失更新、读脏数据、不可重复读问题


并发操作引起的三类数据不一致性问题

问题类型 定义 关键特征 示例简述
丢失更新(Lost Update) 两个事务同时修改同一数据,后提交者覆盖前者的更新 写-写冲突 T1 和 T2 同时读 A=100,分别改为 150 和 200,最终只保留一个结果
读"脏"数据(Dirty Read) 读取了另一个未提交事务修改的数据,而该事务随后回滚 读-写冲突(读未提交) T1 修改 A=200(未提交),T2 读到 200,T1 回滚 → T2 读到无效值
不可重复读(Non-Repeatable Read) 同一事务内两次读同一数据,结果不同(因其他事务已提交修改) 读-写-读冲突 T1 第一次读 A=100,T2 修改 A=200 并提交,T1 第二次读得 200

📌 注:幻读(Phantom Read)是不可重复读的一种扩展(涉及新行插入/删除),传统三级封锁协议不能完全解决幻读


✅ 二、三级封锁协议对比表

封锁协议 加锁规则 锁释放时机 能解决的问题 不能解决的问题
一级封锁协议 (1PL) - 写前加 X 锁 (不要求读加锁) X 锁 事务结束才释放 ✅ 丢失更新 ❌ 脏读 ❌ 不可重复读
二级封锁协议 (2PL) - 写前加 X 锁 - 读前加 S 锁 - X 锁:事务结束释放 - S 锁:读完立即释放 ✅ 丢失更新 ✅ 脏读 ❌ 不可重复读
三级封锁协议 (3PL) - 写前加 X 锁 - 读前加 S 锁 - X 锁:事务结束释放 - S 锁:事务结束才释放 ✅ 丢失更新 ✅ 脏读 ✅ 不可重复读(值修改型) ❌ 幻读(需范围锁或 Serializable 隔离级别)

丢失更新(Lost Update):

  • 现象:两个事务同时读取同一数据项,各自修改后写回,后提交的事务覆盖了前一个事务的更新,导致前者的修改"丢失"。
  • 示例
    • T1 读 A=100,T2 也读 A=100;
    • T1 将 A 改为 150,T2 将 A 改为 200;
    • 若 T2 先写回,T1 后写回(或反之),最终结果只反映其中一个更新,另一个丢失。

读"脏"数据(Dirty Read)

  • 现象 :一个事务读取了另一个尚未提交的事务所修改的数据。若后者回滚,则前者读到的是"不存在"的无效数据。
  • 示例
    • T1 修改 A=200(未提交);
    • T2 读取 A=200;
    • T1 因错误回滚,A 恢复为 100;
    • T2 读到的 200 是"脏数据"。

不可重复读(Non-Repeatable Read)

  • 现象 :在同一事务中,两次读取同一数据项得到不同结果,因为其他事务在两次读之间修改并提交了该数据。
  • 包括三种情况
    • 数据值被修改(如 A 从 100 变为 200);
    • 数据被删除(第二次读不到);
    • 新数据被插入(幻读,Phantom Read,有时单独列出,但在传统三级封锁中归入不可重复读)。

一级封锁协议(1PL)

  • 规则
    • 事务在修改数据前 必须加 X 锁(排他锁)
    • 直到事务结束(提交或回滚)才释放 X 锁
  • 解决的问题
    • 丢失更新
      (因为写操作加 X 锁到事务结束,其他事务无法同时写,避免覆盖)

二级封锁协议(2PL)

  • 规则
    • 满足一级协议(写前加 X 锁,事务结束释放);
    • 读数据前必须加 S 锁(共享锁)
    • 读完后立即释放 S 锁(不是等到事务结束!)。
  • 解决的问题
    • 丢失更新(继承一级)
    • 读脏数据
      (因为要读未提交的数据,必须等其 X 锁释放;而未提交事务持有 X 锁不放,所以读操作会被阻塞,无法读到脏数据)

三级封锁协议(3PL)

  • 规则
    • 满足一级协议(写前加 X 锁,事务结束释放);
    • 读数据前加 S 锁
    • S 锁一直保持到事务结束才释放(关键区别!)。
  • 解决的问题
    • 丢失更新(X 锁到结束)
    • 读脏数据(S 锁需等 X 锁释放,即等对方提交)
    • 不可重复读(因为 S 锁持续到事务结束,其他事务无法修改该数据,保证多次读一致)

什么是触发器?触发器由那几部分组成?

是数据库中一种特殊的存储过程 ,它不需要用户显式调用 ,而是在特定的数据操作事件(如 INSERT、UPDATE、DELETE)发生时自动执行

核心思想:当某事发生时,自动做另一件事

触发器是一个能有系统自动执行对数据库修改的语句

  • 事件:对数据库的插入、删除、修改等操作
  • 条件:条件成立,执行相应动作,否则什么也不能做
  • 动作:如果满足预定条件,由DBMS执行这些动作

因此,触发器 = 事件 +(条件)+ 动作,并在指定时机(BEFORE/AFTER)自动执行

数据库至少包含几种后缀名的文件,分别存放什么信息?

SQL Server 数据库至少包含以下 *两种* 必需的文件(三种常见):

文件后缀 文件类型 存放的信息 是否必需
.mdf 主数据文件(Primary Data File) - 数据库的启动信息 (如数据库版本、状态等) - 用户数据和系统表数据 - 指向其他数据文件的指针 ✅ 是(每个数据库有且仅有一个)
.ndf 次要数据文件(Secondary Data File) - 额外的用户数据(当主文件空间不足或需要分散 I/O 时使用) - 可有多个,也可没有 ❌ 否(可选)
.ldf 日志文件(Log File) - 事务日志记录 (所有事务的开始、修改、提交/回滚信息) - 用于恢复、回滚、复制、高可用 ✅ 是(至少一个)

视图可以更新吗?会影响到实际表吗?

可以,会

视图本身不存储数据,它只是一个"保存好的查询语句"。

所以,当你"更新视图"时,并不是在更新一个独立的"虚拟表",而是数据库系统自动把你的更新操作转换成对底层实际表(基表)的操作。

因此,更新视图 = 间接更新实际表。

什么是关系的实体完整性、参照完整性和用户自定义完整性?

完整性(Integrity) 是指数据的正确性、有效性和一致性

  • 实体完整性:关系的主键(Primary Key)不能取空值(NULL),且必须唯一。
  • 参照完整性:外键(Foreign Key)的值必须是被参照关系(主表)中某个主键的值,或者为空(NULL);如果属性集K是关系模式R1的主键,同时,K也是关系模式R2的外键,那么在R2的关系中,K的取值只允许两种可能:NULL or 等于R1关系中某个主键
  • 用户自定义完整性:由用户根据具体应用语义定义的约束条件,反映现实世界的业务规则。
完整性类型 约束对象 核心规则 实现方式示例
实体完整性 主键(Primary Key) 主键 ≠ NULL,且唯一 PRIMARY KEY, UNIQUE NOT NULL
参照完整性 外键(Foreign Key) 外键 = 主表主键值 或 NULL FOREIGN KEY REFERENCES ...
用户自定义完整性 任意列或行 满足用户定义的业务规则(取值范围、格式等) CHECK, NOT NULL, 触发器等

建立在关系模式主码上的索引就是主索引吗?为什么?

不是,主索引从概念上主要是指索引结构中的搜索码的顺序与数据文件中的记录存储的物理顺序一致的索引,建立在主码上的索引未必满足一致性要求。

主索引(Primary Index) 是数据库系统中一种特定类型的索引结构,源于有序文件组织的物理存储模型。它的核心特点是:建立在数据文件的排序字段上,且该排序字段通常是主码或候选码。

主索引 = 在按主码(或候选码)物理有序存储的数据文件上,为该排序字段建立的稀疏索引。

在同一个SQL语句中的having子句和where子句中的条件是什么关系?

关系说明:互补协作

  • WHERE 先筛选出符合条件的"原始行",这些行才参与后续的分组;
  • HAVING 再对分组后的"聚合结果"进行筛选

✅ 因此,二者可以同时出现在一个查询中,共同完成"先过滤个体,再过滤群体"的需求。

特性 WHERE子句 HAVING子句
作用对象 原始表中的行(单条记录) 分组后的结果(GROUP BY 产生的组)
执行顺序 GROUP BY 之前执行 GROUP BY 之后执行
能否使用聚合函数 ❌ 不能(如 COUNT(), SUM() 等) ✅ 可以
能否引用 SELECT 中的列别名 ❌ 一般不能(取决于 DBMS) ❌ 通常也不能(应使用原始表达式)
目的 过滤参与分组的原始数据 过滤分组后的聚合结果

📌 执行顺序 (逻辑上):
FROMWHEREGROUP BYHAVINGSELECTORDER BY

简述数据库系统生存期的七个阶段

阶段序号 阶段名称 主要目标 主要工作内容 关键输出 特点说明
1 规划阶段 判断是否需要开发数据库系统,评估项目可行性 - 初步调研组织需求 - 分析技术/经济/操作可行性 - 制定项目计划与预算 可行性分析报告、项目章程 高层决策阶段,决定项目是否启动
2 需求分析阶段 全面、准确地收集用户对数据和处理功能的需求 - 与用户沟通业务流程 - 确定数据范围、结构、约束、安全要求 - 建立数据字典、数据流图(DFD) 《需求规格说明书》 面向用户,强调"做什么"而非"怎么做"
3 概念设计阶段 建立独立于具体 DBMS 的全局逻辑数据模型 - 使用 E-R 模型建模 - 设计实体、属性、联系 - 构建并验证全局 E-R 图 全局 E-R 图、概念模式 与硬件/软件无关,用户视角的数据视图
4 逻辑设计阶段 将概念模型转换为特定 DBMS 支持的数据模型(如关系模型) - E-R 图转关系模式 - 规范化(如 3NF、BCNF) - 定义主键、外键、完整性约束 逻辑数据库模式(SQL DDL 脚本) 面向 DBMS,确定表结构和约束
5 物理设计阶段 为逻辑模型选择最优的物理存储结构和访问方法 - 设计存储结构、文件组织 - 创建索引、聚簇、分区策略 - 考虑性能、空间、安全 物理存储方案、索引设计、配置参数 依赖具体 DBMS(如 Oracle、SQL Server)
6 实现与部署阶段 创建实际数据库,加载数据,开发并集成应用 - 执行 DDL 创建数据库 - 编写应用程序/存储过程/触发器 - 数据清洗与初始加载 - 进行系统测试 可运行的数据库系统、初始数据、应用 从设计走向现实,完成系统构建
7 运行与维护阶段 保障系统长期、稳定、高效、安全运行 - 日常监控、备份与恢复 - 性能调优 - 用户权限管理 - 故障处理 - 根据新需求进行局部修改 系统日志、优化报告、更新版本 持续时间最长,占生命周期 80% 以上

✅ 补充说明:

  • 迭代性:各阶段并非严格线性,常有反馈和返工(如维护阶段发现需求遗漏,可能回退到需求或设计阶段)。
  • 角色分工
    • 阶段 1--3:系统分析师、用户代表主导;
    • 阶段 4--5:数据库设计师主导;
    • 阶段 6--7:开发人员、DBA(数据库管理员)、运维人员主导。

什么是事务?事务具有哪些特征?

事务 是数据库管理系统(DBMS)中用户定义的一个逻辑工作单元 ,它由一系列数据库操作(如 INSERT、UPDATE、DELETE、SELECT 等)组成。这些操作要么全部成功执行 ,要么全部不执行,是一个不可分割的整体。

✅ 简单说:事务是"全做或全不做"的操作序列。

示例:

银行转账操作:

复制代码
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 100 WHERE name = 'Bob';
COMMIT;
  • 这两个 UPDATE 必须同时成功 ,否则全部回滚(如 Alice 扣款成功但 Bob 未到账,则整个操作无效)。

事务必须满足 ACID 四个基本性质,这是保证数据库可靠性和一致性的核心:

特性 全称 含义 说明
A Atomicity (原子性) 事务是不可分割的最小工作单元 事务中的所有操作要么全部完成,要么全部不执行。即使在执行过程中发生故障,也必须回滚到事务开始前的状态。
C Consistency (一致性) 事务执行前后,数据库必须保持一致性状态 事务不能破坏数据库的完整性约束(如主键、外键、CHECK 约束等)。例如:转账前后总金额不变。
I Isolation (隔离性) 并发执行的多个事务相互隔离,互不干扰 一个事务的中间状态对其他事务不可见。即使多个事务并发执行,最终结果应等价于某种串行执行顺序。
D Durability (持久性) 一旦事务提交,其结果永久保存 即使系统崩溃(如断电、宕机),已提交事务的结果也不会丢失(通常通过日志实现)。

数据库常见的故障有哪些?

故障类别 常见原因 影响范围 磁盘数据是否损坏 恢复机制 是否需要人工干预 典型恢复时间
1. 事务内部故障 - 程序逻辑错误(如除零、死循环) - 违反完整性约束 - 用户主动回滚 - 死锁被系统终止 仅当前事务 ❌ 否 利用 undo 日志 回滚该事务的所有操作 ❌ 否(DBMS 自动处理) 毫秒~秒级
2. 系统故障 - 操作系统崩溃 - DBMS 异常退出 - 断电 - 内存故障 所有正在运行的事务 (内存中数据丢失) ❌ 否 重启后: - 对已提交事务 → redo 日志重做 - 对未提交事务 → undo 日志回滚 (基于 WAL 机制) ❌ 否(自动恢复) 秒~分钟级
3. 介质故障 - 硬盘物理损坏(坏道、烧毁) - 病毒删除数据文件 - 误删数据库文件 - 自然灾害 部分或全部数据库文件 ✅ 是 1. 从最近备份 (全量/增量)恢复数据 2. 重放归档日志/事务日志至故障前状态 ✅ 是(需 DBA 操作) 分钟~小时级(取决于备份策略)

什么是数据库系统安全性?数据库安全性控制的常用方法包括哪些?

数据库系统安全性(Database Security) 是指保护数据库中的数据,防止非法访问、篡改、泄露或破坏 ,确保数据的机密性、完整性、可用性可控性

简单来说:只允许合法用户以合法方式访问其有权访问的数据。

方法

控制方法 说明 典型技术/手段
1. 用户身份认证(Authentication) 验证用户身份是否合法 - 用户名/密码 - Windows 集成认证(如 SQL Server) - 多因素认证(MFA) - Kerberos、LDAP、证书认证
2. 存取控制(Access Control) 控制用户对数据库对象的访问权限 - 自主存取控制(DAC) :通过 GRANT / REVOKE 授予权限 - 强制存取控制(MAC):基于安全标签(如军用系统) - 角色(Role)管理:简化权限分配
3. 视图机制(View Mechanism) 为不同用户定制数据"窗口",隐藏敏感字段 - 创建仅包含部分列/行的视图 - 用户只能查询视图,无法访问基表
4. 审计(Auditing) 记录用户操作行为,用于监控与事后追查 - 启用数据库审计日志 - 记录登录、DDL、DML 操作 - 分析异常行为(如多次失败登录)
5. 数据加密(Encryption) 对敏感数据进行加密存储或传输 - 传输加密 :SSL/TLS(防网络窃听) - 存储加密 :TDE(透明数据加密) - 列级加密:对身份证、银行卡号等字段单独加密
6. 安全策略与防火墙 从网络和系统层面防护 - 数据库防火墙(过滤非法 SQL) - 网络隔离(VLAN、DMZ) - 最小权限原则(Principle of Least Privilege)

设计题:图书馆-图书-收藏

有如下关系模式:

图书馆(图书馆号,图书馆名,城市,电话)

图书(图书号,图书名,单价)

收藏(图书馆号,图书号,数量)

  • 请写出关系代数表达式查询馆号为"L1"的图书馆收藏的所有图书的图书号和图书名。

π 图书号, 图书名 ( σ 图书馆号 = ′ L 1 ′ ( 收藏 ) ⋈ 图书 ) \pi_{\text{图书号, 图书名}} \left( \sigma_{\text{图书馆号} = 'L1'}(\text{收藏}) \bowtie \text{图书} \right) π图书号, 图书名(σ图书馆号=′L1′(收藏)⋈图书)

  • 用SQL语句查询收藏了图书《数据库系统概论》的图书馆名。
sql 复制代码
> 写法一:
> select 图书馆名 from 图书馆 where 图书馆号 in(
> select 图书馆号 from 收藏 where 图书号=(
> select 图书号 from 图书 where 图书名=''数据库系统概论')))

> 写法二:
> SELECT  图书馆.图书馆名 FROM 图书馆, 图书, 收藏
>  WHERE 图书馆.图书馆号 = 收藏.图书馆号  
> AND 收藏.图书号 = 图书.图书号  
> AND 图书.图书名 = '数据库系统概论';

> 写法三:
> SELECT DISTINCT L.图书馆名 FROM 图书馆 L
>  JOIN 收藏 C ON L.图书馆号 = C.图书馆号     *-- 连接图书馆和收藏*
>  JOIN 图书 B ON C.图书号 = B.图书号         *-- 连接收藏和图书* 
> WHERE B.图书名 = '数据库系统概论';          *-- 过滤特定书名*
  • 用SQL语句查询馆号为"L1"的图书馆没有收藏的图书号和图书名。
sql 复制代码
select 图书号,图书名 from 图书
where not exists ( select * from 收藏 where 收藏.图书号=图书.图书号 and 图书馆号='L1');
  • 用SQL语句查询馆号为"L1"的图书馆收藏图书的平均价格。
sql 复制代码
> 写法一:`JOIN` 连接
> SELECT AVG(图书.单价) AS 平均价格 
> FROM 图书 
> JOIN 收藏 ON 图书.图书号 = 收藏.图书号 
> WHERE 收藏.图书馆号 = 'L1';

> 写法二:`IN` 子查询
> SELECT AVG(单价) AS 平均价格 
> FROM 图书 
> WHERE 图书号 IN (   
>  SELECT 图书号    
>  FROM 收藏     
> WHERE 图书馆号 = 'L1' );
  • 用SQL语句删除"重庆市图书馆"的所有收藏记录。✅
sql 复制代码
delete from 收藏 
where 图书馆号=(
select 图书馆号 from 图书馆
 where 图书馆名='重庆市图书馆');
IN子查询 JOIN
本质 集合成员判断 表关系连接
结果 自动去重 可能重复(需警惕)
扩展性 弱(不能取连接表字段)
现代推荐度 适用于特定场景 更通用、更主流

设计题:供应商-商品-供货记录

设供销管理系统的部分数据库模式如下所示:

供应商(供应商编号,供应商名称,地址,联系电话,联系人)

商品(商品编号,商品名称,型号,产地,生产日期)

供货记录(供应商编号,商品编号,供货日期,数量,单价,经办人)

  1. 请写出关系代数表达式查询供应商"大华公司"供应的所有商品的编号和名称。
    π 商品编号, 商品名称 ( σ 供应商名称 = ′ 大华公 司 ′ ( 供应商 ) ⋈ 供货记录 ⋈ 商品 ) \pi_{\text{商品编号, 商品名称}} \left( \sigma_{\text{供应商名称} = '大华公司'} (\text{供应商}) \bowtie \text{供货记录} \bowtie \text{商品} \right) π商品编号, 商品名称(σ供应商名称=′大华公司′(供应商)⋈供货记录⋈商品)

  2. 用SQL语句查询供应了编号为'A02'的商品的所有供应商的名称和联系电话。

    sql 复制代码
    写法一:
    select 供应商名称,联系电话 from 供应商
    where 供应商编号 in (
    select 供应商编号 from 供货记录 where 商品编号='A02'
    )
    写法二:
    select 供应商名称,联系电话 from 供应商,供货记录
    where 供应商.供应商编号=供货记录.供应商编号 and 商品编号='A02'; 
    
    写法三:
    SELECT DISTINCT s.供应商名称, s.联系电话
    FROM 供应商 s
    JOIN 供货记录 r ON s.供应商编号 = r.供应商编号
    WHERE r.商品编号 = 'A02';
  3. 用SQL语句查询编号为'S06'的供应商没有供应的商品的编号和名称。✅

    sql 复制代码
    select 商品编号,商品名称 from 商品
    where not exists (
    select * from 供货记录 
        where供货记录.商品编号=商品.商品编号 and 供应商编号='S06'
    );
  4. 用SQL语句建立经办人张明2006年12月31日以后经办的供货记录视图,视图名为"V1"。

    sql 复制代码
    create view V1 as
    select * from 供货记录
    where 经办人='张明' and 供货日期 > '2006123`';
  5. 用SQL语句删除编号为"S13"的供应商信息及其供货记录。✅

    sql 复制代码
    delete from 供货记录 where 供应商编号='S13';
    delete from 供应商 where 供应商编号='S13';

    总结:

    选择(Selection)

σ供应商名称=′大华公司′(供应商)

→ 从 供应商 表中筛选出名为 "大华公司" 的供应商记录(得到其 供应商编号)。

  • 自然连接(Natural Join)
    • 先与 供货记录 连接:通过 供应商编号 关联,得到 "大华公司" 的所有供货记录(含 商品编号);
    • 再与 商品 连接:通过 商品编号 关联,获取每条供货记录对应的商品信息(含 商品名称)。
  • 投影(Projection)

π商品编号, 商品名称π商品编号, 商品名称

→ 仅保留题目要求的两个属性。

📌 说明:

  • 使用

    自然连接(⋈)

    是因为:

    • 供应商供货记录 有公共属性 供应商编号
    • 供货记录商品 有公共属性 商品编号
  • 无需显式写出连接条件,自然连接会自动基于同名属性等值匹配。

相关推荐
野犬寒鸦9 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL10 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
shandianchengzi10 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
·云扬·10 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
浅念-10 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
IT邦德10 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
ZH154558913110 小时前
Flutter for OpenHarmony Python学习助手实战:API接口开发的实现
python·学习·flutter
爱吃生蚝的于勒10 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
奶茶精Gaaa10 小时前
工具分享--F12使用技巧
学习