image

编辑人: 青衫烟雨

calendar2025-07-07

message1

visits211

2018年5月 数据库系统工程师 下午题答案及解析

一、问答题

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

【说明】

某医疗护理机构为老年人或有护理需求者提供专业护理。现欲开发一基于 Web 的医疗管理系统,以改善医疗护理效率。该系统的主要功能如下:

(1)通用信息查询。客户提交通用信息查询请求,査询通用信息表,返回查询结果。

(2)医生聘用。医生提出应聘/辞职申请,交由主管进行聘用/解聘审批,更新医生表,并给医生反馈聘用/解聘结果;删除解聘医生的出诊安排。

(3)预约处理。医生安排出诊时间,存入医生出诊时间表;根据客户提交的预约查询请求,查询在职医生及其出诊时间等预约所需数据并返回;创建预约,提交预约请求,在预约表中新增预约记录,更新所约医生出诊时间并给医生发送预约通知;给客户反馈预约结果。

(4)药品管理。医生提交处方,根据药品名称从药品数据中查询相关药品库存信息,开出药品,更新对应药品的库存以及预约表中的治疗信息;给医生发送“药品已开出”反馈。(5)报告创建。根据主管提交的报表查询请求(报表类型和时间段),从预约数据、通用信息、药品库存数据、医生以及医生出诊时间中进行查询,生成报表返回给主管。

现采用结构化方法对医疗管理系统进行分析与设计,获得如图 1-1 所示的上下文数据流图和图 1-2 所示的 0 层数据流图。

【问题 1】(3 分)

使用说明中的词语,给出图 1-1 中的实体 E1~E3 的名称。

【问题 2】(5 分)

使用说明中的词语,给出图 1-2 中的数据存储 D1~D5 的名称。

【问题 3】(4 分)

使用说明和图中术语,补充图 1-2 中缺失的数据流及其起点和终点。

【问题 4】(3 分)

使用说明中的词语,说明“预约处理”可以分解为哪些子加工?并说明建模图 1-1和图 1-2 时如何保持数据流图平衡?

参考答案:

【问题1】

E1:客户           E2: 医生         E3:主管问题

【问题2】

D1:通用信息表

D2:预约表

D3:医生表

D4:出诊时间表

D5:药品库存表

【问题3】

辞职医生信息:P2->D4

药品库存信息:D5->P4

已治疗信息:P4->D2

【问题4】

预约处理分解为:安排出诊、创建预约、提交预约请求、发送预约通知。

即保持父图与子图之间的平衡:父图中某个加工的输入输出数据流必须与其子图的输入输出数据流在数量上和名字上相同。父图的一个输入(或输出)数据流对应于子图中几个输入(或输出)数据流,而子图中组成的这些数据流的数据项全体正好是父图中的这一个数据流。

解析:

根据说明中的描述,医疗管理系统的用户包括客户、医生和主管。因此,图1-1中的实体E1、E2和E3分别代表客户实体、医生实体和主管实体(或管理实体)。

<问题二答案>
D1:通用信息表;D2:预约信息表;D3:医生信息表;D4:出诊时间表;D5:药品库存表。

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

【说明】

某海外代购公司,为扩展公司业务,需要开发一个信息息化管理系统。请根据公司现有业务及需求完成该系统的数据库设计。

【需求描述】

(1)记录公司员工信息。员工信息包括工号、身份证号、姓名、性别和一个手机号,工号唯一标识每位员工,员工分为代购员和配送员。

(2)记录采购的商品信息。商品信息包括商品名称、所在超市名称、采购价格、销售价格和商品介绍,系统内部用商品条码唯一标识每种商品。一种商品只在一家超市代购。

(3)记录顾客信息。顾客信息包括顾客真实姓名、身份证号(清关缴税用)、一个手机号和一个收货地址,系统自动生成唯一的顾客编号

(4)记录托运公司信息。托运公司信息包括托运公司名称、电话和地址,系统自动生成唯一的托运公司编号。

(5)顾客登录系统之后,可以下订单购买商品。订单支付成功后,系统记录唯一的支付凭证编号。顾客需要在订单里指定运送方式:空运或海运。

