news 2026/10/22 12:18:32

数据库系统概论答案:关系模型、SQL与范式设计核心解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库系统概论答案:关系模型、SQL与范式设计核心解析

简介:数据库系统概论(第5版,王珊版)教材配套课后习题参考答案,主要面向正在学习数据库原理、需要核对课后练习的本科生与自学者。内容围绕关系模型、关系数据语言、关系完整性、关系代数基本运算以及SQL语言等核心章节展开,包含第二章、第三章常见习题的完整作答与SQL建表/查询示例,可直接对照教材查漏补缺,也可作为期末复习与考研基础梳理的参考资料。包体为1个doc文件,体积约588KB,以Word文档形式整理答案,便于按章节阅读、检索和二次编辑。资源已有1723人学习下载,适合需要快速获得标准答题思路、加深对关系数据库理论理解的读者。

1. 到底什么是“数据库系统概论答案”:一张帮你通关数据库理论的地图

很多人学数据库,第一反应是背概念、抄代码,结果拿到“数据库系统概论答案”这份材料时反而懵了:里面全是关系模型、关系代数、范式、视图、授权语句……看起来像天书,其实它就是把一本教材里最容易考、最容易混淆的知识点,从头到尾整理了一遍。通俗地说,这份答案就像一张通关地图——数据库理论这座山有很多条路,有人从 SQL 语法上山,有人从范式设计上山,而它把你需要知道的重点、习题、典型查询统统标注出来。搞懂它,不是让你背答案,而是让你在考试、面试或者做课程设计时,知道自己站在哪里、下一步该往哪走。本文就带你从头梳理这些概念,让你看完不再懵。

2. 关系模型:为什么数据库爱用一张张“表”说话

2.1 关系模型三件套:结构、操作、约束

关系模型是关系数据库的理论地基。你不需要把它想得多高深——它就是一句话:用二维表格来组织数据,用一套规则来保证数据不乱套。具体拆开来,就是三个组成部分:关系数据结构、关系操作集合、关系完整性约束。

打个比方:一本通讯录,每一页是一张表(关系),每行是一个联系人(元组),每列是一种属性(姓名、电话)。关系数据结构规定了“数据长什么样”;关系操作集合规定了“你能对数据做什么”,比如筛选、排序、合并;关系完整性约束规定了“哪些数据是不允许出现的”,比如不能有两个完全相同的联系人、不能填一个不存在的号码。

你可能要问:这有什么特别的?因为在这之前,数据库用层次模型、网状模型,数据像是树杈或者蜘蛛网,查一条数据要顺着指针一层层爬。关系模型把一切都摊平成表,用户只关心“表里有什么”,不关心数据在磁盘上怎么存。这个转变,让数据库从“面向程序员”变成了“面向所有人”。

2.2 为什么叫“关系”?行、列、码都是什么

“关系”这个词听起来玄乎,其实它就是数学里的“集合”思想:一张表就是一个关系,行是元组,列是属性。比如学生表:

学号姓名系名
01A同学计算机
02B同学数学

这张表就是一个关系,学号、姓名、系名是它的属性。关系还有一个硬脾气:不允许有完全相同的两行,因为集合里不允许有重复元素。这就是主码(也叫主键)概念的由来——用一个或几个属性唯一标识一行,就像身份证号之于人。

这里有个初学者最容易忽略的点:关系中属性的顺序不重要,行的顺序也不重要。意思是,你把“姓名”列和“学号”列换个位置,表还是同一个表,因为它是集合不是数组。这一点和 Excel 不太一样,Excel 里列顺序变了会影响公式引用,但关系模型里无所谓。

2.3 完整性规则:给数据上的两道“保险锁”

光有表还不够,还得防止“脏数据”混进来。关系模型的完整性规则主要管两件事:

第一,实体完整性,规则很简单:主码不能为空。为什么?因为主码就是标识一行的唯一凭证,如果学号是空的,你根本不知道这一行说的是谁,更谈不上引用它。

