image

编辑人: 浅唱

calendar2025-07-27

message3

visits617

2022年数据库系统工程师(下午题)答案及解析

一、问答题

1、试题一(20分):

阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

某市为了规范疫苗接种工作,提升效率,并为抗击疫情提供疫苗接种数据支撑,需要开发一个信息系统。请根据下述需求描述完成该系统的数据库设计。

【需求描述】

(1)记录疫苗供应商的信息,包括供应商名称、地址和一个电话。

(2)记录接种医院的信息,包括医院名称、地址和一个电话。

(3)记录被接种者个人信息,包括姓名、身份证号和一个电话。

(4)记录接种者的疫苗接种信息,包括接种医院信息、被接种者信息、疫苗供应商名称和接种日期。为了提高免疫力,接种者可能需要进行多次疫苗接种(每天最多接种一次),但每次都可以在全市任意一家医院进行疫苗接种。


【概念模型设计】

根据需求阶段收集的信息,设计的实体联系图(不完整)如图1-1所示。


【逻辑结构设计】

根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整)∶

供应商(供应商名称,地址,电话)

医院(医院名称,地址,电话)

供货(供应商名称,(a) ,供货内容)

被接种者(姓名,身份证号,电话)

接种(被接种者身份证号,(b) ,医院名称,供应商名称)



【问题1】(4分)

根据问题描述,补充图1-1的实体联系图(不增加新的实体)。


【问题2】(4分)

补充逻辑结构设计结果中的(a)、(b)两处空缺,并标注主键和外键完整性约束。


【问题3】(7分)

若医院还兼有核酸检测的业务,检测者可能需要进行多次核酸检测(每天最多检测次),但每次都可以在全市任意一家医院进行检测。


请在图1-1中增加"被检测者"实体和相应的属性、医院和被检测者之间的"检测"联系和必要的属性,并给出新增加的关系模式。


"被检测者"实体包括姓名、身份证号、住址和一个电话。"检测"联系需要包括检测日期和检测结果等。

参考答案:

问题1



问题2

(a)医院名称(b)日期

供货表,主键为:供应商名称、医院名称,外键为:医院名称

接种表,主键为:被接种者身份证号、日期,外键为:被接种者身份证号、医院名称、供应商名称


问题3

被检测者(姓名、身份证号、住址、电话),身份证号为主键

接种(被检测者身份证号,医院名称,日期),被检测者身份证号、日期 为主键,被检测者身份证号、医院名称为外键

解析:

<问题1>:根据问题描述,需要补充实体联系图。增加的实体是"被检测者",其与医院之间的关联是通过"检测"联系实现的。因此,在原有的实体联系图上,需要添加"被检测者"实体以及其与医院之间的"检测"联系。

<问题2>:在逻辑结构设计结果中,(a)处应填写的是与供应商提供货物相关的医院名称,(b)处应填写的是接种的日期。对于供货表,其主键应包含供应商名称和医院名称,其中医院名称是外键,指向医院表的主键;对于接种表,其主键应包含被接种者的身份证号和接种日期,其中被接种者的身份证号和医院名称都是外键。

<问题3>:若医院还兼有核酸检测的业务,需要增加"被检测者"实体以及其与医院之间的"检测"联系。被检测者实体包含姓名、身份证号、住址和电话等属性。检测联系则需要包含检测日期和检测结果等属性。新增的关系模式包括被检测者(姓名、身份证号、住址、电话)和检测(被检测者身份证号,医院名称,检测日期,检测结果)。主键为被检测者的身份证号和检测日期的组合,外键为被检测者的身份证号和医院名称。

2、试题二(共15分)

阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

某卡丁车场地为方便车手线上查询自己的圈速成绩,设计了相应的关系模型。模型中有三个表∶

冲线记录表(序列号,日期,冲线时刻,圈速,车号,组别,手机号,车手姓名);

赛车表(车号,组别,车型);

