跳转至

2022-2023-1期末

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

  1. 假设 posts 文档集包含一个名为 tags 的数组字段,用于记录用户输入的标签。
{
  "_id": 1,
  "tags": ["tutorial", "fun", "learning"],
  "post_text": "This is my first post",
  //other elements of document
}

那么执行 db.posts.find({'tags.0': "tutorial"}) 会返回( )

A. tags数组包含tutorial 的所有文档。

B. 在 tags 数组中只包含唯一一个元素( 即tutorial )的所有文档。

C. tags数组的第一个元素是 tutorial 的所有文档。

D. 包含0个或更多名为 tutorial 标签的所有文档。

  1. 下面关于 MongoDB 中的 _id字段说法不正确的是( )

A. 用户必须为每个新插入的文档定义 _id 字段。

B. 每个文档都需要 _id 字段。

C. _id 字段必须唯一。

D. 如果插入的文档中省略了 _id 字段,则会自动包含 _id 字段并用 ObjectId 填充。

  1. 以下哪一个关于 MongoDB 索引的陈述是合理的?( )

A. 索引用于加快用户的查询速度。提高查询性能的最简单方法之一是对所有属性创建索引。

B. 当用户在 MongoDB 中创建一个文档集后,生成的文档集默认是不存在索引的。

C. 索引是提高性能的数据结构,支持高效的等值和范围查询操作,并可以返回排序结果。

D. 使用索引时,MongoDB 读取集合中的每个文档,以检查其是否满足查询条件。

  1. 已知某校数据库中包含如下的表数据:

学生表 student(sno, sname, birthday, gender)

课程表 course(cid, cname)

成绩表 grade(sno, cid, mark)

查询至少有一门课程与 sno=1909 的学生选择的课程相同的学生的学号和姓名,下列SQL语句中正确的是( )

A.

SELECT DISTINCT a.sno, a.sname
FROM student a, grade b
WHERE a.sno=1909
and a.sno=b.sno
and b.cid IN (SELECT cid FROM grade WHERE sno=1909)

B.

SELECT DISTINCT a.sno, a.sname
FROM student a, grade b
WHERE a.sno<>1909
and a.sno=b.sno
and b.cid IN (SELECT cid FROM grade WHERE sno=1909)

C.

SELECT DISTINCT a.sno, a.sname
FROM student a, grade b
WHERE a.sno<>1909
and a.sno=b.sno
and b.cid NOT IN (SELECT cid FROM grade WHERE sno=1909)

D.

SELECT DISTINCT a.sno, a.sname
FROM student a, grade b
WHERE a.sno=1909
and a.sno=b.sno
and b.cid IN (SELECT cid FROM grade WHERE sno<>1909)
  1. 数据库中有表 student_table(id, name, birth, sex)和 score_table(stu_id, subject_name, score),查询每个学生的分数最高的学科以及对应分数、学生明细记录,如下SQL正确的是( )

A.

select t3.*, t2.subject_name, t2.score
from (
    select stu_id, max(score) as c1
    from score_table
    group by stu_id
    order by c1 desc
    limit 1
) t1
inner join (
    select * from score_table
) t2 on t1.stu_id = t2.stu_id and t1.c1 = t2.score
inner join student_table t3 on t1.stu_id = t3.id;

B.

select t3.*, t2.subject_name, t2.score
from (
    select stu_id, max(score) as c1
    from score_table
    group by stu_id
) t1
inner join (
    select * from score_table
) t2 on t1.stu_id = t2.stu_id
inner join student_table t3 on t1.stu_id = t3.id;

C.

select t3.*, t2.subject_name, t2.score
from (
    select stu_id, max(score) as c1
    from score_table
    group by stu_id
) t1
inner join (
    select * from score_table
) t2 on t1.c1 = t2.score
inner join student_table t3 on t1.stu_id = t3.id;

D.

select t3.*, t2.subject_name, t2.score
from (
    select stu_id, max(score) as c1
    from score_table
    group by stu_id
) t1
inner join (
    select * from score_table
) t2 on t1.stu_id = t2.stu_id and t1.c1 = t2.score
inner join student_table t3 on t1.stu_id = t3.id;
  1. 关系表 student_table(id, name, birth, sex)中插入如下记录:
('1003','', '2000-01-01','男');
('1004','张三','2000-08-06','男');
('1005', NULL, '2001-12-01','女');
('1006','张三','2000-08-06','女');
('1007','王五','2001-12-01','男');
('1008','李四', NULL, '女');
('1009','李四', NULL, '男');
('1010','李四','2001-12-01', '女');

执行

select t1.*, t2.*
from (select * from student_table where sex = '男') t1
inner join
(select * from student_table where sex = '女') t2
on t1.birth = t2.birth and t1.name = t2.name;

的结果行数是( )。

A. 4

B. 3

C. 2

D. 1

  1. 如果用 log 表示将日志写到硬盘,lock与unlock 表示加锁与解锁,write 表示数据写入到硬盘。数据库使用 redo 日志以及两阶段封锁并发控制协议。现有事务T,顺序修改数据A、B,那么下述哪个执行序列不会违反事务的原子性?( )

A. 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)

B. log(T,start); lock(A); log(T,A=5); write(A); lock(B); log(T,B=6); write(B); unlock(A); unlock(B); log(T,end)

C. 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)

D. log(T,start); lock(A); lock(B); log(T,A=5); log(T,B=6); write(A); write(B); unlock(A); unlock(B); log(T,end)

  1. 假设两张表A和B,Bno是B的主键且为两张表的连接属性,两张表在Bno上均创建了索引,A表的 Price 属性均匀分布在区间 [1,100] 内。已知A表包含1000条元组,B表包含2000条元组,硬盘上每个页面可存储20条元组,内存可容纳5个页面。现有下述查询,请判断查询最有可能采用哪种连接算法?( )