第二,参照完整性,规则也很直白:外码的值,要么为空,要么等于被引用表里某个主码的值。什么叫外码?比如选课表里有“学号”这个字段,它引用学生表的学号,那选课表里的学号就是外码。

为什么外码可以为空?看这个例子:员工表(员工号,姓名,部门号),部门表(部门号,部门名)。如果某个新员工刚入职还没分配部门,他的部门号就可以是空,因为“还没确定归属”是合法状态。但如果这个员工已经明确分到了研发部,那他的部门号必须能在部门表里找到,绝不能填一个不存在的“部门 99”——否则一查部门名就查无此部门,数据就“断裂”了。

用一句话记住:实体完整性管“我是谁”,参照完整性管“我引用的人必须真实存在”。这两条,是后面讲范式、讲数据库设计错误时反复用到的基础。

3. 关系代数与 SQL:同一套思想的两种打开方式

3.1 关系代数:用数学符号写“查数据”

关系代数是关系数据库最原始的查询语言,它不依赖任何具体软件,纯粹用运算符表达查询意图。五种基本运算是:并、差、笛卡尔积、投影、选择。记住一个口诀:运算的对象是表,结果还是表。

  • 选择(σ):按条件“筛行”。比如查出工程 J1 的供应记录:
σ Jno='J1' (SPJ)
  • 投影(π):按条件“选列”。比如只保留供应商号、零件号两列:
π Sno, Pno (SPJ)
  • 并(∪):把两张结构相同的表上下拼接。
  • 差(−):找出“在 A 里但不在 B 里”的行。
  • 笛卡尔积(×):把两张表的每一行两两组合,生成一张超大的临时表。

你可能觉得这些符号没必要——能用 SQL 直接查,为什么还要学代数?因为关系代数是 SQL 的“原理底层”。你写的每个 SELECT 语句,数据库优化器都会先把它翻译成关系代数表达式,再决定先做选择还是先做连接。理解了关系代数,你就理解了为什么“先筛选再连接”往往比“先连接再筛选”快得多。

3.2 除运算:一个让很多人翻车的操作

五种基本运算之外的三种(交、连接、除)都能用基本运算表达,其中“除”是新手最容易懵的。它的含义是:找出“满足所有条件”的那些值。原题里有这样一句:求至少用了供应商 S1 所供应的全部零件的工程号 JNO。

拆开看就明白了:S1 供应的零件是集合 A(比如 P1、P2),某个工程用的零件是集合 B,如果 B 包含 A,那这个工程就是我们要找的。关系代数的写法是:

π Jno, Pno (SPJ) ÷ π Pno (σ Sno='S1' (SPJ))

这个除运算,翻译成 SQL 通常会写成 NOT EXISTS 嵌套查询,两步走:先找出 S1 供应了哪些零件,再找出那些“对于 S1 的每一种零件,我都有对应记录”的工程。你可以把它理解为“包含关系判断”——就像面试官要求你“掌握 Java 和 Python”,你两门都会才算达标。

3.3 SQL:把数学符号翻译成人话

SQL 是关系数据库的通用语言,它的特点是高度非过程化:你只需要说“我要什么”,不用管“怎么拿”。对比一下就清楚了:

操作关系代数写法SQL 写法
筛行σ 条件(表)SELECT * FROM 表 WHERE 条件
选列π 列名(表)SELECT 列名 FROM 表
连接R ⋈ SSELECT * FROM R, S WHERE R.A=S.A
并R ∪ SSELECT ... FROM R UNION SELECT ... FROM S

用 SQL 建一张学生表,语法是这样的:

CREATE TABLE S ( Sno CHAR(4) UNIQUE, -- 学号,唯一,对应实体完整性 Sname CHAR(8), -- 姓名 City CHAR(4) -- 所在城市 );

这里UNIQUE表示学号不能重复,它就是“主码不能为空、不能重复”的落地版。SQL 的特点可以总结成五句:综合统一(DDL、DML、DCL 全包了)、高度非过程化(不问怎么做)、面向集合(一次操作一批行)、两种使用方式(命令行独立用,也能嵌入程序用)、语法简捷(核心关键字就那么几个)。所以很多学校教数据库,都是先用关系代数讲原理,再上 SQL 练实操,两者互为表里。