车手表(车手姓名,手机号,年龄,性别)。


其中序列号唯一确定一条冲线记录,车型和组别可由车号确定,车手手机号唯一,车手姓名可重复。


【问题1】(3分)

冲线记录表中是否含有数据冗余?如果存在冗余,请列出冗余属性。

【问题2】(6分)

请分别给出冲线记录表、赛车表和车手表的主码和外码。

【问题3】(6分)

题干描述的冲线记录表是否满足3NF?如果不满足,请给出导致不满足 3NF的函数依赖关系,并用 50字以内的文字简要说明解决方案。

参考答案:

问题1

存在冗余,冗余属性为:组别、车手姓名

问题2

冲线记录表,主码:序列号,外码:车号、手机号

赛车表,主码:车号,外码:无

车手表表,主码:手机号,外码:无

问题3

线记录表不满足3NF,因为:

序列号→车号,车号→组别,因此存在 序列号→(传递依赖)组别

同理

序列号→手机号,手机号→车手姓名,因此存在 序列号→(传递依赖)车手姓名

解决方法:删除 线记录表 中的 组别、车手姓名 属性

3、试题三(共15分)

阅读下列说明,回答问题1至问题4,将解答填入答题纸的对应栏内。

【说明】

某工程项目管理系统的部分数据库关系模式如下∶

项目:PROJECT(Ino,Jname,City,Date),各属性分别表示项目代码、项目名称、项目所在城市和项目开始日期;


零件:PART(Pno,Pname,Color,Sno,Stock),各属性分别表示零件代码、零件名称、零件颜色、零件所在仓库代码及库存量;


供应情况:PJC(Pno,Jno,Qty),各属性分别表示零件代码、项目代码、使用量;


仓库:STORE(Sno,Sname,Address),各属性分别表示仓库代码、仓库名称、仓库地址。

有关上述关系模式的说明如下:

(1)下划线标出的属性是表的主键。

(2)零件表的属性 Sno 参照了仓库表的主码。一种零件只存放在一个仓库,库存量最低为0。

(3)供应情况表的属性Pno和Jno分别参照了零件表和项目表的主码。



根据以上描述,回答下列问题,将SQL语句的空缺部分补充完整。

【问题1】(4分)

请将下面创建零件表PART的SQL语句补充完整,要求定义实体完整性约束、参照完整性约束,以及其他完整性约束。

CREATE(a)PART(

Pno CHAR(10) (b),

Pname CHAR(20),

Color CHAR(4),

Sno CHAR(4)REFERENCES (c) (Sno),

Stock INT(d));


【问题2】(3分)

创建视图PARTUSED,给出在项目中已使用零件的代码和使用量。此视图的创建语句如下,请补全。

CREATE VIEW PARTUSED AS

SELECT Pno,(e)AS Usage

FROM PJ

(f)BY(g) ;


【问题3】(4分)

在视图PART_USED的基础上,查询所有零件的信息,要求输出每种零件的零件代码、零件名、零件颜色和零件总量(使用量与库存量之和),查询结果按照零件总量降序排列。此功能由下面的SQL语句实现,请补全。

SELECT Pno,Pname,Color,(h) AS Total

FROM PART, PART_USED

WHERE PART.Pno=PART_USED.Pno

(i)

SELECT Pno,Pname,Color, Stock AS Total

FROM PART

WHERE Pno(j)

(SELECT DISTINCT Pno FROM PJ)

ORDER BY Total (k);

【问题4】(4分)

由于某种原因,要拆除代码为'A006的仓库,该仓库中的零件转入 'A002'仓库存放。据此更新数据库的功能由下面的 SQL 语句实现,请补全。

UPDATE(1)SET (m)WHERE Sno ='A006;

(n)FROM (o)WHERE Sno = 'A006;

参考答案:

a table

b primary key

c store

d check(stock>=0)

e sum(Qty)

f  group

g  Pno

h usage

i  union all(暂时参考)

j  in

