原文筆記
本課程筆記資料庫系統 · 30 篇
Day 10 - 数据库70题:综合题 37-47
参考重点:教材第 6 章关系数据理论。原文件中综合题 34-36 缺失,保留源文件跳号。
37. 指出下列关系模式是第几范式,并说明理由。
默认所有关系都已满足 1NF,即属性值不可再分。
37.1 R(X, Y, Z),F={XY -> Z}
答案:BCNF。
讲解:候选码为 XY。唯一非平凡依赖 XY -> Z 的左部是超码,所以满足 BCNF。
37.2 R(X, Y, Z),F={Y -> Z, XZ -> Y}
答案:3NF,但不满足 BCNF。
讲解:候选码有 XY 和 XZ,所以 X、Y、Z 都是主属性。依赖 Y -> Z 中 Y 不是超码,违反 BCNF;但右部 Z 是主属性,所以满足 3NF。
37.3 R(X, Y, Z),F={X -> Y, Y -> X, X -> YZ}
答案:BCNF。
讲解:X+ = XYZ,所以 X 是候选码;Y -> X 且 X -> YZ,所以 Y+ = XYZ,Y 也是候选码。非平凡依赖左部都是超码,因此满足 BCNF。
37.4 R(X, Y, Z),F={X -> Y, X -> Z}
答案:BCNF。
讲解:X+ = XYZ,候选码为 X。所有非平凡依赖左部都是候选码 X,满足 BCNF。
37.5 R(X, Y, Z),F={XY -> Z}
答案:BCNF。
讲解:与 37.1 相同,候选码为 XY,决定因素是超码。
37.6 R(W, X, Y, Z),F={X -> Z, WX -> Y}
答案:1NF,不满足 2NF。
讲解:候选码为 WX,因为 WX+ = WXYZ。非主属性 Z 依赖于候选码的一部分 X,存在部分依赖,所以不满足 2NF。
38. 有关系模式 R(U, F),其中 U={A, B, C, D, E, P},F={A -> B, C -> P, E -> A, CE -> D}。求 R 的所有候选关键字。
答案:CE。
讲解:
- 没有出现在任何依赖右部的属性是
C和E,它们必须出现在每个候选码中。 (CE)+ = C E P A B D,可推出全部属性。C+ = CP,E+ = EAB,都不能推出全部属性。
因此唯一候选码是 CE。
39. 设有关系模式 R(C, T, S, N, G),函数依赖集 F={C -> T, CS -> G, S -> N}。求 R 的所有候选关键字。
答案:CS。
讲解:没有出现在右部的属性是 C 和 S,所以候选码必须包含它们。(CS)+ = C S T G N,可以推出全部属性;C+ = CT,S+ = SN 都不行。因此唯一候选码为 CS。
40. 设 R(U,F),U={A,B,C,D},F={A -> B, B -> C, D -> B},把 R 分解成 BCNF 模式集。
40.1 如果首先把 R 分解成 {ACD, BD},求 F 在这两个模式上的投影。
答案:
- 在
ACD上的投影:A -> C,D -> C。 - 在
BD上的投影:D -> B。
讲解:A -> C 由 A -> B -> C 推出;D -> C 由 D -> B -> C 推出。BD 上只保留涉及 B、D 的依赖,得到 D -> B。
40.2 ACD 和 BD 是 BCNF 吗?如果不是,进一步分解。
答案:
BD是 BCNF,因为D -> B中D是BD的候选码。ACD不是 BCNF。ACD的候选码为AD,而A -> C、D -> C的左部都不是超码。
一种 BCNF 分解为:
AC(A, C)AD(A, D)BD(B, D)
讲解:在 AC 中 A 是码,满足 BCNF;AD 上没有非平凡函数依赖,满足 BCNF;BD 已满足 BCNF。
41. 已知关系模式 R(CITY, ST, ZIP) 和函数依赖集 F={CITY, ST -> ZIP; ZIP -> CITY}。找出 R 的两个候选关键字。
答案:(CITY, ST) 和 (ZIP, ST)。
讲解:
(CITY, ST)+ = CITY, ST, ZIP。(ZIP, ST)+ = ZIP, ST, CITY。- 单独
ZIP只能推出CITY,不能推出ST;单独CITY或ST也不能推出全部属性。
因此两个候选码是 (CITY, ST) 与 (ZIP, ST)。
42. 教师管理数据库:属性为学号 S#、课程号 C#、成绩 G、任课教师 TN、教师所在系 D。
语义:
- 学号和课程分别与其代表的学生和课程一一对应。
- 一个学生所修的每门课程都有一个成绩。
- 每门课程只有一位任课教师,但每位教师可以有多门课程。
- 教师没有重名,每个教师只属于一个系。
42.1 确定函数依赖集。
答案:
(S#, C#) -> GC# -> TNTN -> D
由后两条还可推出 C# -> D。
42.2 若用所有属性组成一个模式,该关系模式为几范式?并说明异常。
答案:该模式为 1NF,不满足 2NF。
讲解:候选码是 (S#, C#)。因为 C# -> TN,非主属性 TN 部分依赖于组合码的一部分 C#,所以不满足 2NF;同时还有 C# -> TN -> D 的传递依赖。
异常示例:
- 插入异常:一门新课程已有任课教师但还没有学生选课时,无法单独插入课程-教师信息。
- 删除异常:删除某课程最后一条选课记录,可能丢失该课程任课教师及教师所在系信息。
- 修改异常:教师所在系重复出现在很多选课记录中,修改时容易不一致。
42.3 分解为依赖保持、无损连接的 3NF。
答案:
SC(S#, C#, G)CT(C#, TN)TD(TN, D)
讲解:SC 保存选课成绩,CT 保存课程教师,TD 保存教师所在系。三个原始依赖都被保留,并且可通过外键连接恢复原关系。
43. 给出关系 R(工程号, 材料号, 数量, 开工日期, 完工日期, 价格),判断范式并分解。
题面关系:
| 工程号 | 材料号 | 数量 | 开工日期 | 完工日期 | 价格 |
|---|---|---|---|---|---|
| P1 | I1 | 4 | 9805 | 9902 | 250 |
| P1 | I2 | 6 | 9805 | 9902 | 300 |
| P1 | I3 | 15 | 9805 | 9902 | 180 |
| P2 | I1 | 6 | 9811 | 9912 | 250 |
| P2 | I4 | 18 | 9811 | 9912 | 350 |
答案:
- 候选码:
(工程号, 材料号)。 - 函数依赖:
工程号 -> 开工日期, 完工日期材料号 -> 价格(工程号, 材料号) -> 数量
- 该关系为 1NF,不满足 2NF,因为存在非主属性对组合码的部分依赖。
分解为:
工程(工程号, 开工日期, 完工日期)材料(材料号, 价格)用料(工程号, 材料号, 数量)
讲解:分解后,工程日期只存一次,材料价格只存一次,用料数量存放在工程和材料的联系表中,可避免更新、插入、删除异常。
44. 判断给出的数据库集是否可直接作为关系数据库中的关系;若不行,改造为尽可能好的关系形式。
题面表:
| 系名 | 课程名 | 教师名 |
|---|---|---|
| 计算机系 | DB | 李军,刘强 |
| 机械系 | CAD | 金山,宋海 |
| 造船系 | CAM | 王华 |
| 自控系 | CTY | 张红,曾键 |
答案:
不能直接作为关系数据库中的关系,因为“教师名”列中有多个教师名,属性值不是原子的,违反 1NF。
一种改造方式:
| 系名 | 课程名 | 教师名 |
|---|---|---|
| 计算机系 | DB | 李军 |
| 计算机系 | DB | 刘强 |
| 机械系 | CAD | 金山 |
| 机械系 | CAD | 宋海 |
| 造船系 | CAM | 王华 |
| 自控系 | CTY | 张红 |
| 自控系 | CTY | 曾键 |
更规范的关系模式可设计为:
系(系名)课程(课程名, 系名)授课(课程名, 教师名)
讲解:先让每个属性值原子化,再根据业务语义继续分解,避免把多值属性塞进一个单元格。
45. 设关系 R(课程名, 教师名, 教师地址),判断范式、删除异常,并分解。
题面关系:
| 课程名 | 教师名 | 教师地址 |
|---|---|---|
| C1 | 马千里 | D1 |
| C2 | 于得水 | D1 |
| C3 | 余快 | D2 |
| C4 | 于得水 | D1 |
答案:
- 假定一门课程只有一位教师,教师只有一个地址。
- 函数依赖:
课程名 -> 教师名,教师名 -> 教师地址。 - 候选码:
课程名。 - 该关系满足 2NF,但不满足 3NF,因为存在传递依赖
课程名 -> 教师名 -> 教师地址。
删除异常:若删除于得水老师所教的最后一门课程,会同时丢失“于得水住址为 D1”的信息。
分解为:
课程教师(课程名, 教师名)教师地址(教师名, 教师地址)
讲解:分解后,即使某教师暂时没有课程,也可以在 教师地址 中保存教师基本信息。
46. 设关系 R(职工号, 职工名, 年龄, 性别, 单位号, 单位名),判断是否属于 3NF;若不是,规范化为 3NF。
题面关系:
| 职工号 | 职工名 | 年龄 | 性别 | 单位号 | 单位名 |
|---|---|---|---|---|---|
| E1 | ZHAO | 20 | F | D3 | CCC |
| E2 | QIAN | 25 | M | D1 | AAA |
| E3 | SEN | 38 | M | D3 | CCC |
| E3 | LI | 25 | F | D3 | CCC |
答案:
若按常规语义“职工号唯一标识职工”,题面数据中 E3 出现两次且姓名、年龄、性别不同,已经违反实体完整性。忽略该录入错误后,函数依赖可写为:
职工号 -> 职工名, 年龄, 性别, 单位号单位号 -> 单位名
候选码:职工号。
该关系不属于 3NF,属于 2NF。原因是候选码为单属性,不存在部分依赖;但存在传递依赖 职工号 -> 单位号 -> 单位名。
3NF 分解:
职工(职工号, 职工名, 年龄, 性别, 单位号)单位(单位号, 单位名)
讲解:单位名是单位的属性,不应在每个职工元组中重复保存。
47. 给出关系 SC(SNO, CNO, CTITLE, INAME, ILOCA, GRADE),判断范式和异常,并分解。
题面关系:
| SNO | CNO | CTITLE | INAME | ILOCA | GRADE |
|---|---|---|---|---|---|
| 80152 | C1 | OS | 王平 | D1 | 70 |
| 80153 | C2 | DB | 高升 | D2 | 85 |
| 80154 | C1 | OS | 王平 | D1 | 86 |
| 80154 | C3 | AI | 杨杨 | D3 | 72 |
| 80155 | C4 | CL | 高升 | D2 | 92 |
属性含义:SNO 学号,CNO 课程号,CTITLE 课程名,INAME 教师名,ILOCA 教师地址,GRADE 成绩。
答案:
- 候选码:
(SNO, CNO)。 - 函数依赖:
(SNO, CNO) -> GRADECNO -> CTITLE, INAMEINAME -> ILOCA
- 该关系为 1NF,不满足 2NF,因为
CTITLE、INAME、ILOCA部分依赖于组合码中的CNO。
异常:
- 插入异常:新开课程还没有学生选课时,无法保存课程名、教师和教师地址。
- 删除异常:删除某课程最后一条选课记录时,会丢失课程和教师信息。
- 修改异常:教师地址重复保存,修改时可能不一致。
分解到 2NF:
选课(SNO, CNO, GRADE)课程任课(CNO, CTITLE, INAME, ILOCA)
进一步分解到 3NF:
选课(SNO, CNO, GRADE)课程任课(CNO, CTITLE, INAME)教师(INAME, ILOCA)
讲解:只分解到 2NF 后,课程任课 中仍有 CNO -> INAME -> ILOCA 的传递依赖。继续分解到 3NF 才能更好消除教师地址冗余。