中级软考(软件工程师)第九章知识点——数据库技术基础

  • 分值占比:6~25分
  • 题型:单选,案例题至少一道
  • 注意点: 重点,需要掌握计算和理论知识
    在这里插入图片描述

一、数据库模型

1.1 三级模式

(1) 外模式—— 用户的眼镜

  • 别名用户模式子模式
  • 定义:它是用户(包括应用程序员和最终用户)能够看到的数据库数据的局部描述。
  • 通俗理解“私人定制”的视图
    • 比如:财务部只能看到员工的“工资表”视图;人事部只能看到员工的“考勤表”视图。他们都只看到了数据的一部分。
  • 数量多个。一个数据库可以有各种各样的外模式,对应不同的用户组。

(2) 概念模式 —— 数据的全貌

  • 别名模式(注意:考试中单说“模式”通常指概念模式)、逻辑模式
  • 定义:它是数据库中全体数据的逻辑结构和特征的描述。
  • 通俗理解“上帝视角”的大表
    • 它定义了所有的表、字段、类型、主外键关系。它不关心数据存在哪个硬盘上,也不关心具体谁来看,它只关心数据本身的逻辑。
  • 数量只有一个。全公司只有一个总的员工信息逻辑定义。

(3) 内模式—— 硬盘的真相

  • 别名物理模式存储模式
  • 定义:它是数据在数据库系统内部的物理存储方式的描述。
  • 通俗理解数据的物理“老巢”
    • 它决定了数据是按什么顺序存的(堆文件还是顺序文件)、索引是怎么建的(B+树还是Hash)、数据被压缩了吗、加密了吗。
  • 数量只有一个。物理存储结构在某一时刻是唯一的。

1.2. 二级映射

📝 这三级模式是隔离的,怎么把它们连起来?靠的就是两层映射(桥梁)。

(1) 外模式/模式映像

  • 位置:介于 外模式概念模式 之间。
  • 作用:定义了用户的局部视图(外模式)和全局逻辑视图(概念模式)之间的对应关系。
  • 例子:告诉系统,“财务视图”里的salary字段,对应的是“员工总表”里的base_pay + bonus字段。

(2) 模式/内模式映像

  • 位置:介于 概念模式内模式 之间。
  • 作用:定义了全局逻辑视图(概念模式)和物理存储(内模式)之间的对应关系。
  • 例子:告诉系统,“员工总表”里的数据,实际上是存储在 D:\Data\emp.db 文件中的,并且在 ID 字段上有个 B+ 树索引。

1.3. 数据的独立性

📝 这是设计“三级模式-两级映射”的终极目的:为了让程序和数据解耦

(1) 逻辑独立性

  • 含义:当模式(概念模式)改变时(例如:表中增加了一个新列),管理员只需要修改 “外模式/模式映像”,而使外模式保持不变。
  • 结果应用程序不需要修改
    • 例子:总表里加了“发际线”这一列,但财务部的视图定义不用变,财务软件也不用重写代码。

(2) 物理独立性

  • 含义:当内模式改变时(例如:更换了更快的硬盘、改变了索引结构、数据存储路径变了),管理员只需要修改 “模式/内模式映像”,而使**模式(概念模式)**保持不变。
  • 结果应用程序(以及逻辑结构)完全不知道底层发生了变化
    • 例子:数据库从机械硬盘搬到了SSD,或者为了加速查询加了个索引,逻辑上的表结构完全没变,程序照样跑。

5. 知识模块总结 Flowchart

这张图展示了三级模式的层次结构和映射关系,请务必印在脑海里:

物理独立性

逻辑独立性

用户/应用A

用户/应用B

外模式 A (用户模式)

外模式 B (用户模式)

模式 (概念/逻辑模式)

内模式 (物理模式)

物理数据库

外模式/模式映像

模式/内模式映像

二、数据模型(重点,和下午第二道大题有直接关系)

2.1 两类数据模型

(1) 概念数据模型

  • 视角用户的视角(人能看懂的)。
  • 作用:用来跟客户沟通需求。不关心电脑怎么存,只关心业务里有哪些东西(人、事、物)。
  • 代表E-R 模型(实体-联系图)
  • 考点:它是现实世界到机器世界的中间桥梁

(2) 基本/逻辑数据模型

  • 视角计算机/DBMS 的视角(数据库软件能看懂的)。
  • 作用:决定了数据在数据库里怎么组织(表?树?网?)。
  • 代表
    • 关系模型 (Relational):目前最主流(用二维表存储),也是软考必考
    • 层次模型(树状,像文件系统)、网状模型(图状)、面向对象模型。