3.4 等值连接与自然连接:差在哪

这两个概念也常被拿来考。等值连接:只要两个表的指定属性值相等就拼接,不管有没有重复列。自然连接:是等值连接的“洁癖版”,要求比较的属性必须是同名同义的属性组,拼完还把重复列删掉。

举个直观例子。表 R 有(学号,姓名),表 S 有(学号,成绩)。等值连接R.A=S.A的结果会出现两列“学号”(一个来自 R,一个来自 S);自然连接自动用“学号”做匹配,结果里只保留一列学号。你可以把自然连接理解为“等值连接 + 去重列”。实际操作中,自然连接不一定总能用,因为两张表可能字段不同名,所以才需要等值连接兜底。

4. 完整性、安全性和范式:数据库的三层“防御铠甲”

4.1 数据库安全:防“坏人”与“坏事”

数据集中存放,意味着一旦出问题就是大问题。数据库安全性指的是“防止不合法使用导致的数据泄露、篡改或破坏”,常用的手段有五类:

  • 用户标识与鉴别:你是谁?账号密码先验明正身。
  • 存取控制:你有权做什么?通过授权表限制操作范围。
  • 视图机制:给你看“局部窗口”,不该看的列和行直接隐藏。
  • 审计:所有操作记日志,出事后能追溯是谁在什么时候干了什么。
  • 数据加密:就算数据被偷走,没有密钥也读不懂。

前两种最常用。自主存取控制(DAC)让用户对自己拥有的数据有“自主”授权能力,典型语句是 GRANT 和 REVOKE。比如:

GRANT SELECT, INSERT ON Student TO 用户A WITH GRANT OPTION;

这行的意思是:让用户A能查、能插学生表,而且允许他把这个权限再转授给别人。WITH GRANT OPTION就是“可以继续往下授权”的开关,一旦收回权限时用了CASCADE,他转授出去的权限也会一并收回。强制存取控制(MAC)则更严格:每个数据对象标上密级(绝密、机密、可信、公开),每个用户有许可证级别,级别不够就读不了高密级数据,这种机制多用于对安全要求极高的场景。

4.2 数据库完整性:防“语义错误的数据”

安全性防的是“坏人”,完整性防的是“错数据”。完整性约束分为六类:静态列级(比如年龄必须在 0 到 120 之间)、静态元组(比如“发货日期不能晚于收货日期”)、静态关系(比如外码必须匹配主码)、动态列级(比如工资只能涨不能降)、动态元组、动态关系。

建表时怎么定义这些约束?用 SQL 的CHECK和FOREIGN KEY:

CREATE TABLE EMP ( Empno INT PRIMARY KEY, -- 实体完整性:主码非空且唯一 Age INT CHECK (Age <= 60), -- 用户自定义完整性:年龄上限 60 Deptno INT, FOREIGN KEY (Deptno) REFERENCES DEPT(Deptno) -- 参照完整性 );

注意一个关键区别:违反实体完整性、用户定义完整性时,系统通常直接拒绝执行;但违反参照完整性时,系统会根据业务语义决定是拒绝、级联删除还是把外码置空。比如删除一个部门时,如果该部门还有员工,是连员工一起删(级联),还是拒绝删除?这要由设计者根据应用场景定,不是数据库自己拍脑袋。

4.3 范式:给表做“体检”,治数据冗余

范式(NF)是判断表设计得好不好的标准,从低到高是 1NF、2NF、3NF、BCNF、4NF。关系模型理论的六大术语——函数依赖、部分函数依赖、传递依赖、候选码、主码、外码——都是为范式服务的。

