跳转至

2024-2025-1期末

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

  1. MongoDB 的组织体系中,哪一个不是必须的?( )

A. 数据库(database)

B. 模式(schema)

C. 文档集(collection)

D. 文档(document)

  1. 使用 python 操作 MongoDB数据库时,如果想要查询“年龄在21和25之间的用户名字”的记录(不包括21和25岁,只显示名字),可以使用以下哪个查询条件?( )

A. find({'age': {'$gte':21, '$gte':25}})

B. find({'age': {'$gt': 21, '$lt':25}})

C. find({'age': {'$gte':21, '$lte':25}}, {'_id' : 0, 'name':1})

D. find({'age': {'$gt':21, '$lt':25}}, {'_id' : 0, 'name': 1})

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

  1. 假设数据库表定义如下,哪个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. 在PostgreSQL中,更新 trans 表中 id=1 的数据,将 data 字段值设为2,应使用的命令是?( )

A. UPDATE trans SET data=2 WHERE id=1;

B. MODIFY trans SET data=2 WHERE id=1;

C. CHANGE trans SET data=2 WHERE id=1;

D. ALTER trans SET data=2 WHERE id=1;

  1. 以下关于“关系”或“关系代数”的说法,哪一个有误?( )

A. 一个关系是一个集合

B. 在一个关系上进行“选择”操作后,其结果仍然是一个关系

C. “投影”操作是将关系中的部分属性和其对应的列删除掉

D. 不是任意两个关系上都可以执行“并”或“交”的集合操作

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

A. 关系代数的表达能力比文档 CRUD 操作更强

B. 对于对象的存储,文档数据库通常使用起来更方便

C. 关系数据比文档数据中的冗余更少

D. 对于两类实体a和b以及它们之间的一对多联系,关系模型不得不将a和b存放在两个不同的关系中,而文档模型则可以将a和b存放在同一类文档中

  1. 以下查询中的X取哪个值是不合法的?( )
Select X
From Product, Order
Where Product.ID = Order.productID
And Order.quantity > 100
Group By Product.ID;

A. Product.ID

B. Order.quantity

C. Max(Order.quantity)

D. Count(Product.ID)

  1. 哪个属性上的索引不可能对以下查询起到加速作用?( )

Select Distinct R2.B

From R1 Join R2 On R1.C = R2.C

Where R1.A > 100

A. R1.A

B. R2.B

C. R1.C

D. R2.C

  1. 假设有一个简单的连接查询 Select * From R1 Join R2 On R1.A = R2.B。在以下哪种情况下,索引连接算法比哈希连接算法可以更高效?( )

    A. R1和R2 都比较大,R1.A和R2.B上都创建有索引

    B. R1和R2 都比较大,R1.A或R2.B上只创建有一个索引

    C. R1很大,R2很小,R2.B上创建有一个索引

    D. R1很大,R2很小,R1.A上创建有一个索引

  2. 某数据库系统通过 undo 日志实现事务处理的原子性和持久性,并通过两阶段锁实现隔离性。当某个数据X被事务T更新之前,一项日志记录会被记录到硬盘上,a记录了X被更新前的取值。假设系统发生了故障,记录在硬盘上的最后一段日志为以下的哪一段是可能的?( )

    A. , , , ,

    B. , , , ,

    C. , , , ,

    D. , , , ,

  3. 在ER图中有两个实体类A和B,实体类之间有一个联系。已知A和B的数据分别存放在 Ra和Rb 两个关系表中,那么A和B的联系应该存放在哪里?( )

    A. 必须使用第三张关系表Rc存放两者的联系

    B. 当A和B之间为1:n的联系时,可以将联系存放在 Ra 中

    C. 当A和B之间为1:n的联系时,可以将联系存放在 Rb中

    D. 当A和B之间为n:m的联系时,可以将联系存放在 Ra 中

  4. 假设学校的教务系统里有三张表:学生表(学号,姓名,生日,性别,学院)、课程表(课程号,课程名称,学分,主讲老师)、选课表(学号,课程号,学期,成绩)。带下划线的属性上都有创建单值索引。\(\sigma\) 代表选择操作, \(\prod\) 代表投影操作, \(⋈\) 代表自然连接操作。现要查找“张三”在哪些课程上得了满分(假设满分是极少出现的情况),请问以下哪个关系代数表达式的执行效率最高?( )

    A. \(\prod_{课程名称}(\sigma_{姓名='张三'}(学生表) \Join \sigma_{成绩=100}(选课表) \Join 课程表 )\)

    B.\(\prod_{课程名称}(\sigma_{成绩=100}(\sigma_{姓名='张三'}(学生表) \Join 选课表) \Join 课程表 )\)

    C.\(\prod_{课程名称}(\sigma_{姓名='张三'}(学生表 \Join \sigma_{成绩=100}(选课表)) \Join 课程表 )\)

    D.\(\prod_{课程名称}(\sigma_{姓名='张三' \cap 成绩=100}(学生表 \Join 选课表 \Join 课程表 ))\)

  5. 以下选项中,哪些是有利于事务处理的执行效率的?( )

    ①缩减事务的长度; ②将数据更新操作推迟到事务最后执行; ③降低事务处理的隔离级别; ④用一块单独的硬盘记录日志顺序写

    A. 1, 2, 3

    B. 1, 3, 4

    C. 2, 3, 4

    D. 以上都是

  6. 以下关于数据库设计中的冗余的说法,哪个是不合理的?( )

    A. 冗余可以有助于提升数据库的访问效率

    B. 冗余有可能降低数据库的访问效率

    C. 冗余对于数据库的更新操作是不利的

    D. 数据库设计应该尽量避免冗余