2.2 数据模型三要素

任何一个数据库系统(比如 MySQL, Oracle),都必须具备这三个条件:

  1. 数据结构(静态):
    • 数据长什么样?(是表还是树?)
    • 比如:关系模型的数据结构是“二维表”。
  2. 数据操作(动态):
    • 能对数据干什么?
    • 比如:增、删、改、查 (CRUD)。
  3. 数据的约束条件(规则):
    • 数据必须遵守什么规矩?为了保证数据的正确性。
    • 比如:学号不能重复(主键约束)、年龄不能是负数(用户定义约束)。

2.3. E-R 模型与图符详解

这一部分是下午作图题的基础,请务必区分清楚以下图形:

(1) 基础三件套(必会)

  • 矩形 → \to 实体 (Entity)
    • 现实中存在的独立事物(如:学生、课程、老师)。
  • 菱形 → \to 联系 (Relationship)
    • 实体之间的交互(如:学生 选修 课程,老师 教授 课程)。
    • 重点:联系也可以有属性!(比如“选修”这个联系,可以有一个属性叫“成绩”)。
  • 椭圆 → \to 属性 (Attribute)
    • 实体的特征(如:姓名、学号)。

(2) 进阶符号

这些符号用于描述更复杂的业务逻辑,下午题中有时会出现:

  • 双边矩形 → \to 弱实体集 (Weak Entity)
    • 含义:它不能独立存在,必须依附于另一个实体(强实体)。
    • 例子:员工(强实体)和 家属(弱实体)。如果员工离职删库了,家属的信息也就没意义了。家属没有独立的主键,通常靠员工ID+家属编号来区分。
  • 双边菱形 → \to 弱实体集对应的标识性联系
    • 含义:连接强实体和弱实体的那个菱形,要画成双层的。
  • 双椭圆 → \to 多值属性 (Multi-valued Attribute)
    • 含义:一个属性对应多个值。
    • 例子:一个人的 “手机号”(可能有一个移动、一个联通)、“学位”(学士、硕士)。
  • 虚椭圆 → \to 派生属性 (Derived Attribute)
    • 含义:这个属性在数据库里不直接存,而是通过其他属性算出来的。
    • 例子“年龄”。数据库里只存“出生日期”,年龄是根据(当前日期 - 出生日期)算出来的,画图时用虚线椭圆。
  • 双线 → \to 全部参与 (Total Participation)
    • 含义:实体集中的每一个实例都必须参与到这个联系中。
    • 例子:职工与部门的“从属”关系。如果规定“每个职工必须属于一个部门”,那么职工这边的连线就要画双线。
      在这里插入图片描述

三、数据库操作

3.1 关系模型的完整性规则

  1. 实体完整性:主属性不能为空值。
  2. 参照完整性:外键的值必须存在。
  3. 用户定义完整性:满足用户要求,这是脱离数据库本身,用户制定的规则。

3.2 基本关系运算

在这里插入图片描述
📝 这里我们重点说一下比较容易犯错的几个运算符,其余的简单说明,下面是要用到的数据

关系 R(学生表)

A (学号)B (姓名)C (课程号)
1张三01
1张三02
2李四01

关系 S2(用于连接/除法)

C (课程号)D (课程名)
01数学
02英语

(1)关系运算符

📝 这是考试中最常考、最容易混淆的部分,尤其是除法

(1) σ \sigma σ 选择
  • 含义“横向”切一刀。根据条件筛选出(元组)。对应 SQL 中的 WHERE 子句。
  • 例子 σ A = 1 ( R ) \sigma_{A=1}(R) σA=1(R) (选出学号为1的记录)
    • 结果
      ABC
      1张三01
      1张三02
(2) π \pi π 投影
  • 含义“纵向”切一刀。根据条件筛选出(属性),并自动去重。对应 SQL 中的 SELECT DISTINCT 列名
  • 例子 π A , B ( R ) \pi_{A, B}(R) πA,B(R) (只看学号和姓名)
    • 结果
      AB
      1张三
      2李四
    • 注意:原表中张三有两行,投影后去重变为一行。
(3) ⋈ \bowtie 自然连接
  • 含义:将两个表拼接起来。自动寻找同名列(这里是 C 列),相等才拼接,并且去掉重复的列
  • 例子 R ⋈ S 2 R \bowtie S2 RS2
    • 逻辑:R 中的 C=01 与 S2 中的 C=01 拼,02 与 02 拼。
    • 结果
      ABCD
      1张三01数学
      1张三02英语
      2李四01数学
    • 考点:列数 = R列数 + S2列数 - 公共列数(3+2-1 = 4列)。
