跳转至

2023-2024-1期末

一、单选题(共45分,每题3分)

  1. MongoDB 的组织体系中,哪一个不是必须的?( ) A. 数据库(database) B. 模式(schema) C. 文档集(collection) D. 文档(document)

  2. MongoDB的文档键值对中,值不能为:( ) A. 空值(null) B. 文档 C. 数组 D. 以上都可以

  3. 下列命令中,可以用于创建MongoDB数据库的是:( ) A. create B. show C. use D. db

  4. 如下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)可能

  5. 假设数据库表定义如下,哪个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;

  1. 以下关于关系代数的说法中,哪一项不正确?( ) A. 关系代数表达式的操作对象是关系 B. 关系代数表达式的运算结果是关系 C. 一个关系经过选择操作后,元组个数不会增加 D. 一个关系经过投影操作后,元组个数不会减少

  2. 以下哪项操作不能用ORM做到?( ) A. 添加数据 B. 删除数据 C. 修改数据类型 D. 修改数据

  3. 以下哪条代码可以在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()

  4. 如果用 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)

  5. 假设两张表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 > 199 A. 嵌套循环,A为内循环表 B. 嵌套循环,B为内循环表 C. 散列连接 D. 索引连接

  6. 假设学校的教务系统里有三张表:学生表(学号,姓名,生日,性别,学院)、课程表(课程号,课程名称,学分,主讲老师)、选课表(学号,课程号,学期,成绩)。带下划线的属性上都有创建单值索引。\(\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 课程表) )\)

  1. 在两阶段提交的过程中,除了某个参与者(participant)因掉线无法回复协调者(coordinator),其余参与者均已回复协调者自己准备好了(prepared),那么以下哪种处理方式是合理的?( ) A. 协调者决定撤销事务并通知所有节点,待掉线的参与者恢复后也通知它撤销 B. 协调者决定提交事务并通知所有节点,待掉线的参与者恢复后也通知它提交 C. 协调者等待掉线的参与者重新上线,待再次询问其是否准备好后,再做决定 D. 协调者通知数据库系统关闭,待掉线的参与者恢复后再重新启动

  2. Share-Nothing 架构的分布式数据库相对 Shared-Memory 和 Shared-Disk 架构的分布式数据库具备哪项优势? ( ) A. 通信开销更小 B. 实现难度更低 C. 更容易做到负载均衡 D. 部署成本更低

  3. 下面关于 Raft 协议的描述,错误的是( )。 A. Raft 是一种共识协议,用于构建自动恢复的高可用系统 B. 日志一旦被应用(apply),领导者(leader)即可删除该日志以节省存储空间 C. 在任意一个 Raft 任期(term)内,系统中最多会选出一个领导者(leader) D. 在一个 follower节点上,写到硬盘的日志不一定会被应用(apply)

  4. 关系数据库和文档数据库各自的优缺点不包括( )。 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查询):

  1. 请查找:哪些电影的导演同时兼任了该电影的演员(给出电影的名字);
  2. 请查找:2000年以来,哪些演员平均每年参演了两部或两部以上的电影(给出演员名字);
  3. 请查找:哪些导演在2000年之后执导的所有电影的票房收入都超过了1亿(2000年之后未执导过任何电影的导演不计算在内)。

三、数据库设计(30分)

一个拍卖网站。用户可以将自己的物品在网站上进行竞价拍卖。拍卖前,用户需要填写物品的名称、型号、生产厂家、生产日期以及其他信息,从而对拍卖品进行完整的描述,并且设置起拍价和竞拍截止日期。一旦拍卖开始,其他用户就可以在截止日期之前对拍卖品进行报价。每次报价都需要高于拍卖品当前的最高报价,否则报价无效。每个用户可以多次报价同一个拍卖品。拍卖品的主人可以随时跟踪报价情况,如果发现有信誉不良的用户进行了报价,可以主动否决该用户的报价。否决后,次高报价晋升为最高报价,被否决的用户将无权再对该拍卖品进行报价。竞拍截止日期到达后,拍卖停止,最高出价的用户获得拍卖品的购买权。一周内,购买用户需要按照出价通过支付宝将钱付给拍卖品主人,否则将留下不良记录(系统会自动在支付宝查询转账信息)。付款完成后的一周内,如果主人没有将拍卖品寄出给购买用户,也会留下不良记录(假设系统可以自动查询快递信息,并且可以直接通过支付宝将钱扣回给购买用户)。

请完成该拍卖网站的数据库设计,画出ER图(10分),分别给出文档数据库的结构设计(7分)和关系数据库的结构设计(7分)(结构设计须给出创建索引的位置),最后在关系数据库设计的基础上给出竞拍过程的事务设计(6分)(给出事务开始和事务结束的位置以及事务对数据库的访问序列)。必要时,请用文字简要说明你的想法。

四、数据处理算法设计(10分)

请为关系数据库的“分组聚集”操作设计一套算法。比如类似下面的查询:

SQL

Select A, count(*), max(B)
From R
Group By A;

假设R很大,内存无法容纳。组的个数也可能很多,内存也可能无法容纳。请设计一套算法,尽可能降低分组聚集操作的I/O开销。用文字简要描述算法的过程。