用大白话说:

  • 1NF:每个格子只能放一个值,不能塞一个列表。比如“兴趣爱好”列不能写“篮球,足球,唱歌”,得拆成多行。
  • 2NF:在 1NF 基础上,非主属性必须完全依赖于主码。比如选课表(学号,课程号,成绩,课程名),课程名只依赖课程号,不依赖整个学号+课程号,这叫部分依赖,得把课程信息拆到单独的表。
  • 3NF:在 2NF 基础上,非主属性不能传递依赖于主码。比如学生表(学号,系名,系办公室),系办公室由系名决定,而系名又由学号决定,这就是传递依赖,会导致改系名时要改多行,容易出错。

范式等级越高,冗余越少,更新异常越少,但查询时经常要连接多张表,性能可能下降。所以现实项目里,不一定非要追求最高范式,有时候“冗余一点、查询快一点”是更实际的选择——这就是后文会说到的“什么时候别用”。

数据库设计六大阶段(需求分析、概念结构设计、逻辑结构设计、物理设计、实施、运行维护)里,范式主要属于逻辑结构设计这一步:把 E-R 图转换成关系模式后,再用范式检查一遍,有问题就分解表。E-R 图是概念设计的核心产物,它用矩形表示实体、椭圆表示属性、菱形表示联系,先把现实世界画成图,再翻译成表,这个“先画图再建表”的流程,能省掉很多后面改表的痛苦。

5. 易混概念与常见误区:主码外码、连接除法、视图基本表,一次分清

5.1 主码、候选码、外码、全码

易混点:候选码和主码到底什么关系?全码又是什么?

候选码:能唯一标识一行的一组属性,候选码可能有好几个。比如教职工表里,工号和身份证号都能唯一标识一个人,它们都是候选码。主码:从候选码里挑一个“正式上岗”的,就叫主码,其余的叫备用码。外码:指向别的表主码的属性,用来建立表间联系。全码:最极端的情况——所有属性合在一起才能唯一标识一行,比如选课表(学号,课程号)里,只有两者合起来才唯一,这种情况下整个属性组就是码。

为什么混?因为教材里“码”“键”“关键字”叫法太多,中英文对应混乱。怎么区分?一句话:候选码是“候选”,主码是“当选”,外码是“引用别人的主码”。判断时先找“能唯一标识行”的属性组,再去掉多余属性,剩下最小集合就是候选码。

5.2 等值连接 vs 自然连接:到底删没删重复列

易混点:有人说“自然连接就是等值连接”,对不对?对一半。自然连接是特殊的等值连接,但它有两个附加条件:一是比较的属性必须是相同属性组(同名同义),二是结果中要去掉重复的属性列。等值连接不做这两件事。如果两张表根本没有同名列,自然连接就无法进行,只能用等值连接或者更普通的条件连接。做题时看两点:有没有指定连接条件,结果里有没有重复列。指定了且去重了,就是自然连接。

5.3 视图 vs 基本表:视图是“虚拟的窗户”

易混点:视图也能查数据,能对视图做操作,所以很多人以为视图是“复制了一份表”。错。视图在数据库里只存“定义”,不存数据。你可以把它理解为给某张表装了一个“带过滤功能的窗户”——窗外能看到哪些行和列,由视图的定义决定,但数据本体还是存在基本表里。

为什么需要视图?最典型的场景是安全:给普通员工定义一个视图,只包含姓名、部门、工资等级,不包含工资明细,这样他查得了部门数据,却看不到每个人挣多少钱。另一个场景是简化操作:把多表连接查询存成视图,以后直接SELECT * FROM 某视图,不用每次都写复杂的 JOIN。

哪些视图能更新?行列子集视图(就是直接从一张表筛选行列得到的视图)一般可以更新。哪些不能?视图属性来自聚合函数、表达式、分组统计的,都不能更新。比如“各部门平均工资”这个视图,你没法把它“更新”回基本表——因为你改了一个平均值,数据库不知道要改哪一行。所以记住一句:能更新的视图,底层必须能唯一对应回基本表的某一行。

5.4 安全性 vs 完整性:一个是防贼,一个是防错

