108 調查局特考三等 資訊科學組 資料庫應用 考古題詳解
第 一 題30 分
在關聯式資料庫(relational database)軟體所提供的功能中,有些定義可以讓系統協助檢查資料的一致性(consistency),有些定義則可以提升查詢處理的效率。
假設要在資料庫系統中建立兩個表格,其中:
- 學生表格用以記錄每個學生的基本資料,包含學號(ID)、姓名(name)和主修系別(dname)。
- 系所表格用以記錄每個系的基本資料,包含系名(dname)、系館名稱(building)和系主任(chair)。
此二表格的定義如下:
student (ID, name, dname)
department (dname, building, chair)
(一) 請問你贊同把屬性 ID 定義為 student 表格的主鍵(primary key)嗎?請詳述你贊同或不贊同的原因。(10 分)
(二) 假設屬性 dname 已經被定義為 department 表格的主鍵,你贊同把 student 表格中的屬性 dname 定義為外來鍵(foreign key)參照到 department 表格嗎?請詳述你贊同或不贊同的原因。(10 分)
(三) 你贊同把屬性 ID 定義為索引(index)嗎?請說明你贊同或不贊同的原因。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查三種資料庫定義的用途與差異:
- 主鍵(primary key):唯一識別資料列,不可重複,也不可為
NULL。 - 外來鍵(foreign key):限制欄位值必須符合被參照表格的鍵值,以維持參照完整性;在本題中,學生的系名必須對應到系所表中已存在的系名。
- 索引(index):協助資料庫快速尋找資料列,通常能提升查詢效率;索引不等同於主鍵,也不會自行保證欄位值唯一,除非建立的是唯一索引。
解題方法
先區分題目描述的需求:主鍵用來判斷資料列是否有唯一識別值;外來鍵用來檢查跨表關聯是否一致;索引則用來加速查詢。再依欄位在資料模型中的角色判斷是否適合設定。
(一)將 student.ID 定義為主鍵
贊同。
學號 ID 用來識別每一位學生,適合作為學生表的主鍵。主鍵要求每位學生的 ID 都唯一且不為空,因此可避免兩筆學生資料具有相同學號,也可避免學生資料沒有識別值。
此設定的前提是:系統確實保證每位學生有唯一學號,且不會以 NULL 表示學號缺漏。若學號在資料制度中可能重複或缺漏,就不符合主鍵條件,必須另選能唯一識別學生的欄位或組合鍵。
(二)將 student.dname 定義為外來鍵
贊同。
題目已將 department.dname 定義為系所表的主鍵,因此可將 student.dname 設為外來鍵,參照 department.dname。
第 二 題30 分
假設資料庫系統中定義了老師的授課資料,其中 instructor 表格定義了老師的教職員編號(IID)、姓名(name)和系別(dname)等三個屬性,而 teach 表格定義了老師的教職員編號(IID)、所教授的課程代碼(CID)和授課學年度。兩個表格如下所列。注意所有屬性皆為字串型態,且底線標示了各表格的主鍵(primary key):
instructor (IID, name, dname)
teach (IID, CID, year)
(一) 請寫出 SQL 查詢句(query statement),列出每個系的系名以及該系的授課老師個數。(10 分)
(二) 請寫出 SQL 查詢句,列出名為「張三」的老師,於 106 學年度所有開設的課程代碼。(10 分)
(三) 請問以下 SQL 查詢句是為了找出什麼樣的資料?請用中文詳述其資料語意(semantics):(10 分)
SELECT IID, CID FROM teach WHERE year = '107' AND IID IN ( SELECT IID FROM instructor WHERE dname = '資工' );
登入後即可作答並保存紀錄。
核心觀念
本題考查 SQL 的分組彙總、表格連結,以及子查詢篩選。
GROUP BY:依指定欄位分組,通常搭配COUNT等彙總函數。JOIN:依兩表共同的欄位連結資料;本題以IID對應老師。IN (subquery):判斷某欄位的值是否屬於子查詢所回傳的集合。- 字串型態的欄位值須以單引號表示,例如
'106'、'張三'。
解題方法
(一)列出每個系的系名與授課老師個數
先由 instructor 取得老師所屬系別,再依 dname 分組並計算各組老師筆數。由於題目問的是老師個數,計數對象是 instructor 的資料列。
SELECT dname, COUNT(*) AS teacher_count
FROM instructor
GROUP BY dname;
此查詢以每位老師在 instructor 表中的一筆資料計數。若同一位老師可能在表中重複出現,才需改用 COUNT(DISTINCT IID);依題目所述的主鍵設定,IID 唯一,因此 COUNT(*) 即可。
(二)列出「張三」老師於 106 學年度開設的所有課程代碼
先從 instructor 找出姓名為「張三」的老師編號,再與 teach 依 IID 連結,並篩選授課學年度為 '106' 的紀錄。題目要求課程代碼,因此只輸出 CID。
第 三 題20 分
假設我們要建立一個資料庫系統,以管理本單位內員工使用交通工具的狀況。系統需求與限制如下所列:
- 每台交通工具都要記錄其牌照號碼和購買年份。
- 每個員工都要記錄其員工編號和職稱。
- 每次某個員工使用某台交通工具後,都要記錄其使用的日期。
- 員工只要有需求皆可以使用單位內的交通工具,並沒有限定使用的次數。
- 交通工具分為汽車和摩托車兩種,汽車要記錄其可承載之乘客數,摩托車要記錄其是否為電動車。
請根據以上描述,利用實體關係模式(Entity-Relationship model)進行設計,並畫出對應的實體關係圖(ER-diagram)。請注意圖中必須標明實體集合、關係集合、屬性、主鍵和對應數量限制等,也可使用擴充實體關係模式(Extended ER model, EER)的表示法。(20 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查 ER 模式中的實體集合、關係集合、屬性、主鍵、數量限制,以及 EER 模式中的特化/一般化。
- 員工與交通工具是兩個實體集合,分別以員工編號、牌照號碼作為主鍵。
- 員工使用交通工具形成「使用」關係;每次使用都要記錄日期。
- 同一位員工可以多次使用同一台交通工具,因此必須讓不同日期的使用紀錄能區分開來。
- 交通工具分為汽車與摩托車,適合以 EER 的特化表示,並將各子類專屬屬性放在對應子類中。
解題方法
1. 找出實體集合與屬性
由題目需求可整理如下:
| 實體集合 | 屬性 | 主鍵 |
|---|---|---|
| 員工 | 員工編號、職稱 | 員工編號 |
| 交通工具 | 牌照號碼、購買年份 | 牌照號碼 |
| 汽車 | 可承載之乘客數 | 繼承交通工具的牌照號碼 |
| 摩托車 | 是否為電動車 | 繼承交通工具的牌照號碼 |
汽車與摩托車是交通工具的子類,子類會繼承交通工具的主鍵及共同屬性,因此不必另外建立不同的主鍵。
2. 建立使用紀錄並決定主鍵
若只將「使用日期」作為員工與交通工具之間二元關係的單一屬性,無法清楚表示同一員工與同一台車在不同日期的多次使用。因此將每次使用表示為一筆使用紀錄,並以員工、交通工具及使用日期共同識別:
這符合題目以日期記錄每次使用的粒度。若實務上同一員工同一天可能多次使用同一台交通工具,則題目所給欄位不足以區分那些紀錄,需另加使用序號或更精確的使用時間。
3. 判定數量限制
每筆使用紀錄必須對應一位員工及一台交通工具;一位員工可以有零筆或多筆使用紀錄,一台交通工具也可以有零筆或多筆使用紀錄。
因此,從員工及交通工具兩側看,使用紀錄數量皆為 ;從每筆使用紀錄看,員工與交通工具各為 。
題目沒有規定所有員工都必須使用交通工具,也沒有規定每台交通工具都必須被使用,因此員工與交通工具對使用紀錄皆採部分參與。
4. 決定特化限制
依題意,交通工具分為汽車和摩托車。以下圖示採用兩類互斥且涵蓋全部交通工具的假設:每台交通工具恰屬於其中一類。若題目未意指這兩類已涵蓋所有交通工具,涵蓋限制則須依實際需求另行指定。
ER/EER 圖
第 四 題20 分
關聯式資料庫的技術已經相當成熟,也已經被一般企業或政府機構廣為使用,但是近年來又出現大數據(Big data)的議題,以及 NoSQL 類的資料庫軟體。
(一) 請問你認為「大數據」所欲處理的資料,與一般傳統資料庫處理的資料,有何不同之處?請列出最明顯的 3 點特性並解釋之。(10 分)
(二) 請問你認為哪類軟體比較適合處理大數據?是常用的關聯式資料庫軟體,譬如 MySQL、SQL Server 等,還是 NoSQL 類的軟體,如 MongoDB、Cassandra、HBase 等,請詳述你的理由。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查「大數據」與傳統關聯式資料庫在資料特性及處理方式上的差異,以及資料庫選型時應如何依照工作負載作判斷。大數據通常以 Volume(資料量)、Velocity(資料產生與處理速度)、Variety(資料多樣性) 三項特性概括,稱為 3V。
大數據不等於單純「資料筆數很多」;資料的產生速度、格式多樣性及處理需求,也會影響儲存架構與分析方法。資料量多寡亦沒有固定的絕對門檻,應視組織所需的儲存、查詢與運算能力而定。
(一)大數據與傳統資料庫資料的三項差異
1. Volume:資料量龐大
大數據所處理的資料量通常大到單一伺服器或傳統資料庫難以有效儲存、索引與分析,因而需要透過多台機器分散儲存及平行處理。
例如,政府機關長期累積的網路紀錄、感測器資料或大量影像檔案,總量可能達到 TB、PB 等級。傳統關聯式資料庫也能儲存大量資料,但當容量與查詢負載超出單機資源時,擴充、維運及效能調整的成本會增加。
2. Velocity:資料產生與處理速度快
大數據常由線上服務、交易系統、網路設備及感測器持續產生,資料不僅量大,也可能要求即時或近即時地接收、處理及分析。
例如,網路安全監控系統必須快速分析大量連線紀錄,以辨識異常行為。傳統批次處理適合定期彙整資料,但若需求是持續接收資料並迅速回應,就需要能支援高吞吐量與串流或近即時處理的架構。
3. Variety:資料格式與來源多樣
傳統關聯式資料庫主要處理具有明確欄位與固定結構的資料,通常在寫入前便要定義資料表結構。大數據則可能包含多種來源與型態:
- 結構化資料:例如表格中的姓名、日期與交易金額。
- 半結構化資料:例如 JSON、XML、系統紀錄。
- 非結構化資料:例如文字、圖片、影音與文件。
資料格式多樣時,若一開始就強制套用固定資料表結構,可能增加資料轉換及模式調整的成本;因此常見做法是依資料型態採用不同的儲存與處理工具。
(二)較適合處理大數據的軟體及理由
解題方法
比較資料庫是否適合大數據,應從資料量、資料輸入速度、格式變化,以及擴充與查詢需求判斷。若題目所稱的大數據具有資料量大、持續高速寫入、來源與格式多樣等特徵,分散式 NoSQL 系統通常較適合承擔主要的儲存與大量讀寫工作;但這不代表所有大數據工作都應使用 NoSQL,也不表示關聯式資料庫已不適用。
NoSQL 適合之處
- 支援水平擴充 資料可分散到多台伺服器,透過增加節點擴充儲存容量及運算能力,適合資料量與流量持續成長的情境。