(6)代购员根据顾客的订单在超市采购对应商品,一份订单所含的多个商品可能由多名代购员从不同超市采购。

(7)采购完的商品交由配送员根据顾客订单组合装箱,然后交给托运公司运送。托运公司按顾客订单核对商品名称和数量,然后按顾客的地址进行运送。

【概念模型设计】

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


【逻辑模型设计】

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

员工(工号,身份号,姓名,性别,手机号)

商品(条码,商品名称,所在超市名称,采购价格,销售价格,商品介绍)

顾客(编号,姓名,身份证号,手机号,( a ))

托运公司(托运公司编号,托运公司名称,电话,地址)

订单(订单 1D,画品条码,顺编号,( b ),运送方式,支付凭证编号)

代购(代购 1D,代购员工号,订单 D2,( c ))

运送(运送 1D,配送员工号,托运公司编号,订单 1D,发运时间)

根据以上描述,回答下列问题:

【问题1】

根据问题描述,补充图 2-1 的实体联系图。

【问题2】

补充逻辑结构设计结果中的(a)、(b)、(c)三处空缺。

【问题3】

为方便顾客,允许顾客在系统中保存多组收货地址。请根据此需求,增加“顾客地址”弱实体,对图 2-1 进行补充,并修改“运送”关系模式。

参考答案:

【问题1】

【问题2】

a)收货地址

b)订购数量

c)商品条码,代购数量

【问题3】

解析:

本题主要考察数据库设计的ER图绘制以及对需求描述的理解。根据问题描述,需要补充和完善ER图,以及根据逻辑结构设计结果填写空缺部分。问题3还涉及到弱实体的添加和关系模式的修改。通过理解业务需求,绘制完整的ER图,并补充逻辑结构设计结果中的空缺部分,同时根据需求增加“顾客地址”弱实体并对“运送”关系模式进行修改。

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

【说明】

某医院为了更好的为患者服务、提高医院管理水平,拟开发满足自身特点的信息系统。其部分需求及设计如下。

【需求描述】

(1)患者到医院就诊,需提供本人医保卡或身份证,系统根据医保卡或身份证从外部医保信息库获取患者的其他详细信息,包括医保卡号、身份证号、姓名、性别、民族、出生日期等信息。

(2)医生信息包括医生编号、姓名、性别、出生日期、职称等信息。

(3)通过患者自述、化验结果分析等信息,医生对患者的病情进行诊断,开具处方,并填写病例。病例同时包含诊断和处方信息,包括编号、患者姓名、病情描述、诊断结论、主治医生、药品名称、药品数量、服用剂量等,处方中一般会有多种药品。

(4)病人凭医生开具的处方可在医院购买药品。医院记录药品的条码、名称、价格、生产厂商等信息。

【逻辑结构设计】

根据上述需求,设计出如下关系模式

医生(编号,姓名,性别,出生日期,职称)

患者(身份证号,医保卡号,姓名,性别,民族,出生日期)

药品(条码,名称,价格,生产厂商)

病例(编号,药品条码,患者身份证号,主治医生编号,病情描述,诊断结论,诊断日期,服用剂量,药品数量,购买日期)

【问题1】(5分)

对关系“患者”,请回答以下问题:

(1)给出函数依赖集。

(2)给出所有候选码。

(3)判定属于第几范式,并说明理由。

【问题2】(7分)

对关系“病例”,存在如下的数据依赖:

FD={编号→(患者身份证号,主治医生编号,病情描述,诊断结论,诊断日期),(编号,药品条码)→(服用剂量,药品数量,购买日期)},请回答以下问题。

(1)该关系模式存在哪些问题?

(2)该关系模式是否属于 4NF?请给给出理由。

(3)如果“病例”不是 4NF,请分解,并指出分解后的关系模式所属范式。分解后的关系名依次为:病例 1,病例 2,...。

【问题3】(3 分)

针对【问题 2】的规范化要求,如果设计者分解出的多个关系模式其中之一如下:

