高考申論題
106年
[資訊處理] 資料庫應用
第 一 題
📖 題組:
一實體關聯圖(ER-diagram)包含有三個實體 Project、Employee 及 Family。當中: Project 含有三個屬性 P-No、P-Name 及 DueDate,且 P-No 為該實體的主要鍵(primary key)。 Employee 含有三個屬性 Emp#、E-Name 及 Office,且 Emp#為該實體的主要鍵。 Family 含有兩個屬性 Name 及 DOB,且 Family 為一弱實體(weak entity)。 另 Project 與 Employee 間有一 Assignment 的關聯(relationship),該關聯顯示: 每一 Project 被指定給至少有一位以上 Employee 在負責。 每一 Employee 需負責零個以上 Project。 且每一個 Assignment 都會記錄,負責每一 Project 的每一位 Employee,在該 Project 所扮演的角色、參與該 Project 的起始日期及結束日期。 Employee 與 Family 間也有一 Dependent 的關聯。該關聯描述: 每一位 Employee 能扶養零位以上 Family。 每一位 Family 只能登記為某一位 Employee 的扶養人,且每一位 Family 都必須為某一位,且只有一位 Employee 所扶養。
一實體關聯圖(ER-diagram)包含有三個實體 Project、Employee 及 Family。當中: Project 含有三個屬性 P-No、P-Name 及 DueDate,且 P-No 為該實體的主要鍵(primary key)。 Employee 含有三個屬性 Emp#、E-Name 及 Office,且 Emp#為該實體的主要鍵。 Family 含有兩個屬性 Name 及 DOB,且 Family 為一弱實體(weak entity)。 另 Project 與 Employee 間有一 Assignment 的關聯(relationship),該關聯顯示: 每一 Project 被指定給至少有一位以上 Employee 在負責。 每一 Employee 需負責零個以上 Project。 且每一個 Assignment 都會記錄,負責每一 Project 的每一位 Employee,在該 Project 所扮演的角色、參與該 Project 的起始日期及結束日期。 Employee 與 Family 間也有一 Dependent 的關聯。該關聯描述: 每一位 Employee 能扶養零位以上 Family。 每一位 Family 只能登記為某一位 Employee 的扶養人,且每一位 Family 都必須為某一位,且只有一位 Employee 所扶養。
📝 此題為申論題,共 4 小題
小題 (一)
試以最適當且最少個關聯資料表(relation),來描述上述之實體關聯圖。需寫出該些關聯資料表的名稱、所含之屬性及主要鍵。(10 分)
思路引導 VIP
看到此題,應立即運用「ER 模型轉換為關聯綱目」的標準規則。先將強實體獨立建表;接著處理 M:N 關聯,必須獨立建表並納入兩端主鍵與關聯屬性;最後處理弱實體與 1:N 識別關聯,弱實體不需獨立的關聯表,而是直接將擁有者(Owner)的主鍵作為外鍵納入,並與自身的部分鍵組成複合主鍵。
小題 (二)
對於上述之關聯資料表(relation),於撰寫程式時,那些屬性之間應設定為參考完整性限制(Referential integrity constraint),那些外來鍵屬性(foreign key)必須設為不可為空值(Non-Null)。(10 分)
思路引導 VIP
遇到 ERD 轉關聯綱目題目,首先將實體與關聯轉換為標準關聯表(Relation)。多對多關聯(Assignment)與弱實體關聯(Dependent)皆會產生外來鍵,接著依據實體完整性(主鍵不可為空)與依賴關係來判斷哪些外來鍵必須加上 Non-Null 限制。
小題 (三)
找出修過名稱為‘John’開設所有課程並且都被當掉的學生
思路引導 VIP
這是一道經典的「全稱量詞(For All)」查詢題,在關聯代數中對應「除法(Division)」運算。遇到「所有」這類字眼,在 SQL 中通常有兩種解法:一是使用雙重 NOT EXISTS 將邏輯轉換為「不存在一門 John 開的課,該學生沒有被當」;二是利用 GROUP BY 與 COUNT,比較「學生被當掉的 John 的課程數」是否等於「John 總共開設的課程數」。
小題 (四)
列出所有學生的姓名與總學分數(CreditHour)與修過課程的平均分數
思路引導 VIP
看到題目要求「所有學生」與各種統計數值(總計、平均),應直覺聯想到需使用 LEFT JOIN 保留所有學生紀錄,並搭配 GROUP BY 分組。最後利用聚合函數 SUM() 與 AVG() 計算學分數與分數。