(4) ÷ \div ÷
  • 含义“包含所有”。R ÷ \div ÷ S 的结果是:R 中包含了 S 中所有值的那些记录。
  • 通俗解释:假设 S2 中有“数学”和“英语”两门课。 R ÷ S 2 R \div S2 R÷S2 的意思就是:“找出既选修了数学,又选修了英语的学生”
  • 例子:设 S3 只有一列 C(01, 02)。求 R ÷ S 3 R \div S3 R÷S3
    • 分析
      • 张三(1):选了 01,也选了 02。 -> 选中
      • 李四(2):只选了 01,没选 02。 -> 淘汰
    • 结果
      AB
      1张三

(2) 集合运算符

这就完全是数学里的集合概念。前提:参与运算的两个关系(表)必须列数相同,且对应列的数据类型相同

假设我们有 表 R1表 R2

  • R1: { (1, 张三), (2, 李四) }
  • R2: { (1, 张三), (3, 王五) }
(1) ∪ \cup
  • 含义:R1 和 R2 加起来,去重。
  • 例子 R 1 ∪ R 2 R1 \cup R2 R1R2
  • 结果:{ (1, 张三), (2, 李四), (3, 王五) }
(2) − -
  • 含义:属于 R1 但不属于 R2 的。
  • 例子 R 1 − R 2 R1 - R2 R1R2 (R1 减去 R2 中有的)
  • 结果:{ (2, 李四) } (因为 (1,张三) 在 R2 里也有,被减掉了)
(3) ∩ \cap
  • 含义:既属于 R1 又属于 R2 的。
  • 例子 R 1 ∩ R 2 R1 \cap R2 R1R2
  • 结果:{ (1, 张三) }
(4) × \times × 笛卡尔积
  • 含义暴力组合。R1 的每一行去配对 R2 的每一行。不需要列相同
  • 例子 R 1 × R 2 R1 \times R2 R1×R2
  • 考点计算
    • 行数 (基数) = R1行数 × \times × R2行数 ( 2 × 2 = 4 2 \times 2 = 4 2×2=4 行)
    • 列数 (度) = R1列数 + R2列数 ( 2 + 2 = 4 2 + 2 = 4 2+2=4 列)
  • 结果
    1. (1, 张三, 1, 张三)
    2. (1, 张三, 3, 王五)
    3. (2, 李四, 1, 张三)
    4. (2, 李四, 3, 王五)

(3) 比较与逻辑运算符

这两个通常不单独作为代数运算,而是作为 σ \sigma σ (选择) ⋈ \bowtie (连接)辅助条件

比较运算符
  • 符号 > , ≥ , < , ≤ , = , ≠ >, \ge, <, \le, =, \ne >,,<,,=,=
  • 例子 σ 成绩 ≥ 60 ( 学生表 ) \sigma_{成绩 \ge 60}(学生表) σ成绩60(学生表)
    • 含义:选出成绩大于等于60分的学生。
逻辑运算符
  • 符号
    • ¬ \neg ¬ (非/NOT)
    • ∧ \wedge (与/AND)
    • ∨ \vee (或/OR)
  • 例子 σ ( 成绩 ≥ 60 ) ∧ ( 性别 = ′ 女 ′ ) ( 学生表 ) \sigma_{(成绩 \ge 60) \wedge (性别 = '女')}(学生表) σ(成绩60)(性别=)(学生表)
    • 含义:选出成绩及格并且是女生的记录。

(4)扩展关系运算

1. 自然连接

在这里插入图片描述

一句话核心找同名列,值相等的拼在一起,列去重。

  • 规则

    1. 找到两个表中所有同名的属性(列)。
    2. 保留这些同名属性值完全相同的行。
    3. 去掉重复的列(同名列只留一份)。
  • 图片实例分析(图 9-3)

    • 同名列:关系 R R R S S S 都有列 A A A 和列 C C C。所以连接条件是 R.A = S.A AND R.C = S.C
    • 比对过程
      • R 第一行 (a, b, c):去 S 里找 A = a A=a A=a C = c C=c C=c 的行。
        • 找到了 S 的第一行 ( a , c , d ) (a, c, d) (a,c,d)。匹配成功!
        • 合并结果: ( a , b , c , d ) (a, b, c, d) (a,b,c,d)
      • R 第二行 (b, a, d):去 S 里找 A = b A=b A=b C = d C=d C=d 的行。
        • 找到了 S 的第三行 ( b , d , g ) (b, d, g) (b,d,g)。匹配成功!
        • 合并结果: ( b , a , d , g ) (b, a, d, g) (b,a,d,g)
      • R 第三行 (c, d, e):去 S 里找 A = c A=c A=c C = e C=e C=e 的行。没找到。 → \to 舍弃。
      • R 第四行 (d, f, g):去 S 里找 A = d A=d A=d C = g C=g C=g 的行。没找到。 → \to 舍弃。
    • 最终结果:就是图 © 中的那两行。