易混点:这两者经常被放在一起考,但方向完全不一样。安全性防范的是非法用户和非法操作,比如黑客入侵、越权访问;完整性防范的是不合语义的数据,比如年龄写成 200 岁、外码找不到对应主码。打个比方:安全性是小区门口的保安,验证你是谁、让不让你进;完整性是楼里的物业规则,保证每户人家登记的信息不矛盾、不荒谬。安全性靠权限控制、审计、加密实现,完整性靠约束条件、违约处理实现。

5.5 关系代数五种基本运算 vs 三种派生运算

易混点:连接、交、除是不是基本运算?不是。它们是派生运算,可以用五种基本运算(并、差、笛卡尔积、投影、选择)表达出来。为什么教材非要分清楚?因为理解“最小集”能帮你抓住本质:任何查询最终都能拆成这五种操作。比如交运算可以表示为R ∩ S = R − (R − S),连接运算可以表示为笛卡尔积 + 选择,除运算的表达式就复杂一点,但同样能拆。做题时如果被问“如何用基本运算表示连接”,就答“先做笛卡尔积,再按条件做选择”,别把连接当成独立的原子操作。

6. 什么时候用得上这份答案:看清它的边界再动手

这份答案最适合用的场景,大概有这么几类。第一类是备考:教材里的课后题,尤其是关系代数表达式的书写、SQL 语句的编写、范式的判断与分解,属于“有标准答案”的题型,对着答案解析能快速定位自己错在哪一步——是投影漏了列,还是连接条件写反了,这些细节光看概念是发现不了的。第二类是课程设计起步期:刚拿到一个“学生选课系统”或“订单管理系统”的题目,不知道从哪下手时,翻翻其中数据库设计的章节,看人家怎么从 E-R 图一步步转换成关系模式,再照着定义主码、外码和约束,比自己瞎建表靠谱得多。第三类是面试前的快速回顾:被问到“视图和基本表的区别”“事务的 ACID”这类基础题时,这份材料能帮你把零散的知识点迅速串回主线。

但有几类情况,它帮不上忙。一是性能调优:这里讲的是理论模型和标准语法,不会告诉你某个索引为什么慢、某条 SQL 为什么全表扫描,这类问题需要去查执行计划、看实际数据量。二是某个具体数据库产品的“方言”写法:比如分页查询在 MySQL 里是LIMIT,在 SQL Server 里是OFFSET FETCH,在 Oracle 里是ROWNUM,答案给的是标准 SQL,具体产品之间仍有差异。三是最新特性:像 JSON 字段类型、窗口函数、图数据库功能,在经典理论教材里基本不会涉及。换句话说,它解决的是“这块知识的骨架是什么”,而不是“这个 bug 怎么修”。

以我自己为例,上学时做数据库课设,第一步就急着建表,结果表建完才发现学生表和班级表之间忘了加外键,选课表里学号可以随便填不存在的值,数据一多全乱套。后来再做大作业,我强制自己按流程走一遍:先画 E-R 图,再转关系模式,检查每个关系模式是否满足 3NF,最后用CREATE TABLE把主码、外码、CHECK约束一次写全。从那以后,我再没在课堂作业的数据库设计上翻过车。希望这份梳理能帮你看清每条理论背后的实际用途,等你自己动手设计和查询时,少踩一些我踩过的坑。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 12:15:53

PIC18F87J50与PJ85718DM双通道温度监测系统设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 12:15:49

UML关联多重度与交互图解析:顺序图、协作图的应用与避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 12:13:39

基于STM32F373VC与PJ85718DM的HVAC本地和远程温度监测实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 12:12:54

基于PJ85718DM与PIC18F87J50的HVAC测温系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 12:11:25

PJ85718DM与MKV46F构建工业级温度感知闭环

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 12:09:46

doccano安全加固指南:SQL注入与XSS防护实战

做数据标注平台的部署和维护&#xff0c;最怕听到的一句话就是&#xff1a;“这个系统好像被人扫到了。”我接手过的数据标注项目里&#xff0c;doccano 出现的频率相当高&#xff0c;它界面简洁、标注任务配置灵活&#xff0c;支持文本分类、序列标注、序列到序列等常见任务&a…

作者头像 李华