2023-2024-1期末¶
一、单选题(共45分,每题3分)¶
-
MongoDB 的组织体系中,哪一个不是必须的?( ) A. 数据库(database) B. 模式(schema) C. 文档集(collection) D. 文档(document)
-
MongoDB的文档键值对中,值不能为:( ) A. 空值(null) B. 文档 C. 数组 D. 以上都可以
-
下列命令中,可以用于创建MongoDB数据库的是:( ) A. create B. show C. use D. db
-
如下SQL语句中,哪个可能返回null值?( ) (1)
select count(*) from t1;(2)select max(col1) from t1;(3)select concat('max=', max (col1)) from t1;A. (1)可能,(2)和(3)不可能 B. (2)可能,(1)和(3)不可能 C. (3)可能,(1)和(2)不可能 D. (1)不可能,(2)和(3)可能 -
假设数据库表定义如下,哪个SQL语句查询能最大程度地利用索引?( )
create table T (
k int unsigned not null auto_increment,
a date,
b varchar(24),
c int, d varchar (24),
primary key (k), unique key a_index (a DESC, b DESC));
A. select b from WHERE b like '%aaa';
B. select a, b from T WHERE a='2015-10-25' ORDER BY b ASC, c ASC;
C. select a, b, c from T WHERE a='2015-10-25' ORDER BY b ASC;
D. select a, b, c from T WHERE a='2015-10-25' ORDER BY b DESC;
-
以下关于关系代数的说法中,哪一项不正确?( ) A. 关系代数表达式的操作对象是关系 B. 关系代数表达式的运算结果是关系 C. 一个关系经过选择操作后,元组个数不会增加 D. 一个关系经过投影操作后,元组个数不会减少
-
以下哪项操作不能用ORM做到?( ) A. 添加数据 B. 删除数据 C. 修改数据类型 D. 修改数据
-
以下哪条代码可以在SQLAlchemy 中实现AND操作?( ) A.
session.query(Person).filter(Person.name=='Chen' && Person.sex=='male').all()B.session.query(Person).filter($and(Person.name=='Chen', Person.sex=='male')).all()C.session.query(Person).filter(Person.name=='Chen' and Person.sex=='male').all()D.session.query(Person).filter(and_(Person.name=='Chen', Person.sex=='male')).all() -
如果用 log 表示将日志写到硬盘, lock与unlock 表示加锁与解锁,write 表示数据写到硬盘。数据库使用 redo 日志以及两阶段封锁并发控制协议。现有事务T,顺序修改数据A、B,那么下述哪个执行序列不会违反事务的原子性?( ) (1)
log(T, start); lock(A); log(T, A=5); unlock(A); lock(B); log(T, B=6); unlock(B); log(T, end); write(A); write(B);(2)log(T, start); lock (A); log (T, A=5); lock (B); unlock(A); log(T, B=6); unlock(B); log (T, end); write(A); write(B);(3)log (T, start); lock (A); log (T, A=5); lock (B); log(T, B=6); log(T, end); unlock (A); unlock (B); write(A); write(B);(4)log (T, start); lock (A); lock (B); log (T, A=5); log (T, B=6); write(A); write(B); log(T, end); unlock (A); unlock(B);A. 都不会 B. (2) (3) (4) C. (3) (4) D. (4) -
假设两张表A和B, Bno是B的主键且为两张表的连接属性,两张表在 Bno 上均创建了索引,A表的Price 属性均匀分布在区间 [1,200] 内。已知A表包含1000条元组,B表包含2000条元组,硬盘上每个页面可存储20条元组,内存可容纳5个页面。现有下述查询,请判断查询最有可能采用哪种连接算法?( )
select * from A, B where A.Bno = B.Bno and A.Price > 199A. 嵌套循环,A为内循环表 B. 嵌套循环,B为内循环表 C. 散列连接 D. 索引连接 -
假设学校的教务系统里有三张表:学生表(学号,姓名,生日,性别,学院)、课程表(课程号,课程名称,学分,主讲老师)、选课表(学号,课程号,学期,成绩)。带下划线的属性上都有创建单值索引。\(\sigma\) 代表选择操作, \(\prod\) 代表投影操作, \(⋈\) 代表自然连接操作。现要查找在课程“数学A”上没有及格的计算机学院的学生 (假设“数学A”课程很少出现不及格的现象), 请问以下哪个关系代数表达式的执行效率最高?( )
A. \(\prod_{学号,姓名}(\sigma_{学院='计算机'}(学生表) \Join \sigma_{成绩<60}(选课表) \Join \sigma_{课程名称='数学A'}(课程表) )\)
B. $\prod_{学号,姓名}(\sigma_{学院='计算机'}(学生表) \Join \sigma_{成绩<60}(选课表)) \Join \sigma_{课程名称='数学A'}(课程表) $
C. \(\prod_{学号,姓名}(\sigma_{学院='计算机'}(学生表 \Join \prod_{学号}(\sigma_{成绩<60}(选课表) \Join \sigma_{课程名称='数学A'}(课程表))))\)
D. \(\prod_{学号,姓名}(\sigma_{学院='计算机' \cap 成绩<60 \cap 课程名称='数学A'}(学生表 \Join 选课表 \Join 课程表) )\)
-
在两阶段提交的过程中,除了某个参与者(participant)因掉线无法回复协调者(coordinator),其余参与者均已回复协调者自己准备好了(prepared),那么以下哪种处理方式是合理的?( ) A. 协调者决定撤销事务并通知所有节点,待掉线的参与者恢复后也通知它撤销 B. 协调者决定提交事务并通知所有节点,待掉线的参与者恢复后也通知它提交 C. 协调者等待掉线的参与者重新上线,待再次询问其是否准备好后,再做决定 D. 协调者通知数据库系统关闭,待掉线的参与者恢复后再重新启动
-
Share-Nothing 架构的分布式数据库相对 Shared-Memory 和 Shared-Disk 架构的分布式数据库具备哪项优势? ( ) A. 通信开销更小 B. 实现难度更低 C. 更容易做到负载均衡 D. 部署成本更低
-
下面关于 Raft 协议的描述,错误的是( )。 A. Raft 是一种共识协议,用于构建自动恢复的高可用系统 B. 日志一旦被应用(apply),领导者(leader)即可删除该日志以节省存储空间 C. 在任意一个 Raft 任期(term)内,系统中最多会选出一个领导者(leader) D. 在一个 follower节点上,写到硬盘的日志不一定会被应用(apply)
-
关系数据库和文档数据库各自的优缺点不包括( )。 A. 关系代数的表达能力比文档 CRUD 操作更强 B. 对于对象的存储,文档数据库通常使用起来更方便 C. 关系模型比文档模型更易规范化 D. 对于两类实体a和b以及它们之间的一对多联系,关系模型不得不将a和b存放在两个不同的关系中,而文档模型则可以将a和b存放在同一类文档中
二、SQL查询(15分,每题5分)¶
假设一个数据库由以下几个表格构成
Create Table Movie /*影片表*/
(movieID INT Primary Key, /*影片代号*/
title VARCHAR(100), /*影片名称*/
releaseDate DATE, /*出品日期*/
revenue INT, /*票房收入*/
plot VARCHAR(1000)); /*影片介绍*/
Create Table Person /*人员表*/
(personID INT Primary Key, /*人员代号*/
name VARCHAR(100), /*姓名*/
birthday DATE, /*生日*/
bio VARCHAR(1000)); /*人员简介*/
Create Table Acting /*演员-影片关系*/
(actor INT, /*演员代号*/
movieID INT, /*影片代号*/
role CHAR(100), /*角色*/
FOREIGN KEY (actor) REFERENCES Person (personID),
FOREIGN KEY (movieID) REFERENCES Movie (movieID)
);
Create Table Directing /*导演-影片关系*/
(director INT, /*导演代号*/
movieID INT, /*影片代号*/
FOREIGN KEY (director) REFERENCES Person (personID),
FOREIGN KEY (movieID) REFERENCES Movie (movieID)
);
请写出以下任务的SQL查询语句(每个任务限使用一个SQL查询):
- 请查找:哪些电影的导演同时兼任了该电影的演员(给出电影的名字);
- 请查找:2000年以来,哪些演员平均每年参演了两部或两部以上的电影(给出演员名字);
- 请查找:哪些导演在2000年之后执导的所有电影的票房收入都超过了1亿(2000年之后未执导过任何电影的导演不计算在内)。
三、数据库设计(30分)¶
一个拍卖网站。用户可以将自己的物品在网站上进行竞价拍卖。拍卖前,用户需要填写物品的名称、型号、生产厂家、生产日期以及其他信息,从而对拍卖品进行完整的描述,并且设置起拍价和竞拍截止日期。一旦拍卖开始,其他用户就可以在截止日期之前对拍卖品进行报价。每次报价都需要高于拍卖品当前的最高报价,否则报价无效。每个用户可以多次报价同一个拍卖品。拍卖品的主人可以随时跟踪报价情况,如果发现有信誉不良的用户进行了报价,可以主动否决该用户的报价。否决后,次高报价晋升为最高报价,被否决的用户将无权再对该拍卖品进行报价。竞拍截止日期到达后,拍卖停止,最高出价的用户获得拍卖品的购买权。一周内,购买用户需要按照出价通过支付宝将钱付给拍卖品主人,否则将留下不良记录(系统会自动在支付宝查询转账信息)。付款完成后的一周内,如果主人没有将拍卖品寄出给购买用户,也会留下不良记录(假设系统可以自动查询快递信息,并且可以直接通过支付宝将钱扣回给购买用户)。
请完成该拍卖网站的数据库设计,画出ER图(10分),分别给出文档数据库的结构设计(7分)和关系数据库的结构设计(7分)(结构设计须给出创建索引的位置),最后在关系数据库设计的基础上给出竞拍过程的事务设计(6分)(给出事务开始和事务结束的位置以及事务对数据库的访问序列)。必要时,请用文字简要说明你的想法。
四、数据处理算法设计(10分)¶
请为关系数据库的“分组聚集”操作设计一套算法。比如类似下面的查询:
SQL
Select A, count(*), max(B)
From R
Group By A;
假设R很大,内存无法容纳。组的个数也可能很多,内存也可能无法容纳。请设计一套算法,尽可能降低分组聚集操作的I/O开销。用文字简要描述算法的过程。