111 關務特考三等 資訊處理 資料庫應用 考古題詳解
第 一 題30 分
某圖書館所建立的關聯式資料庫系統(Relational database system)中,定義了三個表格。其中,MEMBER 表格記錄會員基本資料,包含會員編號(Mid)、姓名(Name)和連絡電話(Telephone);BOOK 表格記錄書本基本資料,包含國際標準書號(ISBN)、書名(Title)和出版社(Publisher);BORROWER 表格記錄借閱資料,包含借書者(Mid)、書號(ISBN)和借閱日期(Date)。除了日期之外,其餘屬性皆為字串型態。
此三個表格的綱要如下,且每個表格的主鍵以底線標註:
MEMBER(Mid, Name, Telephone)
BOOK(ISBN, Title, Publisher)
BORROWER(Mid, ISBN, Date)
請利用 SQL 查詢指令,分別回答下列子題:
(一) 找出曾經借閱過「全華」出版社出版書籍的會員,列出其會員編號、姓名和聯絡電話。(10 分)
(二) 針對每個出版社,找出曾經借閱過 3 本以上(含)該出版社出版書籍的會員。每一筆輸出包含出版社和符合條件的會員編號。(10 分)
(三) 定義一個名為 TimeBookCount 的檢視表(view),輸出每個會員(以 Mid 代表)所借閱之「時報」出版社出版書籍的總數,並將檢視表的第一個屬性命名為「Mid」,第二個屬性命名為「BookCount」。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查關聯式資料庫(Relational Database)的標準 SQL 查詢與資料定義語言(DDL),主要涵蓋以下四項核心觀念:
- 多資料表結合(Table Join):利用外部鍵(Foreign Key)與主鍵(Primary Key)建立表格間的關聯(
MEMBER.Mid = BORROWER.Mid與BORROWER.ISBN = BOOK.ISBN),以跨表檢索資料。 - 重複資料抑制(DISTINCT):在一對多(1:N)或多對多(M:N)的借閱關係中,同一會員可能多次借閱同一出版社之書籍,需使用
DISTINCT避免輸出重複的會員資料。 - 多欄位群組化與聚集過濾(GROUP BY & HAVING):針對複合維度(出版社、會員)進行資料分組,並透過聚集函數(Aggregate Function)搭配
HAVING子句對分組後的統計結果進行門檻過濾()。 - 檢視表建立(CREATE VIEW)與屬性重新命名:定義虛擬資料表(View)以封裝特定商業邏輯,並透過 View 綱要指定或
AS別名(Alias)精確命名輸出屬性。
解題方法與步驟
(一) 查詢借閱過「全華」出版社書籍之會員資料
- 資料表關聯:查詢需求包含會員基本資料(
MEMBER表)與出版社名稱(BOOK表),兩者需透過借閱紀錄(BORROWER表)作為中介進行連接。 - 篩選條件:出版社限定為
Publisher = '全華'。 - 輸出控制:因一位會員可能借閱多本全華出版的書籍,直接 Join 會產生多筆重複的會員紀錄,故在
SELECT後方加入DISTINCT。
(二) 查詢各出版社借閱達 3 本以上(含)之會員
- 資料表關聯:僅需統計借閱紀錄中的出版社與借書者,故只需結合
BORROWER與BOOK兩張表格,不需連接MEMBER表。 - 分組維度:題目要求「針對每個出版社,找出……會員」,因此分組依據為
BOOK.Publisher與BORROWER.Mid的組合。 - 聚集條件:分組後的借閱記錄筆數必須大於或等於 3,條件應置於
HAVING COUNT(*) >= 3。
(三) 建立「時報」出版社借閱總數檢視表(TimeBookCount)
- DDL 語法:使用
CREATE VIEW ViewName (Attr1, Attr2) AS SELECT ...語法,直接在 View 定義層明確指定輸出屬性名稱為Mid與BookCount。 - 查詢邏輯:結合
BORROWER與BOOK表格,以WHERE BK.Publisher = '時報'鎖定目標出版社,再以GROUP BY BR.Mid依會員分組計算借閱數量COUNT(*)。
【答案】
(一)
第 二 題20 分
假設在關聯式資料庫系統中,資料庫管理者(DBA)定義了一個 MEMBER 表格,其中包含三個字串型態的屬性:Mid、Name、Telephone,並根據 Mid 欄位定義一個名為「MyIndex」的 B+-tree 索引(Index)。
首先請說明「MyIndex」索引的樹狀結構,包含其內部節點、葉節點、結構的特性等,答案請以文字敘述或圖形呈現。其次請說明資料庫系統如何利用該索引結構,提升下列 SQL 查詢句的處理效能:
select Name from MEMBER where Mid = ‘M001’
登入後即可作答並保存紀錄。
核心觀念
本題評量關聯式資料庫中 B+ 樹索引(B+-tree Index) 的內部結構原理,以及查詢最佳化器(Query Optimizer)如何利用索引結構加速點查詢(Point Query)。主要涉及以下核心觀念:
- B+ 樹結構特性:B+ 樹為多路平衡搜尋樹(Multi-way Balanced Search Tree),其所有葉節點(Leaf Nodes)均在同一深度;內部節點(Internal Nodes)僅儲存鍵值(Search Key)與子節點指標,不儲存資料指標;葉節點儲存完整鍵值與對應資料列指標(Record Pointer),且相鄰葉節點間以雙向鏈結串列(Doubly Linked List)相接。
- 搜尋與 I/O 複雜度:全資料表掃描(Full Table Scan)之磁碟 I/O 複雜度為 ( 為資料表所佔之資料頁數);利用 B+ 樹進行點查詢時,磁碟 I/O 複雜度降為 ( 為樹高, 為節點分支度/Fan-out)。
- 查詢執行路徑:非覆蓋索引(Non-covering Index)的點查詢流程(索引走訪 葉節點匹配 回表擷取資料列 投影指定欄位)。
解題方法
第一部分:說明「MyIndex」索引的樹狀結構
「MyIndex」是以 MEMBER 資料表的 Mid 欄位為搜尋鍵(Search Key)所建立的 B+ 樹索引,其詳細結構與特性如下:
1. 內部節點(Internal Nodes / Non-leaf Nodes)
- 節點內容:內部節點僅儲存「搜尋鍵值(
Mid)」與「指向下一層節點的指標(Child Node Pointer)」。 - 格式定義:節點格式為 。
- 為
Mid鍵值,且滿足遞增排序 。 - 為子節點指標。指標 所指子樹的所有鍵值均小於 ;()所指子樹之鍵值滿足 ; 所指子樹之鍵值均大於或等於 。
- 功能:扮演路徑導引(Routing)角色,不儲存實際資料列或資料位址指標(RID),使單一節點(磁碟頁)能容納最多的指標,大幅增加分支度(Fan-out)並降低樹高。
2. 葉節點(Leaf Nodes)
- 節點內容:儲存所有實際存在的
Mid鍵值及其對應之「資料記錄指標(Record Pointer / Row ID)」。 - 格式定義:節點格式為 。
- 為具體的
Mid(如'M001','M002')。 - 為指向磁碟中儲存該筆完整會員資料(
Mid,Name,Telephone)的實體位址指標。 - 鏈結特性:所有的葉節點透過指標 與 連接成循序雙向鏈結串列,所有鍵值在葉層由小到大連續排序。
3. 整體結構特性
- 絕對平衡(Height-balanced):所有葉節點必定落在相同的深度(層級),任何查詢從根節點到達葉節點的搜尋路徑長度皆相等。
- 高分支度與極低樹高:由於內部節點不存資料指標,分支度 通常可達數百,因此即使資料量達到數千萬筆,樹高 通常僅需 3 至 4 層。
- 空間利用率穩定:除了根節點外,每個節點至少半滿(符合 B+ 樹節點填充率下限),能有效避免樹結構傾斜退化。
4. 樹狀結構示意圖
第 三 題20 分
關聯式資料庫系統在實作異動處理(Transaction Processing)時,大多希望能符合 ACID 四個特性,以確保資料庫內容的正確性。
假設一個異動欲從 P 帳戶轉 1000 元到 Q 帳戶,其中包含下列六個指令:
- read(P)
- write(P)
- read(Q)
- write(Q)
請以該異動具體說明 ACID 所代表的四個要求分別為何?若沒有達到該要求,會造成什麼不良的影響?
登入後即可作答並保存紀錄。
核心觀念
本題考查關聯式資料庫管理系統(RDBMS)異動管理(Transaction Management)的核心基石——ACID 四大特性(Atomicity, Consistency, Isolation, Durability)。異動(Transaction)是資料庫執行作業的邏輯單位,由一連串的資料庫操作(如 read 與 write)所組成。資料庫系統必須透過日誌記錄(Write-Ahead Logging, WAL)、鎖定機制(Locking)、併發控制(Concurrency Control)與復原機制(Recovery System),確保在多使用者併發存取或系統發生崩潰時,資料庫內容仍能保持正確性與完整性。
解題方法 針對題目給定由 帳戶轉帳 元至 帳戶的異動 :
read(P)write(P)read(Q)write(Q)
切入點為將 ACID 四個抽象定義分別對映至異動指令 1 至 6 的執行過程:
- 原子性(Atomicity):從指令 1 到 6 的「全有或全無(All or Nothing)」完整性切入。
- 一致性(Consistency):從轉帳前後「資金總額守恆()」的業務限制切入。
- 隔離性(Isolation):從多異動併發執行時「中間未提交狀態的不可見性」切入。
- 持久性(Durability):從異動成功提交(Commit)後「寫入非揮發性儲存媒體」切入。
針對每一特性,均以「基本定義」、「結合本題異動之具體說明」與「未達要求之不良影響」三個層次進行精確說明。
選項分析 (註:本題為申論問答題,以下方針對題目所要求之 ACID 四個特性項目逐一進行深入剖析)
- 原子性(Atomicity)
- 具體要求:異動必須是一個不可分割的最小工作單位。異動中的所有指令操作,要麼全部成功執行並寫入資料庫(Commit),要麼全部不執行並復原至初始狀態(Rollback / Abort),絕不允許停留在只完成部分操作的中間狀態。
- 本題說明:轉帳異動包含指令 1 至 6。原子性要求指令 1 到 6 必須被視為一個整體,不可分割。
- 未達要求的不良影響:若系統在執行完指令 3
write(P)後(此時 帳戶已扣除 元),因硬體故障、系統斷電或程式例外而中斷,且未達原子性要求(系統未進行 Rollback),則指令 4 至 6 將無法執行。這會導致 帳戶已被扣款 元,但 帳戶卻未收到 元, 元在系統中憑空消失,資料庫處於不完整的中間毀損狀態。
- 一致性(Consistency)
- 具體要求:異動執行前後,資料庫必須從一個正確(一致)的狀態轉變為另一個正確(一致)的狀態,且必須符合系統預先定義的所有完整性限制(Integrity Constraints)與業務邏輯規則(State Preservation)。
- 本題說明:本轉帳情境中隱含的完整性限制為「資金總額守恆律」。設轉帳前 與 的金額分別為 與 ,轉帳後分別為 與 ,則必須滿足:
- 未達要求的不良影響:若異動程式邏輯撰寫錯誤(例如指令 5 誤寫為 ),或是原子性被破壞導致轉帳只做了一半,資料庫將違反資金總額守恆約束。轉帳後 的總和不等於轉帳前的總和,造成帳目不平,破壞資料庫的正確性與業務邏輯限制。
- 隔離性(Isolation)
- 具體要求:在多個異動同時併發(Concurrent)執行的環境下,資料庫必須保證各異動之間相互隔離、不受彼此干擾。每一個異動在執行時,必須感覺不到其他異動也在同時執行;
第 四 題30 分
假設我們要建立書籍的資料,其中書籍的編號(No)和書名(Title)為字串型態,而作者(Authors)則為數個字串組合而成的陣列,且每本書籍的編號皆不與其他書籍相同。兩本書籍的範例資料如下:
| No | Title | Authors |
|---|---|---|
| 1 | 計概 | [趙先生, 張小姐] |
| 2 | 資料庫 | [Silbers, Korth, Sudar] |
針對上述的資料特性,首先請設計出符合第一正規化(First Normal Form)的關聯式表格,每個表格標註其欄位名稱與主鍵,以及對應上表的範例資料內容。
其次,請將上述表格內容直接以一個集合(collection)內含兩個 JSON(JavaScript Object Notation)文件(document)表示,其中一本書籍對應到一個 JSON 文件。
最後,根據你的答案,詳述結構化(structured)關聯式資料和半結構化(semi-structured)JSON 資料表示法的差異性。
登入後即可作答並保存紀錄。
核心觀念
本題旨在考驗考生對**關聯式資料庫正規化(Relational Database Normalization)與文件導向資料庫(Document-oriented Database / NoSQL)**兩種不同資料模型(Data Models)的設計能力與學理比較。核心觀念包含:
- 第一正規化(First Normal Form, 1NF):
- 關聯式資料模型的基本要求,定義為表格中的每一個欄位(Attribute)都必須保持「原子性」(Atomicity),即不可包含多值屬性(Multi-valued Attributes)、複合屬性(Composite Attributes)或重複群組(Repeating Groups)。
- 當原始資料包含陣列型態的多值屬性(如本題書籍的
Authors陣列)時,必須透過「屬性展開」或「建立獨立關聯表」將其轉換為單一原子值。
- 半結構化資料(Semi-structured Data)與 JSON 文件表示法:
- JSON(JavaScript Object Notation)屬於半結構化資料格式,原生支援巢狀物件(Nested Objects)與陣列(Arrays)。
- 無須強制破壞多值屬性的階層結構,能以更直覺且自我描述(Self-describing)的方式封裝實體與其屬性。
- 結構化關聯式資料與半結構化 JSON 資料之比較:
- 比較維度涵蓋:綱要彈性(Schema Flexibility)、正規化與 Join 操作代價、資料完整性限制(Integrity Constraints)、儲存空間與擴展性(Scalability)。
解題方法
子題一:符合 1NF 的關聯式表格設計
原始資料中 Authors 為多值陣列,違反 1NF 的原子性原則。在關聯式資料庫理論中,消去多值屬性主要有兩種正規化切入點:
- 正統雙表格設計(推薦,兼顧 1NF 與 2NF/3NF 無冗餘設計):
- 將書籍基本資料獨立為
Book主表,主鍵為 。 - 將多值屬性
Authors獨立為Book_Author子表,欄位包含 (外鍵)與 ,組合主鍵為 。
- 單一扁平化表格設計(僅達 1NF,存在資料重複冗餘):
- 將
Authors陣列展開,每位作者獨立占有一列。表格欄位為 ,組合主鍵為 。
註:題目要求「設計出符合第一正規化(First Normal Form)的關聯式表格」,答題時應給出標準高正規化的雙表格設計,並說明單表格扁平化之形態,以求解答完整周延。
子題二:以 JSON 集合(Collection)表示
- 題目要求「一個集合內含兩個 JSON 文件」,集合在 JSON 規範中以陣列(Array)中括號
[...]表示,內部包含兩個物件(Object)大括號{...}。 Authors直接映射為 JSON 的字串陣列["作者1", "作者2"]。
子题三:結構化與半結構化資料表示法之差異性
從綱要綁定時機、多值屬性處置、資料整合與查詢、資料完整性約束及擴展能力等五個層面進行系統性對比分析。
子題詳細解析與標準作答
一、 符合第一正規化(1NF)之關聯式表格設計
在標準資料庫設計規範下,去除多值屬性最優化的關聯式設計為雙表格架構:
1. 表格名稱:Book(書籍主表)
- 欄位名稱與型態:
No(String, 主鍵 PK)、Title(String) - 主鍵(Primary Key):
No - 範例資料內容:
| No (PK) | Title |
|---|---|
| 1 | 計概 |
| 2 | 資料庫 |
2. 表格名稱:Book_Author(書籍作者關聯表)
- 欄位名稱與型態:
No(String, 外鍵 FK 參考Book.No)、Author(String) - 主鍵(Primary Key):
組合主鍵 (No, Author) - 範例資料內容:
| No (PK, FK) | Author (PK) |
|---|---|
| 1 | 趙先生 |
| 1 | 張小姐 |
| 2 | Silbers |
| 2 | Korth |
| 2 | Sudar |
(補充:若採用單一扁平化表格 Book_Flat 表示,欄位為 No, Title, Author,主鍵為 (No, Author)。1 號書籍與 2 號書籍之 Title 將隨作者數量重複出現,雖符合 1NF 但未達 2NF/3NF。)
二、 JSON 文件集合(Collection)表示法
符合題意「一個 Collection 包含兩個 Document」之 JSON 格式如下: