深入解析学生-课程-选课关系模式完整定义
我们继续沿用之前的学生 - 课程 - 选课场景,结合之前讲过的属性、域、主码、外码等知识点,把这张图的关系模式完整定义、简写规则、实例拆解三部分,逐句讲透,做到定义 + 通俗解释 + 场景实例一一对应。
一、先明确核心概念:什么是关系模式?
关系模式,就是关系数据库中,一张数据表的「完整结构定义」。 我们之前说 “关系模式是表结构”,这张图就是把表结构的所有组成要素,用标准化的数学公式完整表达了出来,分为「完整定义」和「日常简写」两种形式。
二、关系模式的完整定义:R(U, D, dom, F)
这个公式里的 5 个符号,就是关系模式的 5 个核心组成要素,我们逐个拆解,每个都配通俗解释 + 学生表实例:
| 符号 | 官方定义 | 通俗解释 | 学生表场景实例 |
|---|---|---|---|
| R | 关系名 | 就是表名,用来给这张表起唯一的名字,区分不同的关系(表) | 学生表的 R=S(Student 缩写)、课程表的 R=C(Course 缩写)、选课表的 R=SC(StudentCourse 缩写) |
| U | 组成该关系的属性名集合 | 就是这张表里所有字段(属性)的合集,也就是表有哪些列 | 学生表 S 的 U = {Sno (学号), Sname (姓名), SD (系名), SA (年龄)},也就是这张表的 4 个列,全部放在 U 这个集合里 |
| D | 属性的域 | 就是 U 里所有属性,对应的合法取值范围(域)的总集合 | 学生表 S 的 D 包含: 1. Sno 的域:10 位数字字符串 2. Sname 的域:长度≤10 的合法姓名字符串 3. SD 的域:学校所有院系名称集合 {计算机,通信,电子工程...} 4. SA 的域:10~40 的整数 |
| dom | 属性向域的映像集合 | 就是给每个属性,绑定它对应的域的映射规则,告诉数据库:这个字段,只能用这个域里的值,不能超出范围 | 学生表 S 的 dom: dom (Sno)=10 位数字字符串 dom (Sname)= 长度≤10 的姓名字符串 dom (SD)= 学校院系名称集合 dom (SA)=10~40 的整数 (图中例子Dom(PCno)=Cno就是典型用法:先修课程号 PCno 的域,和课程号 Cno 的域完全一致) |
| F | 属性间数据的依赖关系集合 | 就是表里属性和属性之间的约束规则,最核心的是「函数依赖」:比如知道了学号,就能唯一确定对应的姓名、系名,这就是学号决定姓名,这个规则就放在 F 里。 它是数据库表结构设计、范式规范的核心 | 学生表 S 的 F: { Sno→Sname, Sno→SD, Sno→SA } 翻译:学号决定姓名、学号决定系名、学号决定年龄,约束同一个学号不能对应两个不同的姓名 |
三、关系模式的简写形式
日常学习、开发中,D(域)和dom(映射)通常是行业默认约定好的(比如学号默认是数字字符串、姓名默认是字符串,不用每次都重复写),F(依赖关系)在基础场景中也会先简化,因此就有了两种通用简写:
1. 最常用简写:R(U)
只保留关系名 R和属性集合 U,省略 D、dom、F,是我们写表结构时最常用的形式。 比如学生表的简写就是:S(Sno, Sname, SD, SA),和图中的例子完全一致。
2. 全属性展开简写:R(A₁, A₂, A₃, ..., Aₙ)
把 U 里的每个属性,按顺序挨个列出来,A₁到Aₙ就是第 1 到第 n 个属性,n就是我们之前讲的「元数」,n 是几,就是几元关系。 比如学生表S(Sno, Sname, SD, SA),这里A₁=Sno, A₂=Sname, A₃=SD, A₄=SA,n=4,也就是 4 元关系,和之前的知识点完全衔接。
四、图中 3 个实例的完整拆解
我们把图里的 3 个关系模式,对应上面的定义,完整拆解清楚,同时标注主码、外码,和之前的 ER 图、知识点完全对应:
1. 学生关系模式:S(Sno, Sname, SD, SA)
- R=S(表名:学生表)
- U={Sno, Sname, SD, SA}(属性:学号、姓名、系名、年龄)
- 主码:
Sno(学号)(能唯一标识一个学生) - 核心依赖 F:
Sno→Sname, Sno→SD, Sno→SA - 说明:这是最基础的实体关系模式,对应 ER 图里的「学生」实体。
2. 课程关系模式:C(Cno, Cname, PCno), Dom(PCno)=Cno
- R=C(表名:课程表)
- U={Cno, Cname, PCno}(属性:课程号、课程名、先修课程号)
- 主码:
Cno(课程号)(能唯一标识一门课程) - 核心依赖 F:
Cno→Cname, Cno→PCno - 关键说明
Dom(PCno)=Cno: 先修课程本身也是一门课程,因此「先修课程号 PCno」的合法取值范围,和「课程号 Cno」的范围完全一致,这里直接给 PCno 绑定了 Cno 的域,就是我们上面讲的dom属性 - 域映射的典型用法。
3. 学生选课关系模式:SC(Sno, Cno, Grade)
- R=SC(表名:选课表)
- U={Sno, Cno, Grade}(属性:学号、课程号、成绩)
- 主码:
Sno+Cno(学号 + 课程号的联合主键,能唯一标识一条选课记录) - 外码:
Sno是学生表 S 的主码,Cno是课程表 C 的主码,通过这两个外码,把学生、课程、选课三张表关联起来,完美对应最开始的 ER 图。 - 核心依赖 F:
(Sno,Cno)→Grade(学号 + 课程号,能唯一确定这门课的成绩)
补充:关键区分「关系模式」和「关系」
很多人容易混淆这两个概念,这里一句话讲清:
- 关系模式:是表的「结构定义」,是静态的、稳定的,只要不修改表结构,它就不会变(比如
S(Sno, Sname, SD, SA)这个结构,用几年都可能不变)。 - 关系:是表里面的「具体数据(元组的集合)」,是动态的、变化的,新增 / 删除学生,数据就会变。
简单记:关系模式是表头,关系是表里的所有数据行。
深入解析学生-课程-选课关系类型
我们继续沿用学生 - 课程 - 选课的业务场景,结合之前讲的关系、关系模式等知识点,把关系的三种类型讲透,核心区分三者的数据存储方式、生命周期、实际用途,每个类型都配通俗类比 + 场景实例 + 核心特点。
先总述
关系数据库里,我们常说的 “表”,按数据存储和用途,分为这 3 种类型。三者的核心区别是:是否在数据库中实际持久化存储数据、数据的来源是什么、生命周期有多长。
(1)基本关系(基本表 / 基表)
官方定义:它是实际存在的表,是实际存储数据的逻辑表示。
通俗类比
基本表就是数据库里的 **“数据仓库”**,是所有数据的源头,就像你 Excel 里真正存了所有原始数据的那张 Sheet,实实在在地把数据保存在数据库的磁盘里。
场景实例
我们之前一直用的 3 张核心表,都是最典型的基本表:
- 学生基本表:
S(Sno, Sname, SD, SA) - 课程基本表:
C(Cno, Cname, PCno) - 选课基本表:
SC(Sno, Cno, Grade)
我们给学生表新增学生、给选课表录入成绩、删除过期的课程,所有的增删改操作,都是直接操作基本表,数据会实实在在地写入数据库。
核心特点
- 持久化存储:表结构和表内的数据,都会实实在在地保存在数据库中,只要不主动删除,就会一直存在。
- 数据源头:它是数据库里所有数据的基础,查询表、视图表的数据,都来自于基本表。
- 完整的结构定义:有固定的关系模式(表结构),有主码、外码、域约束等完整的规则,支持增删改查全量操作。
(2)查询表
官方定义:查询结果对应的表。
通俗类比
查询表就是你查数据时,临时打印的一次性结果清单。你查完数据,清单看完就销毁了,不会永久保存,也不会把数据再存一份到数据库里。
场景实例
我们执行一条 SQL 查询语句,数据库返回的结果集,就是查询表。比如:
-- 查询计算机系所有学生的学号和姓名
SELECT Sno, Sname FROM S WHERE SD='计算机';
这条语句执行后,返回的符合条件的学生数据,就是一张查询表。
核心特点
- 临时生成:只有执行查询语句的时候才会生成,查询执行结束,这张表就自动销毁了,不会持久化保存。
- 不独立存储数据:它的数据完全来自基本表,数据库不会给它单独分配存储空间,只是把查询结果临时展示出来。
- 只读属性:它只是查询结果的快照,一般不能直接对它做增删改操作,修改数据只能回到源头的基本表。
(3)视图表(视图)
官方定义:它是一种虚拟表,是由基本表或其他视图表导出的表。它本身是不独立存储在数据库的,数据库只存放它的定义。
通俗类比
视图就是一个 **“定制化的窗口 / 监控屏”**。你只给数据库定了一个 “窗口规则”(比如只允许看计算机系学生的学号和姓名,不能看年龄),窗口本身不存任何数据,数据还是在基本表这个 “仓库” 里。每次你打开这个窗口,数据库都会按你定的规则,从仓库里把对应的数据拿出来给你看。
场景实例
我们给数据库创建一个 “计算机系学生视图”,语句如下:
-- 创建视图:只展示计算机系学生的学号、姓名
CREATE VIEW V_CS_Student AS
SELECT Sno, Sname FROM S WHERE SD='计算机';
执行这条语句后,数据库里只会保存这个视图的定义语句,不会把计算机系的学生数据再复制一份存起来。 之后你每次执行SELECT * FROM V_CS_Student;,数据库都会自动执行视图里的查询规则,从基本表 S 里取出对应的数据返回给你。
核心特点
-
虚拟表,不存数据:数据库里只存视图的定义(查询规则),不存视图里的实际数据,数据始终存在基本表中。
-
持久化的定义:和查询表的临时属性不同,视图一旦创建,它的定义就会永久保存在数据库里,除非你主动删除。
-
简化操作 + 权限控制:
- 简化复杂查询:如果有一个多表联查的复杂语句,你可以把它做成视图,之后直接查视图就行,不用每次都写复杂 SQL;
- 权限隔离:比如你不想让普通用户看到学生的年龄、考试成绩,就可以只给他们开放视图的权限,不让他们接触原始基本表,保障数据安全。
-
有限制的写操作:符合规则的视图,也可以执行增删改操作,最终修改会落到对应的基本表上(比如给上面的视图新增一条学生数据,会直接写入学生基本表 S)。
三种关系类型核心区别对比表
| 类型 | 是否实际存储数据 | 生命周期 | 数据来源 | 核心用途 |
|---|---|---|---|---|
| 基本关系(基本表) | 是,表结构 + 数据都持久化存储 | 永久,创建后一直存在,除非主动删除 | 直接录入 / 写入的原始数据 | 数据库的核心,存储所有业务原始数据 |
| 查询表 | 否,仅临时缓存结果 | 临时,查询执行时生成,结束后销毁 | 从基本表中查询得到的结果集 | 一次性查看、统计查询结果 |
| 视图表 | 否,仅存储视图的定义规则 | 永久,定义创建后一直存在,除非主动删除 | 从基本表 / 其他视图按规则导出 | 简化复杂查询、数据权限控制、数据安全隔离 |