购药(病例编号,药品条码,服用剂量,药品数量,购买日期)

如果医院要求统计每名医生(编号和姓名)每天接诊的患者所购买的各个药品的条码和数量。基于上述设计,实现该统计共需哪几个关系?为提高该统计效率,允许对范式条件放宽要求,请修改“购药”关系模式以优化该统计。

参考答案:

【问题1】

1)FD={身份证号->(医保卡号,姓名,性别,民族,出生日期),医保卡号->(身份证号,姓名,性别,民族,出生日期)}

2)候选码:身份证号  或  医保卡号

3)患者关系属于4NF,因为在FD不存在非主属性对码的部分和传递依赖,也不存在主属性对不包含它的码的部分和传递函数依赖,同时也不存在非平凡且非函数依赖的多值依赖。

【问题2】

1)由于将一对多的两个关系合并成为一个关系,在FD中存在非主属性对码的部分函数依赖,因此关系存在插入、删除、更新异常和数据冗余。

2)不属于4NF,而是属于2NF,存在非主属性(患者身份证号等)对码(编号,药品条码)的部分函数依赖,同时也存在编号对条形码等属性的非平凡多值函数依赖。

3)病例 1(编号,患者身份证号,主治医生编号,病情描述,诊断结论,诊断日期)

   病例 2(编号,药品条码,服用剂量,药品数量,购买日期)

【问题3】

需要有的关系为:病例、医生、购药关系。

如果仅为了提高该查询的效率,即尽量减少连接运算,可以考虑在修改购药关系如下:

购药(病例编号,药品条码,服用剂量,药品数量,购买日期,医生编号,医生姓名)

解析:

问题1主要考察函数依赖集、候选码的判断以及范式判断。在关系数据库中,函数依赖是指一个关系模式的属性之间的约束关系。候选码是最小的超键,即可以唯一标识表中每一行的属性组合。范式判断则需要检查是否存在某些依赖关系导致的插入、删除和更新异常等问题。

问题2主要考察数据依赖分析、范式判断及关系模式的分解。首先分析给定的数据依赖关系是否存在问题,然后判断当前关系模式属于哪个范式。如果存在非4NF的问题,需要进行分解,并判断分解后的关系模式所属范式。

问题3考察的是基于范式条件的关系设计优化。在保持数据完整性的前提下,为了满足特定的查询需求,可能需要调整或优化关系模式的设计。这里的关键是理解如何通过调整关系模式来提高特定查询的效率。

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

【说明】

某汽车租赁公司建立汽车租赁管理系统,其数据库的部分关系模式如下:

用户:USERS( UserId,Name, Balance),各属性分别表示用户编号、姓名、余额;

汽车:CARS(CId, Ctype, CPrice,CStatus)各属性分别表示汽车编号、型号、价格(日租金)、状态;

租用记录: BORROWS(BRId, UserId,CId, STime, ETime),各属性分别表示租用编号、用户编号、汽车编号、租用用时间、归还时间;

不良记录:BADS(BId, UserId.BRId, BTime),各属性分别表示不良记录编号、用户编号、租用编号、不良记录时间。

相关关系模式的属性及说明如下

(1)用户租用汽车时,其用用户表中的余额不能小于 500,否则不能租用。

(2)汽车状态为待租和已租,待租汽车可以被用户租用,已租汽车不能租用。

(3)用户每租用一次汽车,向租用记录中添加一条租用记录,租用时间默认为系统当前时间,归还时间为空值,并将所租汽车状态变为已租。用户还车时,修改归还时间为系统当前时间,并将该汽车状态改为待租。要求用户不能同时租用两辆及以上汽车。

(4)租金从租用时间起按日自动扣除。

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

【问题 1】(4 分)

(1)请将下面建立 租用记录 表的 SQL 语句补充完整,要求定义主码完整性约束和引用完整性约束。

CREATE TABLE BORROWS (

BRID CHAR(20) (a) ,

UserId CHAR(10) (b) ,

Cld CHAR(10) (c)  ,

STime DATETIME (d) ,

ETime DATETIME,

);

【问题2】(4 分)