2. 除法 ( ÷ \div ÷) —— 图 9-4

在这里插入图片描述

一句话核心必须包含“对方”所有的组合,才能被选中。

  • 场景比喻

    • R R R 是“选课表”(学生,课程)。
    • S S S 是“必修课表”(课程)。
    • R ÷ S R \div S R÷S 的结果就是:选修了所有必修课的学生
  • 图片实例分析(图 9-4)

    • 被除数 R:包含属性 { A , B , C , D } \{A, B, C, D\} {A,B,C,D}
    • 除数 S:包含属性 { C , D } \{C, D\} {C,D}
    • 结果属性 R R R 的属性减去 S S S 的属性 → { A , B } \to \{A, B\} {A,B}
    • 运算逻辑
      • S 中有的组合是:{(c, d), (e, f)}。这意味着,要想被选中,R 中的某组 { A , B } \{A, B\} {A,B} 必须同时拥有 ( c , d ) (c, d) (c,d) ( e , f ) (e, f) (e,f) 这两对后缀。
    • 逐行检查 R 中的候选人 { A , B } \{A, B\} {A,B}
      • { a , b } \{a, b\} {a,b}
        • R 第一行有 ( a , b , c , d ) (a, b, \mathbf{c, d}) (a,b,c,d) → \to 满足条件1。
        • R 第二行有 ( a , b , e , f ) (a, b, \mathbf{e, f}) (a,b,e,f) → \to 满足条件2。
        • 结论 { a , b } \{a, b\} {a,b} 全部命中,保留
      • { b , d } \{b, d\} {b,d}
        • R 第四行有 ( b , d , e , f ) (b, d, \mathbf{e, f}) (b,d,e,f) → \to 满足条件2。
        • R 第五行有 ( b , d , d , l ) (b, d, d, l) (b,d,d,l) → \to 不相关。
        • 找遍了也没找到 ( b , d , c , d ) (b, d, \mathbf{c, d}) (b,d,c,d)
        • 结论 { b , d } \{b, d\} {b,d} 未能包含所有,淘汰
      • { c , k } \{c, k\} {c,k}
        • R 第六行有 ( c , k , c , d ) (c, k, \mathbf{c, d}) (c,k,c,d) → \to 满足条件1。
        • R 第七行有 ( c , k , e , f ) (c, k, \mathbf{e, f}) (c,k,e,f) → \to 满足条件2。
        • 结论 { c , k } \{c, k\} {c,k} 全部命中,保留
    • 最终结果:图 © 中的 { a , b } \{a, b\} {a,b} { c , k } \{c, k\} {c,k}

3. 外连接—— 图 9-5

在这里插入图片描述

一句话核心不想丢数据,连不上的用 NULL (空值) 填。

在图 9-5 中,连接的公共列是 B B B C C C

(1) 左外连接 ( R ⊐ ⋈ S R \sqsupset\kern-2pt\bowtie S RS)**
  • 口诀左边是老大,右边配合它。
  • 逻辑:保留左表 R R R 的所有行。如果 S S S 中有匹配的,就填数据;如果 S S S 中没有匹配的,就填 null
  • 分析图 ©
    • R 的第一行 ( a , b , c ) (a, b, c) (a,b,c) 能在 S 中匹配到 ( b , c , d ) (b, c, d) (b,c,d),所以结果是完整数据。
    • R 的第二行 ( b , a , d ) (b, a, d) (b,a,d),在 S 中找不到 B = a , C = d B=a, C=d B=a,C=d 的行。怎么办?保留 R,S 部分填 null
    • R 的第三行 ( c , d , e ) (c, d, e) (c,d,e),能匹配到 S 的 ( d , e , g ) (d, e, g) (d,e,g),结果完整。
    • R 的第四行 ( d , f , g ) (d, f, g) (d,f,g),在 S 中找不到 B = f , C = g B=f, C=g B=f,C=g 的行。保留 R,S 部分填 null
