112 地方特考三等 資訊處理類科 資料庫應用 考古題詳解
第 一 題25 分
某圖書館有下列已知的相關資訊:
- 每本「書」有一個 ISBN 號碼,這個號碼是唯一的。每本書也有書名、作者、出版社等資料需要記載下來。
- 每個「讀者」都有身分證號碼、姓名和手機號碼。有些讀者可能有二個或者更多個手機,其號碼都要記錄下來。若某讀者來到圖書館,從來沒有借書,那麼他的個人資料,圖書館就不會記錄下來。只有那些有借過書的,圖書館才會記錄他的個資。
- 圖書館有若干「館員」,每個館員有身分證號碼、姓名、隸屬組別。其中,隸屬組別指的是館員的工作性質。例如,有的是採購組,有的是編目組,有的是服務組等。每位館員只會隸屬於一個組。館員中,只有服務組的館員會參與處理讀者借書的程序。
- 所有的「借閱紀錄」都要存記下來,也就是某位讀者借出某一本書,經由某位館員處理的資訊要記錄下來。同時,也要記錄借出日期和歸還日期。讀者每次可借閱多本書。
- 此外,圖書館會不定期檢查圖書的「書籍狀態」。每次檢查若發現有狀況的書籍,則會把相關資訊記錄下來。這部分的資訊包括檢查日期和狀態說明,例如遺失、破損等。
根據上述說明,請使用實體-關係模型(Entity-Relationship model)為這些資料設計出正確的綱目(ER schema),繪出其綱目圖(schema diagram)。其中,關係(relationship)的基數比(cardinality ratio)請使用 、 等方式表示,並且請在圖中標示出參與限制條件(participation constraint)。
登入後即可作答並保存紀錄。
核心觀念
本題考查 ER 模型中的實體、屬性、鍵、關係、基數比與參與限制。設計時要依題意辨認:
- 實體:具有可辨識身分、需要獨立記錄的對象。
- 鍵屬性:能唯一識別實體的屬性。
- 基數比:限制關係中各實體可參與的數量,例如 、。
- 參與限制:實體參與某關係是否為必要條件;全參與通常以雙線表示,部分參與以單線表示。
- 多值屬性:同一實體可有多個值的屬性,例如讀者的手機號碼。
解題方法
先找出題目要求記錄的對象,再依「每筆資料如何識別」決定鍵;接著把借書和書籍狀況檢查分別建成關係,依每個對象可參與的次數判斷基數及參與限制。
1. 實體與屬性
- 書(Book):以 ISBN 為鍵,另記錄書名、作者、出版社。
- 讀者(Reader):以身分證號碼為鍵,另記錄姓名與手機號碼。手機號碼是多值屬性,圖中以雙橢圓表示。
- 館員(Librarian):以身分證號碼為鍵,另記錄姓名及隸屬組別。每位館員只屬於一組,因此「隸屬組別」是單值屬性。
- 借閱紀錄(Borrowing):每筆記錄表示某位讀者借出某一本書,由某位館員處理,並記錄借出日期、歸還日期。
- 書籍狀態檢查(Inspection):記錄書籍檢查日期及狀態說明。日期與說明屬於檢查關係的屬性。
題目只要求保存有借書的讀者資料,因此 Reader 不必設計成可獨立存在、未曾借書的讀者名冊;每位已記錄的讀者至少參與一筆借閱。
2. 借閱關係
以三元關係 借閱(Borrow) 連結 Reader、Book、Librarian,並將借出日期、歸還日期放在此關係上。
依題意:
- 每一筆借閱紀錄對應一位讀者、一本書及一位處理館員。
- 一位讀者可借閱多本書,也可有多筆借閱紀錄。
- 一本書可在不同時間被不同讀者借閱。
- 一位館員可處理多筆借閱紀錄。
因此,以「借閱紀錄」為關係記錄時,三個實體到借閱關係皆為 ;讀者、書、館員各自對應多筆借閱紀錄。Reader 與 Book 的借閱歷史若單獨觀察,則為 。
參與限制方面:
- Reader 對 Borrow 為全參與:圖書館只記錄有借過書的讀者。
- Book 對 Borrow 為部分參與:題目未說每本書都一定借出過。
- Librarian 對 Borrow 為部分參與:只有服務組館員處理借書,但題目未說每位服務組館員都一定處理過借閱。
借閱關係另有條件限制:參與 Borrow 的館員必須隸屬服務組。ER 圖可在圖旁註明此約束;基本 ER 基數與參與線本身無法完整表達這項組別條件。
3. 書籍狀態檢查關係
以 檢查(Inspection) 連結 Book,並記錄檢查日期、狀態說明。
第 二 題20 分
有一機票購買資料庫,含有以下的關連(relations):
旅客(護照號碼,姓名,電話,年齡)
航班(航班編號,航空公司,出發時間,抵達時間,出發地,目的地)
購票資訊(護照號碼,航班編號,座位,票價)
請用關連式代數(Relational Algebra)回答以下查詢(queries):
(一)所有從「臺北」出發,到達目的地是「洛杉磯」的直飛航班(亦即中間沒有停留任何其他機場),列出這些航班上的旅客護照號碼和姓名。
(二)針對從「臺北」出發的每一個航班,列出航班編號和此航班所有乘客的平均年齡。
登入後即可作答並保存紀錄。
核心觀念
本題考查關連式代數中的選擇、投影、連接,以及延伸關連式代數中的分組與聚合。
- 選擇 :依條件篩選資料列。
- 投影 :挑選所需欄位。
- 連接 :依共同屬性或指定條件,組合不同關連中的資料。
- 分組聚合:依群組欄位計算平均值;以 表示, 表示平均。
解題方法
令旅客、航班、購票資訊三個關連分別為 、、。
(一)列出臺北直飛洛杉磯航班上的旅客護照號碼與姓名
「直飛」在題目所給資料中的判斷方式,是航班的出發地為臺北,且目的地為洛杉磯;航班關連沒有中途停留欄位,因此依題意以這兩個欄位條件篩選。
先從航班關連挑出符合條件的航班:
再以航班編號連接購票資訊,取得這些航班的乘客護照號碼;最後以護照號碼連接旅客,取出姓名,並投影出題目要求的兩個欄位:
(二)列出臺北出發航班及其乘客平均年齡
先篩選出發地為臺北的航班,再依航班編號連接購票資訊,並依護照號碼連接旅客,以取得乘客年齡。最後依航班編號分組,對年齡計算平均值:
第 三 題20 分
承上題的資料庫綱目(schema),請用 SQL 回答下列查詢:
(一)我們想要查出有哪些旅客,他們從來沒有搭乘過「甲航空」的任何一個航班,列出這些旅客的護照號碼和姓名。
(二)我們想要找出有哪些航班的乘客人數低於 人(i.e., ),請列出這些航班所屬的航空公司、該航班的航班編號,以及搭乘該航班的人數(注意,是低於 人的)。
登入後即可作答並保存紀錄。
核心觀念
本題考查多表連接、集合差異,以及分組與條件篩選。
(一)「從來沒有搭乘過甲航空」表示該旅客不存在任何一筆搭乘甲航空航班的紀錄,可用 NOT EXISTS 表示。此寫法能直接表達「不存在符合條件的資料」。
(二)要計算每個航班的乘客人數,先依航空公司與航班編號分組,再以 HAVING 篩選人數少於 10 的航班。航班資料與搭乘紀錄使用 LEFT JOIN,才能將沒有乘客的航班也計入,其人數為 0。
解題方法
題目提到「承上題的資料庫綱目」,但本題未附綱目與欄位名稱。以下依題意假設有旅客、航空公司、航班及搭乘紀錄等資料表,並以 Passenger、Airline、Flight、Booking 作為表名;實際作答時應替換成前題的表名與欄位名稱。假設 Booking 每筆資料代表一位旅客搭乘一個航班。
(一)找出從未搭乘甲航空的旅客
SELECT p.PassportNo, p.Name
FROM Passenger AS p
WHERE NOT EXISTS (
SELECT 1
FROM Booking AS b
JOIN Flight AS f
ON f.AirlineID = b.AirlineID
AND f.FlightNo = b.FlightNo
JOIN Airline AS a
ON a.AirlineID = f.AirlineID
WHERE b.PassportNo = p.PassportNo
AND a.AirlineName = '甲航空'
);
子查詢逐一檢查目前旅客是否有搭乘紀錄,並透過航班連到航空公司。若找不到航空公司為「甲航空」的搭乘紀錄,NOT EXISTS 條件成立,該旅客便會出現在結果中。
若前題的航班編號只在航空公司內唯一,連接 Booking 與 Flight 時須同時使用航空公司代號及航班編號,避免不同航空公司的同號航班被誤認為同一航班。
(二)找出乘客人數少於 10 人的航班
第 四 題25 分
有 個交易(transactions)、、、、,在被執行時形成以下的程序(schedule)。假設該資料庫管理系統的恢復機制(recovery mechanism)使用的是延遲更新協定(deferred update protocol)。並且假設系統在查核點時(checkpoint),會使所有正在執行的交易工作暫停,將已經完成的交易(committed transaction)的結果,強迫儲存(force write)到二線儲存器(secondary storage)。
請說明這 個交易在系統當機後重新恢復時,各需要對這 個交易作什麼處置,並說明理由。
[start-transaction, ]
[read_item, , ]
[start-transaction, ]
[read_item, , ]
[write_item, , , ]
[start-transaction, ]
[read_item, , ]
[commit, ]
[write_item, , , ]
[checkpoint]
[read_item, , ]
[write_item, , , ]
[start-transaction, ]
[write_item, , , ]
[commit, ]
[read_item, , ]
[start-transaction, ]
[write_item, , , ]
[read_item, , ]
[commit, ]
[read_item, , ]
[write_item, , , ]
← system crash
登入後即可作答並保存紀錄。
核心觀念
本題考查**延遲更新協定(deferred update protocol)**下,當機後如何依交易日誌與查核點(checkpoint)進行復原。
延遲更新會先把交易的更新記錄在日誌中,交易提交後才將更新套用到資料庫。因此:
- 已提交的交易:需重做(REDO),確保其結果反映在資料庫中。
- 尚未提交的交易:不需復原其更新;在延遲更新下,未提交交易的更新尚未寫入資料庫,因此不需復原(UNDO)。
- 查核點的作用:題目指定查核點會暫停所有交易,並將已提交交易的結果強迫寫入二線儲存器。因此,查核點前已提交的交易不必再重做;查核點後已提交的交易則需重做。
解題方法
依序判斷每個交易的提交狀態,以及提交點相對於查核點的位置:
| 交易 | 執行情形 | 當機時狀態 | 復原處置 |
|---|---|---|---|
| 查核點前已提交 | 已提交且結果已強迫寫入 | 不需處置 | |
| 查核點後已提交 | 已提交 | REDO | |
| 查核點後已提交 | 已提交 | REDO | |
| 當機時尚未提交 | 未提交 | 不需處置 |
第 五 題10 分
試說明下列名詞之意涵:
(一)第二正規化(Second Normal Form)的定義。
(二)何謂 NoSQL。
登入後即可作答並保存紀錄。
核心觀念:第二正規化是關聯式資料庫的正規化規則,重點在消除非主屬性對複合候選鍵一部分的部分相依。
一個關聯模式符合第二正規化,須先符合第一正規化,且每一個非主屬性都完全相依於每一個候選鍵;換言之,非主屬性不得只相依於複合候選鍵中的一部分。主屬性是至少屬於一個候選鍵的屬性;非主屬性則是不屬於任何候選鍵的屬性。
若候選鍵只有單一屬性,便不存在對候選鍵「一部分」的相依,因此只要符合第一正規化,該關聯即符合第二正規化。
**解題方法:**先找出候選鍵,再檢查每個非主屬性的函數相依。若複合候選鍵的一部分已能決定某個非主屬性,便有部分相依,不符合第二正規化;可將資料拆成多個關聯,以消除該相依。
例如,選課資料的候選鍵為 ,且有函數相依 。學生姓名只相依於候選鍵的一部分「學號」,所以此關聯不符合第二正規化。可將學生資料拆出為「學生(學號, 學生姓名)」,選課資料則保留「選課(學號, 課程編號)」。
解題技巧:看到複合候選鍵時,特別檢查非主屬性是否只由鍵的一部分決定;單一屬性鍵則沒有部分相依問題。第二正規化處理的是部分相依,不可與第三正規化常檢查的傳遞相依混淆。