二、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. 请查找:Tom Hanks 的哪部电影的票房收入最高(给出电影的名称);
  2. 请查找:哪些导演在2024年执导了三部或三部以上的电影(给出导演的名字);
  3. 请查找:哪些导演执导的所有电影票房收入都超过了1亿(给出导演的名字)。

三、数据库设计(30分)

有一款拼车应用。该应用的用户可以提交自己的行程并发起拼车服务,即在出发前半小时以上提供自己行程信息,包括起点地址、终点地址、出发时间以及车上的空闲座位数。任意用户都可以提交拼车请求,提供自己希望出发的时间段、起点地址、终点地址和乘车人数。应用会调用一个算法(无需考虑此算法是如何访问数据库的)帮他找到所有满足以下条件的行程:(1)行程的出发时间在请求的时间段内;(2)行程的出发地址在请求的出发地址的5公里距离之内;(3)行程会路过请求的终点;(4)行程当前的空闲座位数不少于请求的乘车人数。即使没有行程满足用户的需求,用户的请求也会被暂存下来,以便他随时查看是否有新的行程满足他的需求。

一旦有满足用户请求的行程,用户可以选择一个合适的行程并发起拼车申请,一旦申请发出,该行程相应的空闲座位即被占据,暂时无法再租借给其他人。该行程的发起人接到申请后可以在一小时内接受或拒绝申请。一小时内无反应,申请就被自动接受。(注意:在坐得下的前提下,一辆车可以被多个人拼。)一旦申请被接受就无法再反悔,系统会调用支付宝自动进行扣款转账(扣款转账功能由支付宝提供,不在本设计的考虑范围内)。之后,行程的发起人应按照约定前往约定地址接送拼车申请人。行程结束后,申请人可以根据实际情况对发起人进行评价和打分。如果发起人没有履行约定,拼车申请人可以提出投诉,并由工作人员进行核实和仲裁。

要求:请完成该拼车应用的数据库设计,画出ER图(10分),分别给出文档数据库的结构设计(7分)和关系数据库的结构设计(7分)(结构设计须给出创建索引的位置),最后在关系数据库设计的基础上设计“发起拼车申请”的事务处理流程(6分)(给出事务开始和事务结束的位置以及事务对数据库的访问序列)。必要时,请用文字简要说明你的想法。

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

对于表R和表S之间的等值连接操作 \(R \Join S\) ,假设连接条件为 R.a=S.b (a和b分别为R和S的属性),并且a和b上都建有索引。请简述:以下三种连接算法中的每一种算法,分别在R、S、a、b满足什么条件时,其执行效率最高?(假设I/O是性能瓶颈。通常情况下,执行效率和I/O代价成反比)

(1) 嵌套循环;

(2) 散列连接;

(3) 索引连接。