(2) 右外连接 ( R ⋈ ⊏ S R \bowtie\kern-2pt\sqsubset S RS)**
  • 口诀右边是老大,左边配合它。
  • 逻辑:保留右表 S S S 的所有行。R 中没匹配上的填 null
  • 分析图 (d)
    • S 的 ( b , c , d ) (b, c, d) (b,c,d) ( d , e , g ) (d, e, g) (d,e,g) 都在 R 中找到了匹配,正常显示。
    • S 的第三行 ( f , d , g ) (f, d, g) (f,d,g),找 R 中 B = f , C = d B=f, C=d B=f,C=d 的行,没找到。保留 S,R 部分填 null
    • S 的第四行 ( d , e , c ) (d, e, c) (d,e,c),找 R 中 B = d , C = e B=d, C=e B=d,C=e 的行,虽然 R 有 ( c , d , e ) (c, d, e) (c,d,e) 但那是 B = d , C = e B=d, C=e B=d,C=e,匹配上了!(注:仔细看图,R的第三行是 c, d, e,对应 B=d, C=e。S的第二行是 d, e, g,对应 B=e, C=g 吗?不对,S的列是 B, C, D。所以 S 的第二行是 B=d, C=e, D=g。这与 R 的第三行 B=d, C=e 匹配。)
    • 修正观察 S 的第四行:S 的第四行是 f , d , g f, d, g f,d,g (B=f, C=d),R 里没这个组合,所以填 null。图中的第四行是 d , e , c d, e, c d,e,c (B=d, C=e),这应该能匹配上 R 的第三行啊?
    • 图 (d) 解析勘误:仔细看图 (d) 的最后一行。S 是 ( d , e , c ) (d, e, c) (d,e,c),即 B = d , C = e , D = c B=d, C=e, D=c B=d,C=e,D=c。R 中有没有 B = d , C = e B=d, C=e B=d,C=e?有!是 ( c , d , e ) (c, d, e) (c,d,e)。所以应该匹配。但图中显示的是 null, f, d, g,这对应的是 S 的第三行。图中似乎少画了 S 的第四行 ( d , e , c ) (d, e, c) (d,e,c) 的结果,或者 S 的数据我看错了。
    • 以图为准:图 (d) 展示了 S 中那些在 R 里找不到“对象”的行,左边都被填上了 null。
(3) 全外连接 ( R ⊐ ⋈ ⊏ S R \sqsupset\kern-2pt\bowtie\kern-2pt\sqsubset S RS)**
  • 口诀大家都是老大,谁也别丢。
  • 逻辑:左外连接的结果 ∪ \cup 右外连接的结果。
  • 分析图 (e)
    • 既包含了 R 中没匹配上的(右边补 null),也包含了 S 中没匹配上的(左边补 null),当然还有匹配成功的。

四、数据库语言SQL

📝 这部分大家基本都熟悉了,什么查询语句什么的就不多说了,说几个容易犯错的点。

4.1 SQL 语言分类的考点

(1)DROP vs DELETE

  • DELETE (DML)
    • 删除表中的数据,表结构还在。
    • 可以回滚 (Rollback),有日志记录,速度慢。
    • 支持 WHERE 条件。
  • DROP (DDL)
    • 删除整个表(连同结构、数据、索引全部炸掉)。
    • 不可回滚,速度极快。
  • TRUNCATE (DDL - 扩展考点)
    • 清空表中数据,保留结构。
    • 速度快(不记行级日志),不可回滚,重置自增 ID。

(2)权限控制 (DCL) - GRANT/REVOKE

  • 考点:语法细节。
  • 语法公式
    GRANT <权限列表> ON <对象类型> <对象名> TO <用户> [WITH GRANT OPTION];
    
  • 陷阱
    • WITH GRANT OPTION:表示该用户拿到权限后,还可以把这个权限转手送给别人
    • 级联收回:如果 A 把权限给了 B,B 给了 C。当 A 收回 B 的权限时,C 的权限通常也会被级联收回

4.2 三级模式结构图的考点

在这里插入图片描述

这张图展示了 SQL 对象与三级模式的对应关系,核心考点只有两个

(1)视图 (View) = 外模式

  • 定义:视图是虚表,物理存储中没有数据,只存了 SQL 逻辑。
  • 考点
    • 逻辑独立性:修改基本表的结构(如改列名),可以通过修改视图定义来保持对外接口不变。
    • 视图更新限制:不是所有视图都能执行 INSERT/UPDATE/DELETE。如果视图包含了 GROUP BYDISTINCT 或聚合函数,通常不可更新

(2)基本表 = 模式 (概念模式)

  • 定义:实际存储数据的逻辑表。
  • 考点:一个基本表可以对应一个或多个存储文件(内模式)。

4.3 下午题(试题三)实战填空“坑点”

