110 高普考高考三級 資訊處理 資料庫應用 考古題詳解
第 一 題20 分
假設在某關聯式資料庫(Relational Database)中,資料庫管理者(Database Administrator, DBA)執行如下 SQL 指令,以定義 CUSTOMER 和 PURCHASE 兩個表格:
create table CUSTOMER (cid char(2), name varchar(10), city varchar(10), primary key(cid));
create table PURCHASE (cid char(2), mid char(2), amount integer, primary key (cid, mid), foreign key(cid) references CUSTOMER);
若使用者依序執行下列六個 SQL 指令:
指令一:insert into CUSTOMER values ('C1', 'John', 'Taipei');
指令二:insert into PURCHASE values ('C1', 'M1', 10);
指令三:insert into CUSTOMER values ('C1', 'Mary', 'Taichung');
指令四:insert into PURCHASE values ('C1', 'M2', 1);
指令五:update CUSTOMER set cid = 'C2' where cid = 'C1';
指令六:delete from PURCHASE where cid = 'C1';
請針對指令三至指令六此四個指令,分別說明其執行之後所產生的效果,並加以解釋之。舉例來說,若某指令可順利執行,請說明是哪些表格受到影響,並詳述更新後的表格內容。反之,則請說明是表格定義中的哪項限制,導致該指令無法順利更新表格內容。
登入後即可作答並保存紀錄。
核心觀念
本題考查關聯式資料庫的**主鍵(Primary Key)與外鍵(Foreign Key)**限制,以及未指定參照動作時,更新或刪除資料對參照完整性的影響。
CUSTOMER的主鍵是cid,所以同一張表中不可有重複的cid。PURCHASE的複合主鍵是(cid, mid),所以這兩欄的組合不可重複。PURCHASE.cid是外鍵,參照CUSTOMER.cid;每筆PURCHASE資料的cid都必須在CUSTOMER中存在。- 題目未指定
ON UPDATE CASCADE或ON DELETE CASCADE等參照動作,因此以預設的限制行為判斷:若更新或刪除會破壞參照完整性,該操作不得完成。
解題方法
依序處理指令,並在每一步記錄目前兩表內容。指令三至指令六的結果,須以前面指令已執行後的資料狀態為基礎;若某指令失敗,該指令不會改變表格內容。
指令一、二先成功執行後,資料如下:
CUSTOMER
| cid | name | city |
|---|---|---|
| C1 | John | Taipei |
PURCHASE
| cid | mid | amount |
|---|---|---|
| C1 | M1 | 10 |
指令三:插入第二筆 cid = 'C1' 的客戶
insert into CUSTOMER values ('C1', 'Mary', 'Taichung');
結果:執行失敗。
CUSTOMER.cid 是主鍵,而表中已存在 cid = 'C1' 的 John,因此新增 Mary 會造成主鍵值重複,違反主鍵唯一性限制。兩表資料都不變。
執行後的表格
CUSTOMER 仍只有 (C1, John, Taipei);PURCHASE 仍只有 (C1, M1, 10)。
指令四:新增一筆購買資料
insert into PURCHASE values ('C1', 'M2', 1);
結果:執行成功。
複合主鍵 (C1, M2) 尚未出現,沒有違反 PURCHASE 的主鍵限制;且 C1 已存在於 CUSTOMER,所以外鍵也有效。只有 PURCHASE 表受到影響。
執行後的表格
CUSTOMER
| cid | name | city |
|---|---|---|
| C1 | John | Taipei |
第 二 題20 分
假設關聯式資料庫中定義三個表格,其中 CUSTOMER 表格記錄顧客基本資料,包含顧客編號(Cid)、姓名(Name)和所居住的城市(City);MERCHANDISE 表格記錄貨品基本資料,包含貨品編號(Mid)和價格(Price);PURCHASE 表格則為購買資料,記錄了某位顧客(Cid)於某日(Date)購買某個貨品(Mid)的數量(Amount)。
在這些表格的欄位中,除了價格和數量二者為數值型態的屬性,其餘皆為字串型態。此三個表格的綱要簡列如下,且每個表格的主鍵以底線標註:
CUSTOMER(\underline{Cid}, Name, City)
MERCHANDISE(\underline{Mid}, Price)
PURCHASE(\underline{Cid, Mid, Date}, Amount)
請根據以下兩個資訊需求,分別寫出對應的 SQL 查詢指令。注意每個小題皆各自對應到單一的 SQL 查詢句,但是可以使用子查詢句(Subquery)或類似功能的寫法。
(一) 請問所有住在臺北市的顧客,總共花了多少錢在購買物品上?(10 分)
(二) 試找出那些顧客購買貨品編號「M1」的總數量,超過編號「C2」顧客購買貨品編號「M1」的總數量,並輸出那些顧客的編號。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題主要考查關聯式資料庫的多表連接、條件篩選、彙總函數 SUM、分組 GROUP BY,以及以子查詢比較彙總結果。
CUSTOMER以Cid識別顧客,MERCHANDISE以Mid識別貨品。PURCHASE的主鍵為(Cid, Mid, Date),同一顧客可在不同日期購買同一貨品。- 每筆購買金額為「單價 × 數量」,即
Price * Amount。 PURCHASE與其他表格的關聯條件分別為Cid、Mid。連接時必須使用這些欄位,才能將購買紀錄對應到正確的顧客與貨品。
解題方法
(一)臺北市顧客購買物品的總花費
先由 CUSTOMER 找出居住城市為臺北市的顧客,再將其購買紀錄與貨品價格連接。每筆購買金額為 Price * Amount,最後用 SUM 加總。
SELECT SUM(M.Price * P.Amount) AS TotalCost
FROM CUSTOMER C
JOIN PURCHASE P ON C.Cid = P.Cid
JOIN MERCHANDISE M ON P.Mid = M.Mid
WHERE C.City = '臺北市';
查詢中不需要依顧客分組,因為題目要的是所有臺北市顧客合計的總花費。若要列出每位顧客各自的花費,才需要依 Cid 分組。
(二)購買 M1 總數量超過 C2 顧客的顧客編號
第 三 題20 分
假設某公司欲建立一個關聯式資料庫系統,以管理內部員工使用公務車輛的狀況,該公司並限制一個員工在一天之內最多只能借用一部車輛。
假設表格定義為 UNIVERSAL(Tag, Year, ID, Title, Date),其內每一筆資料列(Tuple)記錄了某部車輛的車牌(Tag)和購買年份(Year)、使用該台車輛的員工編號(ID)和職稱(Title),以及使用的日期(Date)。
請針對此表格的 5 個屬性,列出三個合理且有意義(Non-Trivial)的函數相依式(Functional Dependency),並針對所列出的每一項式子,解釋其合理性或詳述其所代表的限制。
接著根據你所列出的函數相依式,分析此 UNIVERSAL 表格是否符合 BCNF 正規化格式(Boyce-Codd Normal Form)。
登入後即可作答並保存紀錄。
核心觀念
函數相依(Functional Dependency, FD) 表示:在符合資料庫規則的每一種合法資料狀態中,只要兩筆資料在屬性集合 上相同,其在 上也必須相同。
BCNF(Boyce-Codd Normal Form)的判定條件是:對每一個非平凡函數相依 ,決定項 都必須是超級鍵。超級鍵是能唯一識別資料列的屬性集合;非平凡函數相依則是 不包含於 。
本題須從題目給定的業務規則推導函數相依,再檢查每條相依的決定項是否為超級鍵。
解題方法
屬性為:
題目提供兩項重要語意:
- 車牌 用來識別車輛,因此同一車牌對應固定的購買年份 。
- 一名員工一天最多借用一部車,因此員工編號與日期的組合 至多對應一個車牌 。
據此,可列出以下三個合理且有意義的非平凡函數相依:
1.
車牌識別特定車輛,而每部車輛有固定的購買年份。因此,同一個 不會對應不同的 。
2.
在公司員工資料的通常假設下,每位員工有一個職稱;同一員工編號不會對應不同職稱。
3.
題目明確限制一名員工一天最多只能借用一部車。固定某位員工與某一天,該員工當日使用的車牌至多一個,因此 決定 。
以上各式皆為非平凡函數相依,因為右側屬性不包含在左側屬性集合中。
BCNF 判定
檢查候選鍵與上述函數相依的決定項。
第 四 題20 分
資料庫系統中,經常使用「鎖」(Lock)的機制來進行交易處理(Transaction Processing)中的併行控制(Concurrency Control),而該機制允許某個資料項目(Data Item)被「共享鎖」(Shared Lock)或「排他鎖」(Exclusive Lock)鎖定。
請問這兩種不同鎖定模式,對一個資料項目的使用方式所造成的限制各自為何?
另外,資料項目可以小到一筆資料列(Tuple)或紀錄(Record),也可以大到涵蓋一整個表格或資料庫。請分析資料項目的大小對系統效能的影響為何?
登入後即可作答並保存紀錄。
核心觀念
本題考資料庫併行控制中的鎖定模式,以及鎖定粒度(locking granularity)對併行程度與系統負擔的影響。
- 共享鎖(Shared Lock,S-lock):供讀取資料使用。多個交易可以同時對同一資料項目持有共享鎖;持有共享鎖期間,其他交易不得對該項目加排他鎖或修改資料。
- 排他鎖(Exclusive Lock,X-lock):供修改資料使用。交易持有排他鎖時,其他交易不得再對該項目加共享鎖或排他鎖,因此不能讀取或修改該項目。
解題方法
先依鎖的用途判斷資料項目能否被讀取或修改,再比較鎖定範圍大小對併行控制的影響:
| 鎖定模式 | 持鎖交易可做的事 | 其他交易對同一項目的限制 |
|---|---|---|
| 共享鎖 S | 讀取 | 可同時持有 S 鎖並讀取;不得取得 X 鎖或修改 |
| 排他鎖 X | 讀取、修改 | 不得取得 S 鎖或 X 鎖,也不得讀取或修改 |
共享鎖之所以允許多個交易並存,是因為讀取本身不改變資料;排他鎖則必須獨占,才能避免其他交易在資料更新期間讀取或覆寫同一項目。
鎖定粒度與系統效能
第 五 題20 分
假設在某個 MongoDB 的資料庫中,有個 Collection 叫做「student」,其中每個物件表示學生的編號(_id)、姓名(name,包含名(first)和姓(last))以及就讀的學系名稱(department)。
一個範例物件以 JSON 格式表示如下:
{ "_id": "1", "name": { "first": "Ted", "last": "Codd" }, "department": "CS" }
請以 Mongo 語法,依序寫出符合下述要求的指令:
(一) 找出姓為「Codd」的學生,並限定只輸出第一位。(10 分)
(二) 刪除所有就讀「CS」系的學生資料。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題考 MongoDB 的文件查詢與刪除:
find用查詢條件篩選文件。limit(1)限制查詢結果最多一筆。- 巢狀文件的欄位可用點記法指定,例如
"name.last"表示name文件中的last欄位。 deleteMany刪除所有符合條件的文件。
解題方法
(一)找出姓為 Codd 的學生,並限定只輸出第一位
姓氏位於巢狀欄位 name.last,因此用點記法設定查詢條件,再以 limit(1) 限制結果筆數:
db.student.find({ "name.last": "Codd" }).limit(1)
此指令會回傳姓氏為 Codd 的學生文件,最多一筆。若有多筆符合資料,未指定排序條件時,MongoDB 不保證哪一筆會被視為「第一位」。
(二)刪除所有就讀 CS 系的學生資料