110 一般警察特考三等 警察資訊管理人員 資料庫應用 考古題詳解
第 一 題30 分
請為如下的藥局藥品進銷存管理系統設計符合 正規化且考量 (物件導向)的 data model。model 中請註明適合的 primary/foreign/candidate keys,資料表間的關聯亦請適當地說明彼此間的 maximum/minimum cardinality。
註:題目中不需要用到的資料,請不要列入資料表中。
- 系統可以依日期、藥品種類、藥品名稱、國內外供應商、經手員工等等,查詢進貨或銷貨的資訊,包括進貨日期、供應商、員工、藥品種類、藥品名稱、數量、單價(同一藥品,依供應商不同或日期不同,單價可能不一樣)、總價等。
- 系統可以依藥品種類、藥品名稱、國內外供應商等等,查詢庫存的資訊,包括查詢日期、藥品種類、藥品名稱、國內外供應商、庫存量。
- 系統可以依日期、領藥人身分證號或手機、藥品種類、藥品名稱等等,查詢處方箋的領藥資訊。例如: 領藥人於 2021/04/30、2021/05/31 分別以 醫院所開立的處方箋,領了 供應商的腸胃類藥品, 30 顆、 90 顆等。
- 系統可以依藥品種類、藥品名稱、國內外供應商等等,查詢某藥品的資訊,包括是否為管制藥、用藥資訊、副作用、哪家藥廠供應等。
- 系統可以依藥品種類、藥品名稱等等,查詢特定區域或國別的供應商供貨資訊。例如: 類固醇,2021/01/01 由美洲地區的 國 供應商進貨 數量,2021/01/05 由歐洲地區的 國 供應商進貨 數量等。
登入後即可作答並保存紀錄。
核心觀念
本題要求同時完成三件事:由需求辨識實體與關聯、以函數相依檢查並達到 BCNF,以及用 EER 表達物件導向的繼承與類別特色。題目不是只要列出可查詢的欄位;還要避免把可推導的總價、庫存量等資料重複儲存,並標明鍵與關聯基數。
BCNF 的判準是:對關係中的每一個非平凡函數相依 , 都必須是該關係的超鍵。若一筆交易明細由「交易編號、項次」識別,則交易編號決定交易日期、經手員工等表頭資料;藥品編號決定藥品名稱、種類等藥品資料。將表頭、明細與藥品資料分開,可避免非鍵欄位依賴部分鍵或其他非鍵欄位。
解題方法
先將需求分為藥品主檔、供應商與藥廠、員工、進銷貨交易、處方箋領藥、庫存查詢等資料。再判斷每項資料的識別方式與函數相依,將多值資料(如藥品副作用)拆成獨立關聯,最後以 EER 的子類別呈現國內/國外供應商及進貨/銷貨交易等特性。
以下假設:每筆進貨或銷貨有唯一交易編號;一張交易可包含多項藥品;每項交易明細記錄當次數量與單價;供應商與藥廠視為同一組織實體,可分別參與供貨關係。庫存以藥品與供應商為粒度,並由進貨、銷貨及領藥異動計算;若業務要求保存每日結存快照,再另設庫存快照表。
EER 實體與資料表
藥品與藥品類別
- 藥品類別(
CategoryIDPK,CategoryNameUNIQUE) - 藥品(
DrugIDPK,DrugName,CategoryIDFK,IsControlled,UsageInfo)
藥品名稱未假設全系統唯一,因此以 DrugID 作為主鍵。若業務規則明定名稱唯一,DrugName 可另列候選鍵;題目未提供此規則,故不自行設定。
一個藥品類別可包含零至多種藥品;每種藥品恰屬一個類別,故為「類別 對藥品 」,藥品端必須參照一個類別。
副作用
- 藥品副作用(
DrugIDFK,SideEffect;PK:(DrugID, SideEffect))
一種藥品可有零至多項副作用,每項副作用紀錄只屬於一種藥品。將副作用拆表可避免一欄存放多個值,並符合第一正規化。
供應商與藥廠
- 組織(
OrgIDPK,OrgName) - 國家(
CountryCodePK,CountryNameUNIQUE,Region) - 國內供應商:
OrgIDPK/FK → 組織 - 國外供應商:
OrgIDPK/FK → 組織,CountryCodeFK → 國家 - 藥品供應關係(
DrugIDFK,OrgIDFK;PK:(DrugID, OrgID))
供應商與藥廠以組織作為共同超類別;國內供應商、國外供應商是子類別,且假設每一供應商恰屬其中一類。國內與國外供應商的子類別互斥。國外供應商透過國家取得國別與區域,不在供應商表重複存放國名或區域名稱。
藥品與供應商為多對多:一種藥品可由零至多家組織供應,一家組織也可供應零至多種藥品,透過「藥品供應關係」表示。
員工與交易
- 員工(
EmployeeIDPK,EmployeeName) - 交易表頭(
TransactionIDPK,TransactionDate,EmployeeIDFK) - 進貨交易:
TransactionIDPK/FK,SupplierIDFK → 組織 - 銷貨交易:
TransactionIDPK/FK - 交易明細(
TransactionIDFK,LineNo,DrugIDFK,SupplierIDFK〔銷貨可為 NULL〕,Quantity,UnitPrice;PK:(TransactionID, LineNo))
第 二 題20 分
假設現有如下 、、 三個 transactions,同步存取資料 、、,請以 conflict equivalent 的觀念,繪圖說明這三個 transactions 的執行排程,是否具備排程循序性(serializability)?
如果具備排程循序性,則此三個 transactions 的執行順序應為何,才不會出現 conflict?如果不具備排程循序性,則衝突的 cycle 有哪些?
註: 表示讀取, 表示寫入。
(此題原卷文字擷取不全,請參考原卷)
登入後即可作答並保存紀錄。
核心觀念
本題考查 衝突等價(conflict equivalence) 與 衝突可序列化(conflict serializability)。兩個操作若符合以下條件,便構成衝突:
- 操作來自不同的 transaction。
- 存取同一筆資料。
- 至少一個操作是寫入。
因此, 與 不衝突; 與 、 與 ,以及 與 都衝突。衝突操作的先後順序會形成 transaction 間的先行關係。
判斷方式是建立優先圖(precedence graph):每個 transaction 是一個節點;若 有一項衝突操作先於 的操作,便畫出邊 。若圖中沒有有向 cycle,排程具衝突可序列性;若有有向 cycle,則不具衝突可序列性。
解題方法
第 三 題25 分
請將如下外送平台訂單表格資料,以符合 的 資料表來表示,並將經 正規化後的資料表,分別以 JSON 檔案格式來描述。
註:您的答案需包括 正規化後的資料表(含內容),及正規化後資料表對應的 JSON 檔案格式內容。
原始資料欄位:
店家名稱、店家地址、店家電話、餐飲類型、外送平台、外送員編、外送員手機、取貨日期時間、訂單總價。
原始資料:
| 店家名稱 | 店家地址 | 店家電話 | 餐飲類型 | 外送平台 | 外送員編 | 外送員手機 | 取貨日期時間 | 訂單總價 |
|---|---|---|---|---|---|---|---|---|
| Store1 | Addr.1 | Tel.1 | 咖哩專賣 | Uber | DE1 | 900 | 2021-05-25 12:00:00 PM | 150 |
| Store2 | Addr.2 | Tel.2 | 咖哩專賣 | Uber | DE2 | 911 | 2021-05-25 12:00:00 PM | 200 |
| Store2 | Addr.2 | Tel.2 | 咖哩專賣 | Food Panda | DE3 | 922 | 2021-05-25 12:00:00 PM | 250 |
| Store3 | Addr.3 | Tel.3 | 傳統麵食 | Food Panda | DE3 | 922 | 2021-05-26 12:00:00 PM | 300 |
| Store3 | Addr.3 | Tel.3 | 傳統麵食 | Food Panda | DE4 | 933 | 2021-05-26 12:00:00 PM | 250 |
| (店家資訊與前列相同) | (店家資訊與前列相同) | (店家資訊與前列相同) | 傳統麵食 | Food Panda | DE4 | 933 | 2021-05-26 06:00:00 PM | 200 |
| (店家資訊與前列相同) | (店家資訊與前列相同) | (店家資訊與前列相同) | 傳統麵食 | Uber | DE2 | 911 | 2021-05-26 12:00:00 PM | 150 |
| (店家資訊與前列相同) | (店家資訊與前列相同) | (店家資訊與前列相同) | 熱炒小吃 | Uber | DE1 | 900 | 2021-05-26 06:00:00 PM | 200 |
| (店家資訊與前列相同) | (店家資訊與前列相同) | (店家資訊與前列相同) | 熱炒小吃 | Uber | DE5 | 944 | 2021-05-26 06:00:00 PM | 250 |
登入後即可作答並保存紀錄。
核心觀念
BCNF(Boyce–Codd 正規形)的判定方式是:對資料表中每一個非平凡函數相依 ,決定因素 都必須是超鍵。違反 BCNF 時,將資料表依該函數相依分解,直到各表均符合 BCNF。
題目沒有提供明確的函數相依或鍵值,以下依資料欄位的業務意義採用這些假設:
- 店家名稱唯一識別一家店,且決定店家地址、店家電話。
- 外送員編唯一識別外送員,且決定外送員手機。
- 一筆訂單由「店家名稱、外送平台、取貨日期時間」識別,並決定餐飲類型、外送員編及訂單總價。
- 店家可提供不同餐飲類型;平台與外送員不是固定配對。因此「店家名稱 餐飲類型」及「外送平台 外送員編」不成立。
解題方法
先將欄位以簡稱表示:
- 店家名稱 、店家地址 、店家電話
- 餐飲類型 、外送平台
- 外送員編 、外送員手機
- 取貨日期時間 、訂單總價
依上述假設,主要函數相依為:
原始資料表的候選鍵為 。但 中, 不是超鍵; 中, 也不是超鍵。因此原表違反 BCNF。
依這些相依關係分解為四個資料表:
- 店家表:處理店家名稱決定店家地址及電話。
- 外送員表:處理外送員編決定手機。
- 訂單表:保留訂單識別欄位及訂單本身的資料。
- 訂單餐飲類型表:依題目資料,店家可對應多種餐飲類型,故將餐飲類型與訂單識別欄位另存。
分解後,店家表的鍵為店家名稱,外送員表的鍵為外送員編,訂單表的鍵為 ,訂單餐飲類型表的鍵亦為 。各表中每一個非平凡函數相依的決定因素都是超鍵,符合 BCNF。
BCNF 正規化後的資料表(含內容)
店家
| 店家名稱(PK) | 店家地址 | 店家電話 |
|---|---|---|
| Store1 | Addr.1 | Tel.1 |
| Store2 | Addr.2 | Tel.2 |
| Store3 | Addr.3 | Tel.3 |
外送員
| 外送員編(PK) | 外送員手機 |
|---|---|
| DE1 | 900 |
| DE2 | 911 |
| DE3 | 922 |
| DE4 | 933 |
| DE5 | 944 |
訂單
| 店家名稱(PK、FK) | 外送平台(PK) | 取貨日期時間(PK) | 外送員編(FK) | 訂單總價 |
|---|---|---|---|---|
| Store1 | Uber | 2021-05-25 12:00:00 PM | DE1 | 150 |
| Store2 | Uber | 2021-05-25 12:00:00 PM | DE2 | 200 |
| Store2 | Food Panda | 2021-05-25 12:00:00 PM | DE3 | 250 |
| Store3 | Food Panda | 2021-05-26 12:00:00 PM | DE3 | 300 |
| Store3 | Food Panda | 2021-05-26 12:00:00 PM | DE4 | 250 |
| Store3 | Food Panda | 2021-05-26 06:00:00 PM | DE4 | 200 |
| Store3 | Uber | 2021-05-26 12:00:00 PM | DE2 | 150 |
| Store3 | Uber | 2021-05-26 06:00:00 PM | DE1 | 200 |
| Store3 | Uber | 2021-05-26 06:00:00 PM | DE5 | 250 |
訂單餐飲類型
| 店家名稱(PK、FK) | 外送平台(PK) | 取貨日期時間(PK) | 餐飲類型 |
|---|---|---|---|
| Store1 | Uber | 2021-05-25 12:00:00 PM | 咖哩專賣 |
| Store2 | Uber | 2021-05-25 12:00:00 PM | 咖哩專賣 |
| Store2 | Food Panda | 2021-05-25 12:00:00 PM | 咖哩專賣 |
| Store3 | Food Panda | 2021-05-26 12:00:00 PM | 傳統麵食 |
| Store3 | Food Panda | 2021-05-26 12:00:00 PM | 傳統麵食 |
| Store3 | Food Panda | 2021-05-26 06:00:00 PM | 傳統麵食 |
| Store3 | Uber | 2021-05-26 12:00:00 PM | 傳統麵食 |
| Store3 | Uber | 2021-05-26 06:00:00 PM | 熱炒小吃 |
| Store3 | Uber | 2021-05-26 06:00:00 PM | 熱炒小吃 |
**鍵值說明:**題目中 Store3、Food Panda、2021-05-26 12:00:00 PM 出現兩筆不同外送員及價格的資料;Store3、Uber、2021-05-26 06:00:00 PM 也出現兩筆。這表示假設的訂單鍵不足以唯一識別每筆資料。實際 RDB 應增加「訂單編號」作為主鍵,並以訂單編號連結訂單餐飲類型表;若不新增欄位,這兩組重複鍵資料便無法在關聯表中完整區分。
對應 JSON 檔案格式
store.json
第 四 題25 分
假設現有如下個人實聯制登記紀錄的關聯式資料庫,請使用 SQL 回答相關的子問題。
Place(placeID, placeName, countyCity, district, address)
PK:placeID
Person(mobile, name, telecomProvider)
PK:mobile
EnterRecord(placeID, mobile, date, time)
PK:(placeID, mobile, date, time)
FK:placeID ref. Place(placeID)
FK:mobile ref. Person(mobile)
(一)使用 DDL 定義所有的資料表,定義中應適當表示 primary/foreign keys,及 referential integrity。(10 分)
(二)請依 countyCity、district 分群顯示該行政區內,2021/05/11~2021/05/31 間,所有公共場所進出人數的總和,結果需依進出人次多至少作排列。(5 分)
(三)請列出臺北市萬華區內「公有 XX 市場」,2021/05/15~2021/05/28 進出人員的手機號碼及姓名,並依手機登錄進出次數,由多至少排列顯示。(5 分)
(四)請查詢所有手機號碼,在「新北市」所有公共場所進出次數大於 1 的相關資訊,包括姓名、手機號碼、日期、進出場所的縣市行政區與名稱,結果依日期近至遠排列顯示。(5 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查關聯式資料庫的資料定義與 SQL 查詢,重點包括主鍵、外鍵與參照完整性,以及多表連接、條件篩選、分組彙總與排序。題目未指定資料庫管理系統,以下以通用 SQL 撰寫;DATE、TIME 為日期與時間型別。
(一)建立資料表
Place 與 Person 分別以 placeID、mobile 作為主鍵。EnterRecord 記錄某人於特定時間進出某場所,因此以四個欄位組成複合主鍵,並以外鍵連接場所與人員資料。
CREATE TABLE Place (
placeID VARCHAR(20) NOT NULL,
placeName VARCHAR(100) NOT NULL,
countyCity VARCHAR(50) NOT NULL,
district VARCHAR(50) NOT NULL,
address VARCHAR(200),
CONSTRAINT pk_place PRIMARY KEY (placeID)
);
CREATE TABLE Person (
mobile VARCHAR(20) NOT NULL,
name VARCHAR(50) NOT NULL,
telecomProvider VARCHAR(50),
CONSTRAINT pk_person PRIMARY KEY (mobile)
);
CREATE TABLE EnterRecord (
placeID VARCHAR(20) NOT NULL,
mobile VARCHAR(20) NOT NULL,
date DATE NOT NULL,
time TIME NOT NULL,
CONSTRAINT pk_enterrecord
PRIMARY KEY (placeID, mobile, date, time),
CONSTRAINT fk_enterrecord_place
FOREIGN KEY (placeID) REFERENCES Place (placeID),
CONSTRAINT fk_enterrecord_person
FOREIGN KEY (mobile) REFERENCES Person (mobile)
);
主鍵欄位不得重複且不得為 NULL;外鍵則要求每筆進出紀錄所指向的場所與手機,必須已存在於 Place 與 Person 中,藉此維持參照完整性。
(二)依行政區統計公共場所進出人次
先連接 EnterRecord 與 Place,篩選日期區間,再依縣市與行政區分組。每筆進出紀錄代表一人次,因此以 COUNT(*) 計算,並按人次由多至少排序。
SELECT p.countyCity,
p.district,
COUNT(*) AS totalEntries
FROM EnterRecord AS e
JOIN Place AS p
ON e.placeID = p.placeID
WHERE e.date BETWEEN DATE '2021-05-11' AND DATE '2021-05-31'
GROUP BY p.countyCity, p.district
ORDER BY totalEntries DESC;
BETWEEN 會包含起日與迄日。此處統計的是進出紀錄筆數,也就是人次;同一人於不同時間進出,會分別計入。