(1)DDL 中的约束

下午题第一小问通常是补充 CREATE TABLE 语句。

  • 主键PRIMARY KEY (列名)
  • 外键必考!
    FOREIGN KEY (本表列名) REFERENCES 主表名(主表主键)
    [ON DELETE CASCADE] -- 级联删除,常考填空
    
  • 检查约束CHECK (条件),例如 CHECK (age > 18 AND gender IN ('M','F'))
  • 默认值DEFAULT 'Unknown'

(2) GROUP BY 与 HAVING 的区别

  • 死穴:初学者习惯在 GROUP BY 后面写 WHERE
  • 铁律
    • WHERE:在分组过滤(不能用聚合函数,如 SUM, COUNT)。
    • HAVING:在分组过滤(专门用来过滤聚合函数的结果)。
  • 例题:查询平均成绩大于 60 分的学生 ID。
    • SELECT id FROM score WHERE AVG(grade) > 60 GROUP BY id (错!WHERE 里不能有 AVG)
    • SELECT id FROM score GROUP BY id HAVING AVG(grade) > 60

(3) 连接查询 (JOIN)

  • 填空技巧:如果题目说“列出所有部门及其员工信息(包括没有员工的部门)”,看到“所有”且在主语位置,立刻反应出 LEFT JOIN(或 RIGHT JOIN)。
  • 语法FROM TableA LEFT JOIN TableB ON TableA.id = TableB.aid

(4)子查询中的 EXISTS / IN

  • 考点:下午题常考“查询没有选修数学课的学生”。
  • 写法
    SELECT * FROM Student s WHERE NOT EXISTS (
        SELECT * FROM Course c WHERE c.stu_id = s.id AND c.name = 'Math'
    )
    

4.4 真题模拟

【场景】
有两个表:

  • Emp(eid, ename, did, salary) - 员工表
  • Dept(did, dname) - 部门表

【问题 1:DDL】
创建员工表时,要求薪水必须大于 0,且如果部门被删除了,该部门的员工自动删除。请补全 SQL:

CREATE TABLE Emp (
    eid INT PRIMARY KEY,
    salary INT,
    did INT,
    CHECK ( [salary > 0] ),   -- 空 1
    FOREIGN KEY (did) REFERENCES Dept(did) ON DELETE [Cascade] -- 空 2
);

【问题 2:DQL】
查询平均工资超过 5000 的部门名称。

SELECT dname 
FROM Emp e, Dept d 
WHERE e.did = d.did 
GROUP BY [d.did, d.dname]       -- 空 3
[HAVING] AVG(salary) > 5000;  -- 空 4

五、数据库管理系统

📝 说白了就是类似Navicat的软件。

5.1 什么是DBMS

📝 数据库管理系统(DBMS)是操作和管理数据库的软件,用于建立、使用和维护数据库。位于 用户/应用程序 和 操作系统之间。

5.2 DBMS的功能

  1. 数据定义: 提供DDL语言,建表啊什么的。
  2. 数据操纵: 提供DML语言,增删改查。
  3. 数据库的运行管理: 通过并发控制、安全性检查、存取控制、完整性检查等手段,保持数据的正确录入和完整。
  4. 数据的组织、存储和管理: 这是数据在硬盘上的相关存放。
  5. 数据库的建立和维护: 数据导入导出、数据库转储、恢复、性能重组等。
  6. 其它功能,如通信、数据转换等: 通信一般就是和Java等语言产生链接。

5.3 DBMS的特征

  1. 数据的结构化且统一管理
  2. 有较高的数据独立性
  3. 数据的控制功能:
    • 安全性
    • 完整性
    • 并发控制
    • 故障恢复

5.4 DBMS的分类

  • 关系数据库系统
  • 面相对象的数据库系统
  • 对象关系数据库系统

六、关系数据库的规范化(重点)

6.1. 函数依赖

