数据库软考中级 关系规范化①

0 阅读10分钟

主要考点

  1. 相关名词
  2. 关系数据库模式
  3. 关系的三种类型
  4. 关系的完整性约束

image.png

image.png


拿上面举例子

数据库核心概念:学生-课程详解

一、先明确图一的核心逻辑

图一是学生 - 选课 - 课程的 ER 实体联系模型

  • 矩形代表实体:「学生」和「课程」是两个核心实体
  • 菱形代表实体间的联系:「选课」是学生和课程之间的联系
  • 连线两端的*代表多对多关系:一个学生可以选多门课程,一门课程可以被多个学生选择

下面结合这个场景,逐个拆解图二的 10 个数据库核心概念,做到定义 + 场景实例一一对应,清晰易懂。


二、逐个概念结合场景讲解

1. 关系

定义:在关系数据库中,实体以及实体间的联系都是用关系来表示的,类似于程序设计语言中变量的概念。 场景讲解: 关系数据库里,你看到的每一张二维数据表,就是一个「关系」。 对应这个场景,我们需要 3 个关系(3 张表):

  • 学生实体 → 对应「学生表」这个关系,用来存所有学生的信息
  • 课程实体 → 对应「课程表」这个关系,用来存所有课程的信息
  • 选课联系 → 对应「选课表」这个关系,用来存学生选课程的关联数据
2. 关系模式

定义:是对关系的描述,类似于程序设计语言中类型定义的概念。 场景讲解: 关系是装数据的表,关系模式就是这张表的表结构定义,固定不变,描述了 “这张表叫什么、有哪些列”。 对应场景的 3 个关系模式:

  • 学生关系模式:学生(学号, 姓名, 性别, 年龄, 班级)
  • 课程关系模式:课程(课程号, 课程名, 学分, 任课老师)
  • 选课关系模式:选课(学号, 课程号, 成绩)
3. 关系模型

定义:是由若干个关系模式组成的集合。 场景讲解: 把上面 3 个描述学生选课业务的关系模式,整合在一起,就是一个完整的学生选课关系模型。 简单说,关系模型就是一整套业务里,所有表的结构定义的合集,完整描述了业务里所有实体、实体间联系的结构。

4. 属性

定义:用来描述某一个事物的特征。 场景讲解: 对应到表里,就是表的列(字段) ,用来描述实体 / 联系的特征。

  • 学生实体的属性:学号、姓名、性别、年龄、班级
  • 课程实体的属性:课程号、课程名、学分、任课老师
  • 选课联系的属性:成绩
5. 域

定义:每个属性的取值范围所对应一个值的集合。 场景讲解: 就是每个属性(列)的合法取值范围,超出这个范围的数据不能存入。

  • 「性别」属性的域:{男,女},只能在这两个值里选
  • 「年龄」属性的域:10~40的整数(符合大学生的合理范围)
  • 「成绩」属性的域:0~100的整数
  • 「学号」属性的域:10位数字组成的字符串(符合学校学号规则)
6. 候选码

定义:若关系中的某一属性或属性组的值能唯一标识一个元组(表中的一行记录),则称该属性或属性组为候选码。 场景讲解: 能唯一确定表里一行数据的字段 / 字段组合,一个关系可以有多个候选码。

  • 学生表:学号是候选码,每个学生的学号唯一,知道学号就能唯一确定一个学生;如果没有重名,「姓名」也可以是候选码。
  • 课程表:课程号是候选码,能唯一确定一门课程。
  • 选课表:单独的学号 / 课程号都无法唯一标识一行(一个学生选多门课、一门课被多个学生选,都会重复),因此学号 + 课程号这个属性组合,是候选码,能唯一确定一条选课记录。
7. 主码(主键)

定义:又称为主键,若一个关系有多个候选码,则选定其中一个为主码。 场景讲解: 从候选码里选一个,作为表的唯一标识,每张表必须有且只有一个主码,用来保证表里的每一行记录不重复。

  • 学生表:选学号作为主码
  • 课程表:选课程号作为主码
  • 选课表:候选码只有「学号 + 课程号」,因此这个属性组就是主码
8. 主属性

定义:包含在任何一个候选码中的各个属性称为主属性。 场景讲解: 只要这个字段出现在了任意一个候选码里,它就是主属性。

  • 学生表:学号在候选码里,学号是主属性
  • 课程表:课程号在候选码里,课程号是主属性
  • 选课表:学号、课程号都在候选码里,学号、课程号都是主属性
9. 非主属性

定义:不包含在任何候选码中的属性称为非主属性。 场景讲解: 除了主属性,剩下的所有字段都是非主属性。

  • 学生表:姓名、性别、年龄、班级,都不在候选码里,都是非主属性
  • 课程表:课程名、学分、任课老师,都不在候选码里,都是非主属性
  • 选课表:成绩,不在候选码里,是非主属性
10. 外码(外键)