当归还时间为空值时,表示用户还未还车,系统每天调用事务程序从用户余额中自动扣除当日租金,每个事务修改一条用户记录中的余额值。由用户表上的触发器实现业务:如用户当日余额不足,不扣除当日租金,自动向不良记录表中加入一条记录,记录中的 BId 取值由 UserId+系统当前日期构成, Btime 采用 GETDATE()函数取系统当前时间。补全创建触发器 Bad_TRG 的 SQL 语句。

CREATE TRIGGER Bad_TRG (e) UPDATE

of Balance ON USERS

Referencing new row as nrow

For each row

When nrow.Balance< 0

BEGIN

(f) ;

//插入不良记录

INSERT INTO BADS

SELECT CONCAT(BORROWs.UserId, CONVERT(varchar(100), GETDATE(), 10)), BORROWS UserId,BRID, (g)

// CONVERTO 函数将日期型数据改为字符串型,CONCATO 函数实现字符串拼接

FROM BORROWS

WHERE (h) AND ETime IS NULL;

END;

【问题3】(4 分)

不良记录是按日记录的,因此用户一次租车可能会产生多条不良记录。创建不良记录单视图 BADS_Detail,统计每次租车产生的不良记录租金费用总和大于 200 的记录,属性有UserId、Name、BRId、CId、Stime、Etime 和 total(表示未缴纳租金总和)。补全建视图 BADS Detail 的 SQL 语句。

CREATE VIEW (i) AS

  SELECT BADS. UserId, USERS. Name, BADS.BRId,  CARS. Cld, Stime, Etime,          (j) AS total

FROM BORROWS,BADS,CARS,USERS

WHERE BORROWS.BRId=BADS. BRId AND BORROWS.Cid=CARS. Cld

AND (k)  =BADS.UserId

GROUP BY BADS. UserId, USERS.Name, BADS.BRID, CARS. CId, Stime, Etime HAVING (l)  ;

【问题4】(3 分)

查询租用了型号为“A8”且不良记录次数大于等于 2 的用户,输出用户编号、姓名,并按用户姓名降序排序输出。

SELECT USERS.UserId, Name

FROM USERS,BORROWS, CARS

WHERE USERS. UserId= BORROWS.UserId AND BORROWS.Cid= CARS.CId

AND (m)  AND EXISTS(

SELECT * FROM BADS

WHERE   BADS.UserId=BORROWS.UserId   AND (n)

GROUP BY UserId HAVING COUNT(*)>= 2)

ORDER BY (0) ;

参考答案:

【问题1】

(a)PRIMARY KEY

(b)REFERENCES UERS(UserID)

(c)REFERENCES CARS(Cid)

(d)GETDATE()

【问题2】

(e)After

(f)Rollback

(g)GETDATE()

(h)UserID=nrow.UserID

【问题3】

(i)BADS_Detail

(j)COUNT(*)*Cprice

(k)USERS. UserId

(l)COUNT(*)*Cprice>200

【问题4】

(m)CARS.Ctype=‘A8’

(n)BADS.BRId=BORROWS.BRId

(o)Name DESC

解析:

问题1要求建立租用记录表并定义主码和引用完整性约束。主码是数据库表中唯一标识记录的字段,因此需要使用PRIMARY KEY或UNIQUE约束来定义。引用完整性约束用于确保一张表中的数据匹配另一张表中的一行数据,这里需要关联到用户表和汽车表的外键。默认时间可以使用DEFAULT GETDATE()设置系统当前时间。

问题2涉及到触发器 Bad_TRG 的创建,触发器在UPDATE操作后触发,当余额不足时回滚事务并插入不良记录。插入不良记录时需要使用GETDATE()获取系统当前时间,并通过新旧行的UserID判断是否为用户未还车的情况。

问题3要求创建不良记录单视图 BADS_Detail,统计每次租车产生的不良记录租金费用总和大于200的记录。这里需要连接多个表并计算未缴纳租金总和,使用SUM函数进行聚合,并通过HAVING子句筛选总费用大于200的记录。

