109 關務特考三等 資訊處理 資料庫應用 考古題詳解
第 一 題30 分
請為下列的流行傳染病採檢通報系統設計符合 BCNF 且考量 OO 的 EER data model。model 中請註明合適的 primary/foreign/candidate keys,資料表間的關聯亦請適當地說明彼此間的 maximum/minimum cardinality。
註:不需要用到的資料不必列入。
- 系統可以查詢各配合醫事機構的地址及開放時段,如星期一上午、星期五晚上……。
- 系統可以查詢某特定縣市某特定時段有開放採檢的醫事機構,包含醫事機構名稱、地址、電話。
- 系統可以查詢某特定日期某特定醫事機構,受檢男性人員的數量。
- 系統可以查詢某特定縣市所有確診人員的受檢日期時間及採檢的醫事單位。
- 系統可以查詢確診案例的受感染類型(如本土、境外、不明……)、感染源(如案編號……)、症狀、收治醫事機構、年齡、性別、縣市。
- 系統可以查詢受檢後未確診、需後續追蹤之相關人員的手機、居住地址(不等於戶籍地)及其需追蹤事由(如檢疫、隔離、自主健康管理……)。
- 系統可以查詢各縣市目前居家檢疫的數量。
登入後即可作答並保存紀錄。
核心觀念
本題重點是將需求敘述轉成符合 BCNF 的 EER 資料模型,並清楚標示鍵值、關聯及其最小/最大基數。題目不是選擇題,也沒有法條適用。
- BCNF(Boyce–Codd Normal Form):對每個非平凡函數相依 ,決定因素 都必須是超鍵。設計時應避免把機構地址、開放時段、檢驗結果、確診資訊等彼此獨立的事實塞在同一張表,造成更新異常。
- EER(Enhanced ER):在 ER 模型上加入子型別/超型別等概念,適合表達「人員」分為一般受檢者與確診者等不同角色。
- 候選鍵(candidate key):能唯一識別資料列、且不含多餘屬性的鍵。選定其中一個作為主鍵,其餘仍須維持唯一性。
- 最小/最大基數:以 表示參與關聯的數量範圍;例如 代表可不參與,也可參與多次。
解題方法
先從需求找出各自獨立的事實,再以實體與關聯拆表:
- 醫事機構及地址、電話屬於機構資料。
- 機構的開放時段是多值資料;星期與時段組成開放規則,不能直接重複塞在機構欄位。
- 每次採檢是一筆事件,須記錄受檢者、採檢機構與時間。
- 確診者才有感染類型、感染源、症狀及收治機構等確診資料,因此以「受檢者」為超型別、「確診者」為子型別。
- 未確診且需追蹤的人員可有一筆或多筆追蹤事由,追蹤資料應獨立於確診資料。
- 縣市是可供機構地址、人員居住地址查詢的共同資料,獨立建模,避免縣市名稱重複造成不一致。
EER 資料模型
以下以 ID 表示系統產生的識別碼;代碼欄位均須設定唯一性。
| 實體/資料表 | 屬性與鍵 |
|---|---|
縣市 County | county_id PK;county_name 候選鍵 |
醫事機構 Facility | facility_id PK;facility_code 候選鍵;facility_name、address、phone、county_id FK → County |
開放時段 OpenSlot | facility_id PK、FK → Facility;weekday PK;time_period PK。time_period 取上午、下午、晚上等時段代碼 |
受檢者 Person | person_id PK;person_code 候選鍵;gender、birth_date、mobile、residential_address、residential_county_id FK → County |
採檢紀錄 Test | test_id PK;person_id FK → Person;facility_id FK → Facility;tested_at、result |
確診者 Case | person_id PK、FK → Person;infection_type、infection_source_case_id FK → Case.person_id,可空值;treatment_facility_id FK → Facility,可空值 |
確診症狀 CaseSymptom | person_id PK、FK → Case;symptom_code PK |
追蹤紀錄 FollowUp | followup_id PK;person_id FK → Person;reason、start_date、end_date |
超型別與子型別:Person 為超型別,Case 為其子型別。每位確診者必須對應一位受檢者;一位受檢者至多對應一筆確診資料。若系統規則限定「確診」須有採檢紀錄,則 Case 中的每位人員也必須至少有一筆 Test 且結果為確診。
基數與參與條件
| 關聯 | 基數與說明 |
|---|---|
County — Facility | 一個縣市可有 個機構;每個機構屬於且必須屬於 個縣市。 |
第 二 題25 分
假設現有下列個人旅行資料紀錄的關聯式資料庫,請使用 SQL 回答相關的子問題。
註:假設每一航班每天最多只會飛行一次。
Person(personID, name, nationality, gender)
PK:personID
Flight(flightID, date, flightNation, takeoff, arrival)
PK:(flightID, date)
TravelRecord(personID, flightID, date, seat)
PK:(personID, flightID, date)
FK:personID ref. Person(personID)
(flightID, date) ref. Flight(flightID, date)
(一) 使用 DDL 定義所有的資料表,定義中應適當表示 primary key and foreign key。(10 分)
(二) 請依國籍及性別分類顯示,2020 年 5 月由 USA New York 出發所有班機的搭機人數。
註:結果需顯示國籍、性別及人數。(5 分)
(三) 請列出 2020 年 5 月搭機人數大於等於 100 的所有航班資訊,包括航班代號、所屬國籍、出發地、目的地、日期,結果並依日期由近至遠排序。(5 分)
(四) 新增 TW 籍、從 Taipei 飛往 Los Angeles 的航班 BR777,2020/07/01 開始開放訂位。首位訂位客人(TW 籍、代號 P000000007 的男性 Mark Lee)目前不在系統所記錄的 Person 資料表中,請為此位客人加入訂位相關資訊,包括航班、人員及座位 16A。
註:加入資料的順序不可以違反參考完整性。(5 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查關聯式資料庫的資料定義與查詢,包括主鍵、外鍵、資料完整性、分組統計、連接查詢,以及依參考完整性要求安排新增資料的順序。
Person 存放人員,Flight 以航班代號與日期共同識別一筆航班,TravelRecord 記錄人員搭乘哪一航班及座位。TravelRecord 的兩組外鍵分別參照 Person 與 Flight,所以新增搭乘紀錄前,對應的人員和航班都必須已存在。
解題方法
(一)以 DDL 定義資料表
Flight 的主鍵是 (flightID, date),而 TravelRecord 對應該主鍵的外鍵也必須使用相同欄位組合。以下以標準 SQL 型別表示欄位:
CREATE TABLE Person (
personID VARCHAR(9) NOT NULL,
name VARCHAR(100) NOT NULL,
nationality VARCHAR(3) NOT NULL,
gender VARCHAR(10) NOT NULL,
PRIMARY KEY (personID)
);
CREATE TABLE Flight (
flightID VARCHAR(10) NOT NULL,
date DATE NOT NULL,
flightNation VARCHAR(3) NOT NULL,
takeoff VARCHAR(100) NOT NULL,
arrival VARCHAR(100) NOT NULL,
PRIMARY KEY (flightID, date)
);
CREATE TABLE TravelRecord (
personID VARCHAR(9) NOT NULL,
flightID VARCHAR(10) NOT NULL,
date DATE NOT NULL,
seat VARCHAR(5) NOT NULL,
PRIMARY KEY (personID, flightID, date),
FOREIGN KEY (personID) REFERENCES Person (personID),
FOREIGN KEY (flightID, date) REFERENCES Flight (flightID, date)
);
題目未指定欄位長度及性別、國籍的資料型態,因此採用適合存放代碼與文字的 VARCHAR;各欄位長度可依實際系統規格調整。
(二)依國籍及性別統計指定航班的搭機人數
先由 TravelRecord 找出搭乘紀錄,再連接 Flight 篩選出 2020 年 5 月自 USA New York 起飛的班機,並連接 Person 取得國籍與性別。最後依國籍及性別分組計數:
SELECT p.nationality, p.gender, COUNT(*) AS passengerCount
FROM TravelRecord AS t
JOIN Person AS p
ON t.personID = p.personID
JOIN Flight AS f
ON t.flightID = f.flightID
AND t.date = f.date
WHERE f.date >= DATE '2020-05-01'
AND f.date < DATE '2020-06-01'
AND f.flightNation = 'USA'
AND f.takeoff = 'New York'
GROUP BY p.nationality, p.gender;
第 三 題25 分
請將下列專案工作指派表格資料,以符合 BCNF 的 RDB 資料表來表示,並將經 BCNF 正規化後的資料表,分別以 JSON 檔案格式來描述。
註:答案需包括 BCNF 正規化後的資料表(含內容)及每張資料表對應的 JSON 檔案格式內容。
| ProjectID | ProjectName | Budget | EmployeeID | EmployeeName | Gender | Mobile | StartDate | EndDate | |
|---|---|---|---|---|---|---|---|---|---|
| P001 | 0911111111 | [email protected] | 12/1/2019 | 1/15/2020 | |||||
| P001 | Health Care | 1000000 | E001 | Jacky Hsu | M | 0922222222 | [email protected] | 1/1/2020 | 6/30/2020 |
| P002 | 0911111111 | [email protected] | 1/1/2020 | 2/15/2020 | |||||
| P002 | Health Care | 1000000 | E002 | Lily Wu | F | 0933333333 | [email protected] | 2/1/2020 | 6/30/2020 |
| Mask Management | 200000 | E001 | Jacky Hsu | M | |||||
| Mask Management | 200000 | E003 | Cathy Su | F |
請完成下列事項:
- 將上述資料以符合 BCNF 的 RDB 資料表表示。
- 將 BCNF 正規化後的每張資料表,分別以 JSON 檔案格式描述。
- 答案需包括 BCNF 正規化後的資料表內容,以及每張資料表對應的 JSON 檔案格式內容。
登入後即可作答並保存紀錄。
核心觀念
本題考查函數相依、候選鍵與 BCNF 分解。關係模式符合 BCNF 的條件是:對每個非平凡函數相依 ,決定項 都必須是超鍵。
依表格欄位與資料意義,可採用下列函數相依:
ProjectID → ProjectName, Budget:專案代號決定專案名稱與預算。EmployeeID → EmployeeName, Gender:員工代號決定員工姓名與性別。EmployeeID → Mobile, Email:依題目重複出現的員工資料,採用員工代號識別員工聯絡資料。(ProjectID, EmployeeID) → StartDate, EndDate:員工被指派至某專案時,該筆指派決定起訖日期。
其中,專案代號與員工代號的組合可識別一筆指派;但 ProjectID、EmployeeID 各自都不能決定所有欄位,因此原表不符合 BCNF。
解題方法
以「專案資料、員工資料、專案指派資料」分解原表,讓每種事實只存放在對應資料表中:
- 專案名稱與預算只依專案代號決定,存入專案表。
- 員工姓名、性別與聯絡方式只依員工代號決定,存入員工表。
- 員工參與專案及其起訖日期,存入指派表。
分解後,每個資料表的決定項都是該表的鍵,符合 BCNF。
BCNF 正規化後的資料表
專案表 Project
主鍵:ProjectID
| ProjectID | ProjectName | Budget |
|---|---|---|
| P001 | Health Care | 1000000 |
| P002 | Health Care | 1000000 |
| (空值) | Mask Management | 200000 |
員工表 Employee
主鍵:EmployeeID
| EmployeeID | EmployeeName | Gender | Mobile | |
|---|---|---|---|---|
| E001 | Jacky Hsu | M | 0922222222 | [email protected] |
| E002 | Lily Wu | F | 0933333333 | [email protected] |
| E003 | Cathy Su | F | (空值) | (空值) |
| (空值) | (空值) | (空值) | 0911111111 | [email protected] |
指派表 Assignment
複合主鍵:(ProjectID, EmployeeID);ProjectID、EmployeeID 分別為外鍵。
| ProjectID | EmployeeID | StartDate | EndDate |
|---|---|---|---|
| P001 | (空值) | 2019-12-01 | 2020-01-15 |
| P001 | E001 | 2020-01-01 | 2020-06-30 |
| P002 | (空值) | 2020-01-01 | 2020-02-15 |
| P002 | E002 | 2020-02-01 | 2020-06-30 |
| (空值) | E001 | (空值) | (空值) |
| (空值) | E003 | (空值) | (空值) |
JSON 檔案格式
以下以 JSON 陣列表示各資料表資料列;每個物件代表一筆資料,空白欄位以 null 表示。日期統一採 YYYY-MM-DD 格式。
Project.json
第 四 題20 分
假設現有下列兩個 transactions 同步存取資料 、,請繪製表格說明,在不同時間標記點,如果讀寫動作被允許進行,系統對資料 、 所記錄的 (讀取的時間標記)及 (寫入的時間標記)為何?
如果讀寫動作不被允許進行,請說明原因及系統會作出的回應為何。
註:系統進行時序如下列左圖,解答表格參考下列右圖。(20 分)
| Time | T1 | T2 |
|---|---|---|
| 1 | Begin | |
| 2 | ||
| 3 | Read() | |
| 4 | ||
| 5 | Read() | Begin |
| 6 | ||
| 7 | Read() | |
| 8 | ||
| 9 | Write() | |
| 10 | Commit | |
| 11 | Write() | |
| 12 | Write() | |
| 13 | Commit |
時間標記:
,
解答表格格式:
| Time | Data | ||
|---|---|---|---|
| 1 | |||
| 2 |
登入後即可作答並保存紀錄。
核心觀念
本題考的是時間戳記排序法(Timestamp Ordering Protocol)。每個交易在開始時取得時間戳記 ;每筆資料 則記錄:
- :曾讀取 的交易中,最大的時間戳記。
- :曾寫入 的交易中,最大的時間戳記。
初始時,資料 、 的 與 都設為 。
讀取 的規則:
- 若 ,拒絕讀取並回復交易。
- 否則允許讀取,並更新 。
寫入 的規則:
- 若 或 ,拒絕寫入並回復交易。
- 否則允許寫入,並更新 。
解題方法
依照原頁左圖,時間順序為: 在時間 1 開始, 在時間 3 開始。時間戳記取交易開始時間,因此 、。逐一處理讀寫動作,並依規則更新資料的時間戳記。
| 時間 | 動作 | 的 | 的 | 結果 |
|---|---|---|---|---|
| 1 | Begin | |||
| 2 | Read() | 允許; | ||
| 3 | Read(); Begin | 讀取允許;。 |