select *
from A, B
where A.Bno = B.Bno and A.Price > 99;

A. 嵌套循环,A为内循环表

B. 嵌套循环,B为外循环表

C. 散列连接

D. 索引连接

  1. 在两阶段提交的过程中,除了某个参与者(participant)因掉线无法回复协调者(coordinator),其余参与者均已回复协调者自己准备好了(prepared),那么以下哪种处理方式是合理的?( )

A. 协调者决定撤销事务并通知所有节点,待掉线的参与者恢复后也通知它撤销 B. 协调者决定提交事务并通知所有节点,待掉线的参与者恢复后也通知它提交 C. 协调者等待掉线的参与者重新上线,待再次询问其是否准备好后,再做决定 D. 协调者通知数据库系统关闭,待掉线的参与者恢复后再重新启动

  1. Share-Nothing 架构的分布式数据库相对 Shared-Memory 和 Shared-Disk 架构的分布式数据库具备哪项优势?( )

A. 性能更好 B. 系统的实现难度更低 C. 系统更容易横向扩展 D. 部署成本更低

  1. 关于CAP 理论的正确说法是( )

A. 现有的数据库系统可以分为CP、AP、CA三种类型 B. 传统的关系数据库(比如Oracle)是典型的CP型系统 C. MongoDB 是典型的AP型系统 D. 当P发生时,MongoDB允许我们在C和A之间做权衡

  1. 一个 shared-nothing 的分布式数据库系统采用了高可用机制,即系统的每一个数据分区都有三份拷贝,三份拷贝分散在三个节点上并利用 Raft 协议实现同步。假设该分布式数据库可以执行分布式事务,并利用两阶段提交协议保证事务的原子性。那么,对于任意一个成功提交的事务,事务完成的瞬间发生在以下的哪一个时刻?( )

A. 协调者(coordinator)决定commit,并将 commit 日志写到自己硬盘的时刻。 B. 协调者(coordinator)决定 commit,并将 commit日志在“多数派拷贝”落盘的时刻。 C. 所有参与者(participants)都收到commit 指令,并且都将 commit 日志写到各自硬盘的时刻。 D. 所有参与者(participants)都收到commit指令,并且都将 commit日志在各自的“多数派拷贝”落盘的时刻。

  1. 下面关于 Raft 协议的描述,错误的是( )

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

  1. 关系数据库和文档数据库各自的优缺点不包括( )

A. 关系代数的表达能力比文档 CRUD 操作更强 B. 对于对象的存储,文档数据库通常使用起来更方便 C. 关系模型比文档模型更易规范化 D. 对于两类实体a和b以及它们之间的一对多联系,关系模型不得不将a和b存放在两个不同的关系中,而文档模型则可以将a和b存放在同一类文档中

  1. 以下关于 OLTP 和 OLAP 的区别,描述不正确的是( )

A. OLTP 对数据一致性有更高要求 B. OLAP 处理的数据量通常更大 C. OLTP 主要处理状态数据,而OLAP 主要处理历史数据 D. OLAP 对响应延迟的要求通常比OLTP更高

二、SQL查询(14分,每题7分)

假设一个数据库由以下几个表格构成:

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年以后参演了至少10部电影且至少有2部电影的票房超过了1亿(请输出这些演员的名字)。

三、数据库设计(26分)

请利用 ER 图实现以下场景的关系数据库设计,并完成事务处理设计:

一个出租充电宝的应用,在上海投放了1万个充电宝出租站,每个出租站配置了20个充电宝。该应用包含以下流程:

(1) 用户实名登录,只有登陆后用户才能使用该应用的服务;在登录过程中,用户提供手机号,然后该应用会调用支付宝的实名认证服务对用户进行认证。

(2) 登录的用户在出租站向应用提出租借请求;应用选择该出租站被最早归还的那个充电宝,并指挥出租站弹出该充电宝;如果该出租站的所有充电宝都已经租借出去了,则拒绝用户的请求;充电宝弹出后,如果用户没有及时领取(1分钟之内),出租站将自动收回充电宝,并通知应用撤销这一次租借操作。

(3) 用户在出租站归还充电宝;归还时,用户无需登录;出租站回收充电宝后,立即向应用反馈回收信息,应用查看该充电宝的租借时间,计算租借费用(每小时5元),并向支付宝提交费用支付请求。如果用户是异地归还(即租借的出租站和归还的出租站不同),则需要额外收取10元的运输费;如果支付成功,则完成本次租借,如果支付不成功(比如用户在支付宝上的余额不足),则生成欠费记录,后续转交客服处理。

注:出租站只能根据应用或用户的指令完成弹出和回收某个充电宝的操作;出租站本身并不记录任何数据。

要求:画出ER图,给出所有关系表设计,以及租借和归还两个流程的事务设计(写出这两个流程访问数据库的程序概要,并标明事务开始、提交或回滚的位置),必要时,用文字简要解释这两个流程。(ER 图设计10分,关系表设计6分,事务设计10分)

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

有两张表 R(r_key, r_x)和 S(s_key, s_x)。其中,属性 r_key 和 s_key 分别是主键,属性 r_x 和 s_x 都是实数型,取值范围都在0到1000之间。有以下查询:

Select *
From R, S
Where abs(r_x - s_x) < 10; /* 两个属性的距离小于10,abs是绝对值*/

假设R和S都很大,内存无法容纳。请为以上查询设计一套算法,尽可能降低查询执行的 I/O 开销。