(仅供参考,欢迎指正)
一、选择题(每题2分,共10分)
1.数据库系统的三级模式结构中,外模式 对应的是:
A. 存储模式
B. 用户视图
C. 全局逻辑结构
D. 物理存储结构
答案:B。
解析:
数据库系统的三级模式结构包括外模式、模式和内模式,这是数据库管理系统内部的系统结构,用于实现数据的抽象与独立管理。
1.外模式(External Schema):
(1)也称为子模式或用户模式,是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述。
(2)外模式是数据库用户的数据视图,是与某一具体应用相关的数据逻辑表示。它通常是模式的子集,一个数据库可以有多个外模式,每个外模式为不同用户组定制,隐藏不需要的数据,从而提供安全性和逻辑独立性。
2.模式(Schema):
(1)也称为逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
(2)模式描述了数据的全局逻辑结构,包括数据项的名称、类型、取值范围,以及数据之间的联系、安全性、完整性约束等。它独立于具体的存储细节和应用程序,是数据库系统模式结构的中间层。
3.内模式(Internal Schema):
(1)也称为存储模式,是数据物理结构和存储方式的描述,即数据在数据库内部的表示方式。
(2)内模式定义了内部记录类型、索引和文件的组织方式,以及数据控制细节(如存储方式、索引结构、压缩加密等)。它负责将逻辑数据映射到物理存储上。
对应关系:
外模式 对应 用户视图(选项B)。
模式 对应 全局逻辑结构(选项C)。
内模式 对应 物理存储结构 (选项D),也称为存储模式(选项A)。
2.以下不属于关系完整性约束的是:
A. 实体完整性
B. 参照完整性
C. 用户定义完整性
D. 结构完整性
答案:D。
解析:关系模型中有三类完整性约束:实体完整性 (entity integrity)、参照完整性 (referential integrity)、用户定义的完整性 (user-defined integrity)。其中实体完整性和参照完整性是关系模型必须满足的完整性约束,被称作是关系的两个不变性,应该由关系系统自动支持。用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
实体完整性要求表的主键字段不能取空值,这确保了每一个实体(即表中的每一行)都能被唯一标识,例如每个学生的学号必须存在且唯一。
参照完整性则规定了表之间的引用关系必须有效,即一个表(如选课表)中外键的取值,必须参照另一个表(如学生表)中已存在的主键值,或者为空,这保证了不会引用到不存在的实体,例如选课记录中的学生必须在学生表中有登记。
用户定义的完整性是针对具体业务规则的约束,它体现了应用领域的特殊语义,例如可以规定学生年龄必须在特定范围内,或某个字段的取值必须满足某种逻辑条件,这类约束需要由用户定义后,数据库系统据此进行检验。
3.SQL中用于创建视图的语句是:
A. CREATE TABLE
B. CREATE VIEW
C. CREATE INDEX
D. CREATE SCHEMA
答案:B。
解析:
A选项 CREATE TABLE 对应 创建表。
B选项 CREATE VIEW 对应 创建视图。
C选项 CREATE INDEX 对应 创建索引。
D选项 CREATE SCHEMA 对应 创建模式。
4.在关系模式R(A,B,C)中,若存在函数依赖 A → B 和 B → C,则该模式最高属于:
A. 1NF
B. 2NF
C. 3NF
D. BCNF
答案:B。
解析:候选键是A。主属性:A。非主属性:B,C。不存在非主属性部分依赖于候选键,至少为2NF。存在非主属性传递依赖于候选键(A → B,B → C),违反3NF。该模式最高属于2NF。
5.事务的四个特性中,不包括:
A. 原子性
B. 一致性
C. 隔离性
D. 冗余性
答案:D。
解析:事务具有4个特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持续性(durability)。这4个特性通常简称为ACID特性(ACID properties)。
1.原子性
概念:事务是数据库的逻辑工作单位,事务中的所有操作要么都做(全部执行),要么都不做(全部不执行)。如果事务因故障而未能完成,则已经执行的部分操作会被撤销(回滚),就像这个事务从未执行过一样。
例子:考虑一个银行转账事务:从账户A转账100元到账户B。这个事务包括两个操作:从A扣减100元,向B增加100元。原子性要求这两个操作要么全部成功,要么全部失败。如果扣减A之后系统故障,那么事务会被回滚,A的扣减操作会被撤销,保持数据的一致性(即A和B的总金额不变)。
2.一致性
概念:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。数据库的一致性状态是指数据库中的数据满足完整性约束(例如实体完整性、参照完整性、用户定义的完整性)。事务在执行过程中可能暂时使数据库处于不一致状态,但在事务提交时,必须保证所有完整性约束得到满足。
例子:仍以转账为例,假设转账前账户A和B的余额之和为1000元,且满足约束"账户余额不能为负"。转账事务执行后,A和B的余额之和应仍为1000元,且两个账户的余额均不能为负。如果事务成功提交,数据库就从转账前的一致性状态(A和B余额之和为1000,且无负值)转变为转账后的一致性状态(A和B余额之和仍为1000,且无负值)。如果事务执行过程中违反了约束(例如A余额不足导致扣减后为负),则事务会被中止并回滚,从而保持原来的一致性状态。
3.隔离性
概念:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。隔离性确保事务并发执行的结果与它们串行执行的结果相同。
例子:假设有两个并发执行的事务T1和T2。T1从账户A转账100元到账户B,T2同时计算账户A和B的总余额。如果没有隔离性,T2可能在T1执行了扣减A但尚未增加B时读取数据,这样T2读取到的A和B总余额就会比实际少100元(因为A已被扣减而B尚未增加),这就产生了不一致。通过隔离性(例如使用可串行化隔离级别),可以保证T2要么在T1开始前读取,要么在T1完成后读取,从而避免读取到中间状态。
4.持续性
概念:持续性也称为永久性(Permanence),指一旦事务提交,则它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。
例子:如果转账事务已经提交,那么即使系统在提交之后发生故障(如断电),当系统重新启动后,账户A和B的余额也应该是事务提交后的状态(即A已扣减100,B已增加100)。这通常通过数据库的恢复机制(如日志)来保证:事务提交时,其修改已经写入持久存储(如硬盘),即使系统崩溃,也能根据日志重做(redo)已提交事务的修改。
总结:ACID特性是事务管理的核心,它们共同保证了数据库事务的正确执行和数据的可靠性。原子性通过回滚未完成事务保证;一致性由应用程序和数据库完整性约束共同保证;隔离性通过并发控制机制(如封锁)实现;持续性通过恢复机制(如日志)实现。
二、判断题(每题2分,共10分)
1.数据库管理系统的安全机制中,自主存取控制是通过角色和权限实现的。 ( )
答案:√
解析:自主存取控制(DAC)是数据库安全的重要机制,其核心是通过GRANT、REVOKE等语句为用户或角色授予或回收对数据库对象的操作权限(如SELECT、INSERT等)。角色是一组权限的集合,可用于简化权限管理。
2.视图是从一个或几个基本表导出的表,它是一个实表。 ( )
答案:×
解析:视图是由一个或多个基本表(或视图)导出的虚拟表,其本身不存储实际数据,仅保存视图定义(查询语句)。对视图的操作最终会转换为对基本表的操作。
3.规范化过程中,模式分解必须保持函数依赖和无损连接。 ( )
答案:√
解析:在关系数据库规范化理论中,模式分解需要满足两个重要性质:
无损连接性:分解后的关系通过自然连接能恢复原关系,不丢失信息。
保持函数依赖:分解前后函数依赖关系保持一致。
这是评价模式分解合理性的基本标准。
4.日志文件主要用于数据库恢复,记录事务的所有更新操作。 ( )
答案:√
解析:日志文件是数据库恢复技术的核心组件,它按时间顺序记录所有事务对数据库的更新操作(如修改、插入、删除),包括事务开始、提交、回滚及数据前后像。系统发生故障时,可利用日志进行UNDO(撤销未完成事务)和REDO(重做已提交事务)操作。
5.两段锁协议是保证并发调度可串行化的充分条件。 ( )
答案:√
解析:两段锁协议(2PL)规定事务必须分两个阶段申请和释放锁:
扩展阶段:只能申请锁,不能释放锁。
收缩阶段:只能释放锁,不能申请锁。
该协议是保证并发调度可串行化的充分条件(但非必要条件),是大多数数据库管理系统采用的并发控制机制之一。
三、分析题(每题10分,共20分)
1.设有关系模式 学生选课(学号,姓名,课程号,课程名,成绩),语义为:一名学生可选多门课,每门课有唯一课程名,每名学生每门课有一个成绩。
(1)请写出该模式中存在的基本函数依赖。
答案:学号→姓名,课程号→课程名,(学号,课程号)→成绩,课程名→课程号,(学号,课程名)→成绩。
(2)找出候选码。
答案:(学号,课程号),(学号,课程名)。
(3)判断该模式最高属于第几范式,并说明理由。
答案:1NF。
理由:主属性:学号,课程号,课程名。非主属性:姓名,成绩。存在非主属性部分依赖于候选键(学号→姓名),违反2NF。
2.请简述数据库系统中三级模式结构 及其优点,并说明什么是逻辑数据独立性。
答案:
1.数据库系统的三级模式结构由外模式、模式和内模式组成,并通过二级映像实现数据独立性。
外模式:用户视图,是局部数据的逻辑结构。
模式:全局逻辑结构,是所有数据的公共描述。
内模式:物理存储结构,是数据在内部的表示方式。
2.优点:
逻辑独立性 :通过外模式/模式映像 实现。当模式 改变时,修改此映像可使外模式和应用程序保持不变。
物理独立性 :通过模式/内模式映像 实现。当内模式 改变时,修改此映像可使模式和应用程序保持不变。
3.逻辑数据独立性是指通过修改外模式/模式映像 ,使得模式 的修改不影响外模式和应用程序的能力。
四、设计题(每题15分,共30分)
1.请根据以下语义设计E-R图,并转换为关系模式:
班级:班号,班级名称,专业,年级,所属院系,班主任;
学生:学号,姓名,性别,年龄,所在系;
课程:课程号,课程名,先行课,学分;
教师:工号,姓名,性别,年龄,所在系,职称。
(1)一个班级有若干学生,每个学生属于一个班级。
(2)一个学生可选修多门课程,一门课程可被多名学生选修。
(3)每门课程由一位教师讲授,一位教师可讲授多门课程。
(4)学生选修课程后有成绩。
(5)实体:班级、学生、课程、教师 ;联系:属于、选修、讲授。
答案:
E-R图:
关系模式:
班级(班号,班级名称,所属院系,专业,年级,班主任)
主码:班号。
外码:无。
学生(学号,姓名,性别,年龄,所在系,班号)
主码:学号。
外码:班号。
课程(课程号,课程名,先行课,学分,授课教师工号)
主码:课程号。
外码:授课教师工号。
教师(工号,姓名,性别,年龄,所在系,职称)
主码:工号。
外码:无。
选修(学号,课程号,成绩)
主码:(学号,课程号)。
外码:学号,课程号。
2.设有以下两个表:
学生表(学号,姓名,年龄,班级)
成绩表(学号,课程号,成绩)
请写出SQL语句实现:
(1)查询"计算机科学与技术"班的学生姓名和年龄。
答案:
sqlselect 姓名,年龄 from 学生表 where 班级='计算机科学与技术';
(2)查询选修了"数据库原理"课程(假设课程号为'CS101')且成绩大于90分的学生姓名。
答案:
sqlselect 姓名 from 学生表 s,成绩表 g where s.学号=g.学号 and 课程号='CS101' and 成绩>90;或
sqlselect 姓名 from 学生表 where 学号 in (select 学号 from 成绩表 where 课程号='CS101' and 成绩>90);
(3)创建视图"优秀学生",包含学号、姓名、平均成绩(只显示平均分≥85的学生)。
答案:
如果确定学号是学生表的主键,那么可以只按学号分组
sqlcreate view 优秀学生 as select s.学号,s.姓名,round(avg(sc.成绩),2) as 平均成绩 from 学生表 s,成绩表 sc where s.学号=sc.学号 group by s.学号 having 平均成绩>=85;/*
附创建学生表、成绩表(创建时定义主键、外键约束)
sqlcreate table 学生表( 学号 varchar(15), 姓名 varchar(15), 年龄 int , 班级 varchar(15), primary key(学号) /*单独定义*/ ); /* 内联定义 create table 学生表( 学号 varchar(15) primary key, 姓名 varchar(15), 年龄 int , 班级 varchar(15) ); */ create table 成绩表( 学号 varchar(15), 课程号 varchar(15), 成绩 int, primary key(学号,课程号), /*复合主键必须单独定义*/ foreign key(学号) references 学生表(学号) );*/
五、应用操作题(每题15分,共30分)
1.请用SQL语句完成以下操作:
(1)创建表教师(工号,姓名,职称,工资),其中工号为主键,工资默认为5000。
答案:
sqlcreate table 教师( 工号 varchar(15) primary key, 姓名 varchar(15), 职称 varchar(15), 工资 decimal(10,2) default 5000 );
(2)向表中插入一条记录:工号'T001',姓名'张三',职称'教授'。
答案:
sqlinsert into 教师(工号,姓名,职称) values('T001','张三','教授');
(3)将工资低于6000的教师工资上调10%。
答案:
sqlupdate 教师 set 工资=工资*1.1 where 工资<6000;
(4)删除职称为"助教"的教师记录。
答案:
sqldelete from 教师 where 职称='助教';
2.请分析以下并发操作可能出现的数据不一致问题,并说明如何通过封锁机制解决:
(1)事务T1:读取账户A余额 → 扣除100 → 写回A。
(2)事务T2:读取账户A余额 → 增加100 → 写回A。
若两个事务同时执行,可能出现什么问题?应如何加锁?
答案:
若事务 T1 和 T2 并发执行且无任何并发控制,可能出现丢失更新问题。
具体结果取决于操作系统或数据库调度器对两个事务指令的调度顺序,可能是900,也可能是1100,总之某一事件的操作结果将被覆盖而丢失,而正确的操作结果应该是1000。
应该使用排他锁搭配两段锁协议:每个事务在读取A之前申请X锁,并在事务结束后(提交)才释放锁,这样保证了两个事务对 A 的更新操作串行化,从而避免了丢失更新问题。