k desc

l  part

m  sno='A002'

n  delete

o  store

解析:

问题1要求创建零件表PART的SQL语句,并补充完整性约束。根据题目描述和数据库关系模式,零件表需要定义实体完整性约束(主键)、参照完整性约束(零件所在仓库代码参照仓库表的主码)以及其他完整性约束(库存量最低为0)。因此,答案为a. TABLE表示创建表;b. PRIMARY KEY表示定义主键;c. STORE表示参照仓库表的主键;d. CHECK (Stock >= 0)表示库存量不能为负数的完整性约束。

4、试题四(共15分)

阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

某银行账务系统的部分简化后的关系模式如下:

账户表: accounts(a_no, a_name,a_status, a_bal, open_branch_no,open_branch_ name,phone_no);属性含义分别为:账户编码、账户名称、账户状态(1-正常、2-冻结、3-挂失)、账户余额、开户网点编码、开户网点名称、账户移动电话。

账户交易明细表:trade_details(t_date, optr_no, serial_no, t_branch,a_no,t_type,t_amt,t_result);属性含义分别为:交易日期、操作员编码、流水号、交易网点编码、账户编码、交易类型(1-存款、2-取款)、交易金额、交易结果(1-成功、2-失败、3-异常、4-已取消)。

网点当日余额汇总表:branch_sum(b_no, b_date, b_name, all_bal);属性含义分别为:网点编码、汇总日期、网点名称、网点开户账户的总余额。

系统提供常规的账户存取款交易,并提供账户余额变更通知服务。该账务系统是7*24h不间断的提供服务;网点当日余额汇总操作一般在当日晚上12点左右,运维人员在执行日终处理操作中完成。

【问题1】(6分)

下面是系统日终时生成网点当日余额汇总数据的存储过程程序,请补全空缺处的代码。

CREATE PROCEDURE BranchBalanceSum(IN s date char( 8))

DECLARE

all_balancenumber(14,2);

v_bran_no varchar(10);

v_bran name varchar(30);

(a)c_sum_bal IS

SELECT open_branch_no, open_branch_name, sum(a_bal)

FROM accounts GROUP BY open_branch_no, open_branch_name;

BEGIN

OPEN c sum bal;

LOOP

(b)c_sum bal INTO v_bran _no,_(c)_;

IF c_sum_bal%%NOTFOUND THEN //未找到记录

(d);

END IF;

INSERT INTO branch_sum

VALUES(v_bran_no,s_date, v_bran_name, all_balance);

END LOOP;

CLOSE_ (e);

COMMIT;

EXCEPTION WHEN OTHERS THEN _     (f)   

END;


【问题2】(5分)

当执行存取款交易导致用户账户余额发生变更时,账务系统需要给用户发送余额变更短信通知。通知内容为"某时间您的账户执行了某交易,交易金额为XX元,交易后账户余额为XXX元"。默认系统先更新账户表,后更新账户交易明细表。

下面是余额变更通知功能对应的程序,请补全空缺处的代码。

CREATE TRIGGER BalanceNotice(g) INSERT on(h) (i)

WHEN(j)=1

DECLARE

v_phonevarchar(30);

v_type varchar(30);

v_bal number(14,2);

v_msg varchar(300);

BEGIN

SELECT phone_no,a_bal INTO v_phone,v_bal FROM accounts

WHERE a_no =(k);

IF NEW.t_type=1 THEN v_type ∶='存款';END IF;

IFNEW.t_type=2 THEN v_type ∶='取款';ENDIF;

v_msg∶=NEW.t_date ||',您的账户'||NEW.a_no||'上执行了'||v_type||'交易,交易金额为"||to_string(NEW.t_amt)||'元,交易后账户余额为'||to_string(v_bal)||'元';

SendMsg(v_phone,v_msg); // 发送短信

END;

【问题3】(4分)

假设日终某网点当日余额汇总操作和同一网点某账户取款交易同一时间发生,对应事务的部分调度序列如表4-1 所示。