问题4要求查询租用了特定型号汽车且不良记录次数大于等于2的用户,并按用户姓名降序排序输出。这里需要连接用户表、借用表和汽车表,通过条件筛选特定型号的汽车和不良记录次数,并使用EXISTS和GROUP BY子句进行子查询和分组统计。最后按用户姓名降序排序输出查询结果。

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

【说明】

某超市销售系统的部分关系模式如下:

商品表: Commodity(Ccode, Cname, price,qty),其中属性含义分别为:商品编号、商品名称、价格、库存量,有专门的事务保证库存量足够大,销售时无需检测。

销售表: Sale(Sno,Ccode, amount, Stime),其中属性含义分别为:销售编号,商品编号、数量、时间。

其销售业务规则如下:

顾客在超市挑选好商品后,带商品到结算处结算付款,结算处有多名结算员使用多台机器进行结算。结算员负责扫顾客购买商品的条码和数量,由系统后台结算程序计算出顾客购买商品的总金额,修改商品表的商品库存量,并将销售信息写入销售表。

请根据上述描述,回答以下问题。

【问题1】(3 分)

假设有两个顾客同时购买同一条码的商品,结算事务修改该商品的库存量(记为数据项 X),部分的调度如图 5-1 所示。

如果购买前 X 的初值为 10,则上述调度执行完成后,X 的值是多少?属于哪一类不一致性?

【问题2】 (6 分)

引入独占锁指令 Xlock()和解锁指令 Unlock(),对【问题 1】中的调度进行重写,要求满足两段锁协议,且事务 T1、T2 首条指令的相对请求时间与【问题 1】中的相同。

【问题 3】(6 分)

下面是用 SQL 实现的结算程序,请补全空缺处的代码。

要求在保证销售信息不丢失的前提下,达到最大的系统并发度。

CREATE PROCEDURE buy(IN: CommNo VARCHAR(20), IN: AmountBuy INT)

BEGIN

//输入合法性验证

if(: AmountBuy<1) return-1;

SET  TRANSACTION ISOLATION  LEVEL    (a)  ;

BEGIN TRANSACTION;

//插入销售记录

INSERT INTO Sale

VALUES(getGUID(),: CommNo, AmountBuy, getDATETIME());

//函数 getGUID():获取唯一值

//函数 getDATETIME():获取当前系统日期时间

If  error ∥error 是由 DBMS 提供的上一句 SQL 的执行状态

BEGN

ROLLBACK; return-2;

END

//修改库存数量

UPDATE Commodity SET   qty= (b)     WHERE Ccode=: CommNo;

if error

BEGIN

ROLBACK; return-3;

END

      (c)      

END

参考答案:

【问题1】

(1)第2人,并发操作出现了丢失更新的问题,第2个的更新覆盖了第1个的更新,原因是破坏了事物的隔离性。

(2)会产生死锁,由于数据X同时被1和2加锁了S锁,再对方没有释放的时候,都无法加成功X锁,导致1和2一直都处于等待的状态

(3)XLock(X) a=R(X) W(b,X)UNLock(X)

【问题2】

【问题3】

(a)REPEATABLE READ

(b)qty-:AmountBuy;

(c)Commit;

Return 0;

END TRANSACTION;

解析:

问题1主要涉及到数据库并发控制中的不一致性和死锁问题。由于存在多个事务同时修改同一数据项的情况,可能导致数据不一致和死锁。通过引入独占锁指令和解锁指令,可以重写调度过程以满足两段锁协议,从而避免这些问题。

问题2要求使用独占锁指令和解锁指令重写调度过程,以满足两段锁协议。这需要确保每个事务在获取锁后必须在有限时间内完成其所有操作并释放锁,以避免死锁的发生。

问题3是关于SQL实现的结算程序的补全。为了保证销售信息不丢失且达到最大系统并发度,需要设置合适的事务隔离级别,使用事务控制语句包围关键操作,并在操作完成后提交事务。如果任何操作失败,可以回滚事务以保证数据的一致性。

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

创作类型:
原创

本文链接:2018年5月 数据库系统工程师 下午题答案及解析

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