第1題
設有一校務資料表格,含有以下屬性:學號, 學生姓名, 學生住址, 學生 電話, 聯絡人姓名, 聯絡人電話, 聯絡人地址, 指導老師證號, 指導老師 姓名, 研究室, 課程編號, 課程名稱, 學分, 成績, 實驗室名稱, 實驗室 地點。 且一位學生可能有多支電話號碼。 該校務資料表格,屬性間之功能相依性如下: 學號 學生姓名, 學生住址, 聯絡人姓名, 聯絡人電話, 指導老師證號; 課程編號 課程名稱, 學分; 指導老師證號 指導老師姓名, 研究室; 聯絡人姓名, 聯絡人電話 聯絡人地址; 實驗室名稱 實驗室地點, 指導老師證號; 指導老師證號 實驗室名稱; 學號, 課程編號 成績。 (每小題10 分,共40 分) 請以功能相依之特性,推導出該校務資料表格之primary key。 請修改該校務資料表格,使其能符合第二正規化之要求。 請修改該校務資料表格,使其能符合第三正規化之要求。 請依 小題所產生的所有表格,撰寫一SQL 程式碼片段,列印出每一 位學生之學號、姓名、共修多少門課,以及其指導老師之姓名。
參考解答(AI 生成,非官方)
- (一)令 K={學號,課程編號,學生電話}。由 學號→學生姓名、學生住址、聯絡人姓名、聯絡人電話、指導老師證號;指導老師證號→指導老師姓名、研究室、實驗室名稱;實驗室名稱→實驗室地點、指導老師證號;課程編號→課程名稱、學分;(學號,課程編號)→成績,可知 K+ 包含全部屬性。去掉電話無法決定多值電話,去掉課程編號無法決定課程與成績,去掉學號無法決定學生與老師資料,故 K 為最小超鍵,即 primary key。若先將電話抽出成獨立多值表,原表主鍵才可記為 (學號,課程編號);本題未拆解前須含電話。題目未給電話→學號,不假設電話全球唯一。
- (二)原表電話為重複群組,先化為 1NF:同一學生、課程、不同電話各一列,主鍵 (學號,課程編號,學生電話)。2NF 要求非主屬性完全相依於主鍵。因 學號→學生姓名、學生住址、聯絡人姓名、聯絡人電話、指導老師證號;課程編號→課程名稱、學分;(學號,課程編號)→成績,均只依賴部分主鍵,故拆為:學生(學號,學生姓名,學生住址,聯絡人姓名,聯絡人電話,指導老師證號,指導老師姓名,研究室,實驗室名稱,實驗室地點)、學生電話(學號,學生電話)、課程(課程編號,課程名稱,學分)、成績(學號,課程編號,成績)。四表均符合 2NF;遞移相依留待 3NF 處理。
- (三)3NF 消除非主屬性之遞移相依。學生表有 學號→指導老師證號,指導老師證號→(指導老師姓名,研究室,實驗室名稱),實驗室名稱→實驗室地點;另有 學號→(聯絡人姓名,聯絡人電話),且 (聯絡人姓名,聯絡人電話)→聯絡人地址。故拆為:學生(學號,學生姓名,學生住址,聯絡人姓名,聯絡人電話,指導老師證號)、聯絡人(聯絡人姓名,聯絡人電話,聯絡人地址)、指導老師(指導老師證號,指導老師姓名,研究室)、實驗室(實驗室名稱,實驗室地點,指導老師證號)、學生電話(學號,學生電話)、課程(課程編號,課程名稱,學分)、成績(學號,課程編號,成績)。實驗室表的指導老師證號加 UNIQUE,維持一對一;各表符合 3NF。
- (四)SQL 如下:SELECT S.學號, S.學生姓名, COUNT(DISTINCT G.課程編號) AS 修課數, T.指導老師姓名 FROM 學生 AS S LEFT JOIN 成績 AS G ON S.學號=G.學號 LEFT JOIN 指導老師 AS T ON S.指導老師證號=T.指導老師證號 GROUP BY S.學號, S.學生姓名, T.指導老師姓名; 使用 LEFT JOIN 可列出未修課學生並計為 0;COUNT(DISTINCT) 避免重複;不可 join 學生電話,否則多支電話會重複計數。
- (五)此設計可減少插入、刪除與更新異常;自然連接 學生-成績-課程、學生-學生電話、學生-聯絡人、學生-指導老師-實驗室,可還原原表。限制:若電話可共用,學生電話鍵仍為 (學號,學生電話);若需電話類型,應增欄位並調整鍵;若成績允許補考或多次修課,應增修課學期或成績版本,不能只以 (學號,課程編號) 為鍵。