(1)在事务提交读隔离级别下,该网点的汇总和取款事务是否成功结束?

(2)如果该数据库提供了多版本并发控制协议,两个事务是否成功结束?

参考答案:

【问题1】【问题2】

a cursor

b  fetch

c  v_bran_name, all_balance

d  exit

e c_sum_bal

f  rollback

g before

h trade_details

i  for each row

j  t_resulte

k  NEW.a_no

【问题3】

不能成功,事务提交读隔离级别时,汇总事务读取数据时先要加S锁,并求到事务提交才释放S锁,而 账户取款事务 为写操作,需要事先加X锁,但此时无法加X锁。

可以。多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。使用MVCC多版本并发控制比锁定模型的主要优点是在MVCC里, 对检索(读)数据的锁要求与写数据的锁要求不冲突, 所以读不会阻塞写,而写也从不阻塞读。

解析:

这是一个关于数据库存储过程的题目,要求补全程序中的空缺部分。根据题目描述和给出的代码片段,我们可以按照以下思路进行补全:

(a)处需要一个CURSOR来定义游标,用于从数据库中检索数据。
(b)和(c)处需要填写FETCH语句和变量名,用于从游标中获取数据到变量中。这里需要从账户表(accounts)中获取网点名称和总余额信息。
(d)处填写EXIT语句,用于退出循环。当游标中没有更多记录时,执行EXIT退出循环。
(e)处需要关闭游标,使用CLOSE语句关闭游标。这里关闭的是c_sum_bal游标。
(f)处填写ROLLBACK语句,用于处理异常时回滚事务。当程序执行过程中出现异常时,需要回滚事务以保证数据的完整性。

5、试题五(共15分)

阅读下列说明,回答问题1至问题 4,将解答填入答题纸的对应栏内。

【说明】

某数据库系统采用数据转储方式对数据和日志文件进行离线备份,用检查点机制进行恢复。假设其部分日志文件如表5-1所示。日志记录内容中∶CHECKPOINT表示检查点,<Ti,START>表示事务Ti开始执行,<Ti,COMMIT>表示事务Ti提交,<Ti,D,V1,V2>表示事务Ti将数据项D的值由V1改为V2,CRASH表明系统发生断电故障。假设各数据项的初始值为∶I=3,J=6,K=11。


【问题1】(4分)

系统发生故障时,满足持久化要求的事务有哪些?不满足持久化要求的事务有哪些?

【问题2】(6分)

系统恢复后,数据项I、J、K的数值哪些会恢复为初始值?哪些不会恢复为初始值?请给出系统恢复后I、J、K的值。

【问题3】(3分)

如果系统采用先写数据库再记日志的机制,故障发生前已经提交了事务 T2,但没有记录到<T2,COMMIT>。请给出系统恢复后I、J、K的值。

【问题4】(2分)

基于问题2和问题3的结果,请用50字以内的文字简要说明为什么先写日志机制更优。

参考答案:

【问题1】

满足持久化要求的事务:T1

不满足持久化要求的事务:T2

【问题2】

K恢复初始值,I、J不恢复为初始值。

最终结果I=4、J=8、K=11

【问题3】

如果系统采用先写数据库再记日志的机制,则日志文件中没有<T2,COMMIT>,即T2表现为未提交,在恢复时,需要撤销所有T2的操作。最终结果I=5、J=7、K=11

【问题4】

为什么要先写日志文件?

写数据库和写日志文件是两个不同的操作,在这两个操作之间可能发生故障。

如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了;如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数据库的正确性。

解析:

根据说明中的日志记录内容,CHECKPOINT表示检查点,事务提交后写入日志就表示该事务满足持久化要求。从日志中可以看到,只有T1事务被提交并记录在日志中,因此满足持久化要求的事务是T1,不满足持久化要求的事务是T2。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2022年数据库系统工程师(下午题)答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share