📝 这是规范化的基石

  • 定义 X → Y X \to Y XY。意思是“只要我知道了 X X X 的值,我就能唯一确定 Y Y Y 的值”。

    • 例子学号 → \to 姓名。因为一个学号只对应一个学生。
  • 核心分类

    1. 完全函数依赖 ( X → F Y X \xrightarrow{F} Y XF Y)
      • Y Y Y 依赖于 X X X,且不依赖于 X X X 的任何真子集。
      • 场景:通常发生在组合主键上。比如 (学号, 课程号) -> 成绩。你必须同时知道学号和课程号,才能确定成绩。只知道学号不行,只知道课程号也不行。
    2. 部分函数依赖 ( X → P Y X \xrightarrow{P} Y XP Y)
      • Y Y Y 依赖于 X X X 的一部分(真子集)。
      • 场景(学号, 课程号) -> 姓名。其实只需要 学号 就能决定 姓名 了,课程号 是多余的。这就是部分依赖。这是 2NF 要消灭的敌人。
    3. 传递函数依赖 ( X → Y , Y → Z X \to Y, Y \to Z XY,YZ)
      • X X X 决定 Y Y Y Y Y Y 决定 Z Z Z(且 Y Y Y 不能决定 X X X)。
      • 场景学号 -> 系名系名 -> 系主任。于是 学号 -> 系主任这是 3NF 要消灭的敌人。
  • Armstrong 公理系统(计算候选键的工具)

    • 不需要背诵公理的定义,但要会用它们来推导
    • 核心用途:求属性闭包 ( X ) + (X)^+ (X)+
      • 比如:已知 A → B , B → C A \to B, B \to C AB,BC。求 A A A 的闭包?
      • ( A ) + = { A , B , C } (A)^+ = \{A, B, C\} (A)+={A,B,C}。因为 A 能推 B,B 能推 C。所以 A 能决定 A,B,C。
      • 如果一个属性集的闭包包含了所有属性,那它就是候选键。

6.2 规范化

📝 范式是衡量表结构“优劣”的标准。级别越高,冗余越小,但查询可能越慢(因为表被拆散了)。

口诀:1NF 存原子,2NF 没部分,3NF 没传递。

(1) 第一范式 (1NF)

  • 规则属性不可再分
  • 反例:有一列叫“联系方式”,里面存了“手机:138…, 微信:wx…”。这就不满足 1NF。
  • 正例:拆成“手机号”一列,“微信号”一列。
  • 现状:现代关系数据库只要能建表,默认就是 1NF。

(2) 第二范式 (2NF)

  • 规则:满足 1NF,且消除了非主属性对候选键的部分依赖
  • 判别技巧
    • 检查主键
    • 如果主键是单属性(只有一个字段),那自动符合 2NF
    • 如果主键是组合键(A, B),检查有没有非主属性 C 是仅由 A 决定的。如果有,就不是 2NF。
  • 解决:把部分依赖的列拆出去单独建表。

(3) 第三范式 (3NF)

  • 规则:满足 2NF,且消除了非主属性对候选键的传递依赖
  • 判别技巧
    • 检查非主属性之间有没有依赖关系。
    • 比如:主键A -> 普通列B -> 普通列C。这里 B 和 C 都是非主属性,它们之间居然有依赖,这就是 3NF 不允许的。
  • 解决:把 B -> C 拆出去单独建表。

6.3 模式分解

📝 把一个大表拆成几个小表,必须满足两个条件,否则拆了就回不去了。

(1) 无损连接

  • 含义:分解后的表 R 1 R1 R1 R 2 R2 R2,通过自然连接(Join)后,能完全还原成原来的表 R R R,没有多出垃圾数据,也没少数据。
  • 判定公式(必背)
    • 设分解为 R 1 R1 R1 R 2 R2 R2,公共属性为 K = R 1 ∩ R 2 K = R1 \cap R2 K=R1R2
    • 如果 K → R 1 K \to R1 KR1 或者 K → R 2 K \to R2 KR2 成立(即公共属性 K K K 是 R1 或 R2 的候选键/超键),则分解是无损的。
    • 口诀“交集必须是某一方的码”。

(2) 保持函数依赖

  • 含义:原表里的所有依赖关系(如 A → B A \to B AB),在分解后的某张小表里依然能直接找到,不需要跨表。

6.4 知识模块总结

No

Yes

No

Yes

No

Yes

No

Yes

拿到一个关系模式 R

所有属性都是原子值?

非规范化 Not 1NF

符合 1NF

主键是单属性 OR
不存在非主属性对主键的
部分依赖?

停留在 1NF

符合 2NF

不存在非主属性对主键的
传递依赖?

停留在 2NF

符合 3NF

所有的决定因素
都是候选键?

停留在 3NF

符合 BCNF

七、数据库的控制功能

7.1 事务

📝 事务是指作为单个工作逻辑单元的一系列操作,要么完全执行,要么完全不执行。

7.2 事务的性质(ACID)

  1. 原子性(Atomicity) 要么都做,要么都不做
  2. 一致性(Consistency) 事务完成时,必须保证所有数据都保持一致的状态
  3. 隔离性(Isolation) 事物之间相互隔离
  4. 持久性(Durability) 事务完成后,更新操作永久有效

7.3 并发带来的三大问题