定义:如果关系模式 R 中的属性或属性组非该关系的码,但它是其他关系的码,那么该属性集对关系模式 R 而言是外码。 场景讲解: 外码是用来关联多张表的核心,对应这个场景,最典型的就是选课表:

  • 选课表里的学号:不是选课表的主码,但它是学生表的主码,因此「学号」对选课表来说,就是外码
  • 选课表里的课程号:不是选课表的主码,但它是课程表的主码,因此「课程号」对选课表来说,也是外码

通过这两个外码,就把学生表、选课表、课程表关联起来,完美实现了图一中「学生 - 选课 - 课程」的多对多业务逻辑。


相关名称

image.png

学生数据库核心术语解析与衔接

我们继续沿用之前的学生选课业务场景,结合图中的Student学生表实例,逐个拆解这 6 个数据库核心名词,做到定义 + 实例一一对应,和之前的知识点连贯衔接。


11. 全码

定义:关系模型的所有属性组是这个关系模式的候选码,称为全码。 通俗讲解 + 实例: 全码是候选码的特殊情况 —— 当一张内外,单独任何一个属性、甚至任意几个属性组合,都不能唯一标识一行数据,必须把表里所有属性合在一起,才能唯一确定一条记录时,这个由全部属性组成的候选码,就叫全码。

举个贴合场景的例子: 比如我们新增一张「学生 - 竞赛 - 获奖」表,关系模式为:竞赛获奖(学号, 竞赛名称, 获奖等级)

  • 一个学生可以参加多个竞赛,单独「学号」不能唯一确定一行;
  • 一个竞赛有多个学生获奖,单独「竞赛名称」不能唯一确定一行;
  • 同一个竞赛同一个获奖等级有多个学生,单独「获奖等级」也不能唯一确定一行;
  • 甚至「学号 + 竞赛名称」也不行(一个学生可以在同一个竞赛里拿多个奖项);
  • 只有学号 + 竞赛名称 + 获奖等级三个属性全部合在一起,才能唯一确定一条获奖记录。 此时这个关系的候选码包含了全部属性,它就是全码

补充:图中的学生表不是全码,因为单独「学号」就能作为候选码,不需要所有属性组合。


12. 元组 / 记录:行

定义:关系(二维表)中的每一行完整数据,就是一个元组,也叫一条记录,对应现实世界里一个具体的实体实例、一条具体的业务数据。 结合图中实例讲解

  • 图里第一行100101 张军生 通信 男,就是 1 个元组(1 条记录),对应「学号 100101 的张军生」这个具体的学生实体;
  • 图里标注的元组 1~ 元组 6,就是这张学生表里的 6 条完整记录,也就是 6 个元组。

和之前知识点的衔接:我们之前说「候选码能唯一标识一个元组」,意思就是通过主码(比如学号 100101),就能精准定位到表里对应的这一行元组。


13. 字段、数据项

定义:就是关系(二维表)中的每一列,和我们之前讲的「属性」是完全等价的概念 —— 只是数据库理论里叫「属性」,实际开发、数据库操作中,更常用「字段 / 数据项」这个叫法。 结合图中实例讲解

  • 图里的Sno(学号)Sname(姓名)SD(院系)Sex(性别),这 4 列,每一列都是一个字段 / 数据项,对应一个属性;
  • 每个单元格里的具体值(比如 Sno 列的 100101),就是这个字段的一个数据项值。

14. 元数:属性的个数(列数)

定义:一个关系(二维表)里,包含的属性(列 / 字段)的总数量,就叫这个关系的元数,也叫 “度”。 结合图中实例讲解

  • 这张学生表有 Sno、Sname、SD、Sex 一共 4 个属性(4 列),所以这个关系的元数是 4
  • 再举之前的例子:选课表 (学号,课程号,成绩) 有 3 个属性,它的元数就是 3。

补充:元数是由表结构决定的,表结构不修改(不加列 / 减列),元数就不会变化。


15. 基数:记录的个数(行数)

定义:一个关系(二维表)里,包含的元组(行 / 记录)的总数量,就叫这个关系的基数,用来描述表里一共有多少条业务数据。 结合图中实例讲解

  • 这张学生表里一共有 6 行数据(元组 1~ 元组 6),所以这个关系的基数是 6
  • 基数会随着数据操作动态变化:比如新增 1 个学生,基数就变成 7;删除 1 个学生,基数就变成 5。

16. n 元关系:元数为几,就是几元关系

定义:这个概念和元数直接绑定,一个关系的元数是 n,我们就称它为n 元关系结合实例讲解

  • 图里的学生表元数是 4,所以它是一个4 元关系
  • 之前的选课表 (学号,课程号,成绩) 元数是 3,就是 3 元关系;
  • 哪怕是只有 1 列学号的表,元数是 1,也叫 1 元关系。

图中内容对应关系总结(一眼看懂)

图中表的组成对应关系模式术语对应通用开发术语
每一列(Sno/Sname 等)属性字段、数据项
整个表的结构Student(Sno,Sname,SD,Sex)关系模式记录类型、表结构
每一行数据元组记录
列的总数量(4 列)元数字段数
行的总数量(6 行)基数记录数
元数为 44 元关系4 列表