跳转至

5.综合题

五、综合题(共20分,请将答案写在答题纸上)

  1. 已知:关系模式R(A, B,D,E, H),R上的函数依赖集F={A→D,AB→DE,E→H}, 请确定关系模式R的一个候选键,要求给出相关理由。(4分)

  2. 判断下列两个调度是否冲突等价,并说明理由。(3分)

\[ S_1=\{R_1(x)W_1(x)R_2(x)W_2(x)R_1(y)W_1(y)R_2(y)W_2(y)\}\\ S_2=\{R_1(x)W_1(x)R_1(y)W_1(y)R_2(x)W_2(x)R_2(y)W_2(y)\} \]
  1. 证明:R属于3NF则R属于2NF。(3分)

  2. 某关系数据包含如下关系模式:

图书 Book(编号Bno,书名Bname,出版社Press,定价Price)

读者Reader(编号Rno,姓名Rnamc,读者类别 Type)

读者类别信息RType(读者类别Type,允许借阅的图书数目Vmax)

借阅信息Borrow(图书编号Bno读者编号Rno,借出日期Ldate,归还日期Rdate)

其中带下划线的属性为主键,未归还的图书归还日期默认为空(NULL).

(1)用SQL语言表示下列操作:(6分) ①将如下图书信息添加到数据库中。 书名:Database,编号: b010,出版社: Elsvier,定价:99 ②读者R001于2013年5月19日归还了编号为b010的图书,请据此修改数据库的相关内容。 ③统计每个读者未归还的图书数量。

(2)设计相应的触发器实现如下借阅规则:(4分) 当读者实际借阅的图书数量超过该读者可借阅的图书数量时,拒绝借阅并给出提示信息。

prompt

请回答上面数据库问题,以json的格式给出答案结果和解析。

GPT生成的答案

  1. 候选键为AB。因为AB可以唯一确定R的每一条记录,而其他属性无法单独唯一确定一条记录。

  2. 两个调度是冲突等价的。因为两个调度的执行顺序不同,但是它们都保证了每个事务在读数据之前先获取了相应的锁,再进行读或写操作,避免了数据不一致的问题。

  3. 设R属于3NF,那么R中的每个非主属性都不传递依赖于R的任何候选键。假设R不属于2NF,则存在一个非主属性B依赖于R的一部分而不是整个候选键。因此,B必须依赖于另一个非主属性C,而C又传递依赖于候选键,这与R属于3NF的假设矛盾,因此R属于2NF。

  4. (1)

-- 添加图书信息
INSERT INTO Book (Bno, Bname, Press, Price)
VALUES ('b010', 'Database', 'Elsvier', 99);

-- 修改归还日期
UPDATE Borrow
SET Rdate = '2013-05-19'
WHERE Bno = 'b010' AND Rno = 'R001';

-- 统计每个读者未归还的图书数量
SELECT Borrow.Rno, COUNT(*) AS num
FROM Borrow
WHERE Rdate IS NULL
GROUP BY Borow.Rno;

解析: - 第一条SQL语句使用INSERT INTO语句向Book表中插入一条记录,表示新增一本书。 - 第二条SQL语句使用UPDATE语句修改Borow表中的一条记录,将归还日期Rdate修改为2013年5月19日。 - 第三条SQL语句使用SELECT语句统计每个读者未归还的图书数量,并按照读者编号分组。

(2)

CREATE TRIGGER check_borrow_num
BEFORE INSERT ON Borow
FOR EACH ROW
BEGIN
  DECLARE max_num INT;
  SELECT Vmax INTO max_num
  FROM RType
  WHERE Type = NEW.Type;
  SELECT COUNT(*) INTO @borrow_num
  FROM Borow
  WHERE Rno = NEW.Rno AND Rdate IS NULL;
  IF @borrow_num >= max_num THEN
    SIGNAL SQLSTATE '45000' 
    SET MESSAGE_TEXT = '该读者已借阅过最大数量的图书';
  END IF;
END;

解析: - 创建一个名为check_borrow_num的触发器,它在每次向Borow表中插入一条记录之前执行。 - 使用DECLARE语句定义一个max_num变量,用于存储该读者类别可借阅的最大图书数量。 - 使用SELECT语句查询RType表,获取该读者类别可借阅的最大图书数量,并将结果存储在max_num变量中。 - 使用SELECT语句查询Borow表,获取该读者已借阅但未归还的图书数量,并将结果存储在@borrow_num变量中。 - 如果@borrow_num超过了max_num,则使用SIGNAL语句产生一个错误,阻止该次插入操作。否则触发器执行完毕,继续执行插入操作。