在这里插入图片描述

(1)丢失修改

  • T1和T2同时修改,T2后提交,覆盖了T1的修改内容,T1的修改丢失。

(2)读脏数据

  • T1修改了A,但是还没有提交,结果此时T2读到了这个A,但是后面T1又回滚了这个操作,所以此时T2读到的A是个假的。

(3)不可重复读

  • T1一共读取了两次A,第一次读取的时候正确,但在第二次读取之前,T2修改了A,导致了两次读取不一致,破坏了隔离性。

7.4 封锁技术

(1)排它锁(X锁/写锁)

  • 如果事务A对某个数据加了X锁,自己可以读和写,但其他人不允许读也不能写。

(2)共享锁(S锁/读锁)

  • 如果事务A对某个数据加了S锁,自己只能读不能写,别人也可以加S锁来读,但是不能加X锁来写。

7.5 三级封锁协议

协议级别规则 (怎么加锁)解决的问题
一级封锁协议写前加 X 锁,事务结束才释放。解决 丢失修改
二级封锁协议一级基础上,读前加 S 锁,读完立刻释放。解决 读脏数据 (+丢失修改)
三级封锁协议一级基础上,读前加 S 锁,事务结束才释放。解决 不可重复读 (+丢修+读脏)

7.6 其它锁协议

(1)两段锁协议(2PL)

  • 含义: 事务分为两个阶段
    • 增长阶段: 只拿锁,不放锁
    • 缩减阶段: 只放锁,不拿锁

这是“可串行化调度”的充分调度,一般只要遵守2PL,并发结果就是正确的

(2)死锁

  • 含义: T1拿了A等B,T2拿了B等A,形成循环。
  • 解决:
    • 预防:一次性申请所有资源。
    • 解除:系统检测到死锁后,选择一个代价最小的事务强制回滚。

(3)可串行化

📝 遵循2PL协议的操作。

7.7 故障和恢复

(1)故障类型

  • 事务故障: 程序报错,死锁被杀
  • 系统故障: 断点、OS崩溃
  • 介质故障: 硬盘损坏等

(2)备份方法

  • 静态转储: 备份时关闭数据库的使用,业务停摆
  • 动态转储: 备份时允许读写(配合日志文件才能恢复)
  • 海量转储: 每次备全量
  • 增量转储: 只备份变化的部分

八、数据仓库和分布式数据库基础知识

在这里插入图片描述

8.1 数据仓库的概念

  • 传统数据库: 用来记账的(增删改查快,数据实时)
  • 数据仓库: 用来分析的(读多写少,数据量大)

8.2 四大特征

  1. 面向主题: 数据方向主要根据业务而定,而不是按照“应用程序”组织。
  2. 集成: 把不同来源的数据统一格式,清洗数据。
  3. 相对稳定: 只读不改,因为是用作分析,一般入库后不进行实时更新。
  4. 反映历史变化: 记录了过去多年的数据,带有时间戳,用于分析趋势。

8.3 关键流程:ETL

  • E(抽取): 从各种源头将数据抓取。
  • T(转换): 清洗数据、统一格式、计算衍生字段。
  • L(加载): 将完整的数据入库。

8.4 数据仓库的分类

  • 企业仓库
  • 数据集市
  • 虚拟仓库

8.5 分布式数据库

(1)核心概念

📝 物理上分散,逻辑上集中,数据分散在多台计算机上,但在用户来看就像在操作一台数据库一样。

(2)体系结构

📝 分布式数据库的数据是怎么组织的。

  1. 全局外模式 / 全局概念模式: 用户看到的最后一张大表。
  2. 分片模式: 切分的方式,比如数据是按照水平切分(比如北京数据放在北京,上海数据放在上海),或者按照列切分,也就是垂直切分(比如工资表放在哪个部门)
  3. 分布模式: 定位,也就是数据存放在哪台机器上。
  4. 局部模式 / 局部内模式: 每台机器上实际运行的数据库是什么,MySQL或者Oracle。

(3)三大透明性

透明性名称含义对应层级
分片透明性用户不需要知道数据是怎么切分的(水平还是垂直),只管查大表。最高级(对应分片模式)
位置透明性用户不需要知道数据存放在哪个物理节点上(北京还是上海)。中级(对应分布模式)
逻辑透明性 (或局部数据模型透明性)用户不需要知道局部数据库是用什么模型(MySQL还是SQL Server)。低级(对应局部模式)

8.6 分布式数据库的特点

  1. 高可扩展性
  2. 高并发性
  3. 高可用性
    在这里插入图片描述

九、真题练习

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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