# 第十五堂:資料庫設計 * 記得錄影 ## 資料庫 - API 應用可參考[線稿圖](https://miro.com/app/board/uXjVLbiDml0=/) - API 開發規格請依照 [此 API 文件](https://liberating-turtle-5a2.notion.site/38e4dd6775894e94a8f575f20ca5b867?v=17c6a246851881208205000cacf67220) - db 欄位設計請依照 [此資料庫欄位圖片](https://firebasestorage.googleapis.com/v0/b/hexschool-courses.appspot.com/o/hex-website%2Fnode%2F1739179853094-fitness_5.png?alt=media&token=a65de209-3ae6-4263-bdc0-d4f08638ff20) 定義 ## Tables 資料表管理 - 多張表整合 - (圖解) [[Miro 示意圖]](https://miro.com/app/board/uXjVLMcM_hQ=/) - 口訣: - <mark>多</mark>的要設成外來鍵 - 從<mark>欄位</mark>角度去規劃 ## 一對一、一對多、多對多情境 * [Miro 講義](https://miro.com/app/board/uXjVLMcM_hQ=/) ### 部門與員工關係 流程:從欄位角度去規劃 * 以「員工」角度:一個「員工」會有 1 個部門 * 以「部門」角度:**一個「部門」會有 多 個員工** ![截圖 2024-11-27 下午1.53.35](https://hackmd.io/_uploads/By3kE4V7kg.png) ```sql -- 建立部門資料表 CREATE TABLE teams ( id SERIAL PRIMARY KEY, -- 部門編號,主鍵 name VARCHAR(50) -- 部門名稱 ); -- 建立員工資料表 CREATE TABLE users ( id SERIAL PRIMARY KEY, -- 員工編號,主鍵 name VARCHAR(50), -- 姓名 salary INTEGER, -- 薪資 team_id INTEGER, -- 部門編號,外來鍵 FOREIGN KEY (team_id) REFERENCES teams(id) -- 設定外來鍵關聯 ); -- 新增部門資料 INSERT INTO teams (name) VALUES ('開發部'), ('人事部'); -- 新增員工資料 INSERT INTO users (name, salary, team_id) VALUES ('張小明', 45000, 1), ('王大明', 48000, 1), ('李小華', 52000, 2), ('陳小玉', 55000, 2), ('林小豪', 47000, 1); ``` ### 班級與學生資料表關係 ![截圖 2024-11-27 下午2.02.46](https://hackmd.io/_uploads/HyH7IEVmkl.png) ```sql -- 建立班級資料表 CREATE TABLE classes ( id SERIAL PRIMARY KEY, class_name VARCHAR(50) ); -- 建立學生資料表 CREATE TABLE students ( id SERIAL PRIMARY KEY, name VARCHAR(50), gender VARCHAR(10), age INTEGER, class_id INTEGER, FOREIGN KEY (class_id) REFERENCES classes(id) ); -- 新增班級資料 INSERT INTO classes (class_name) VALUES ('三年一班'), ('三年二班'); -- 新增學生資料 INSERT INTO students (name, gender, age, class_id) VALUES ('小明', '男', 8, 1), ('小華', '女', 9, 2), ('小美', '男', 8, 1), ('小強', '女', 8, 1), ('小智', '男', 9, 2); ``` ## 回顧最終作業資料表 - db 欄位設計請依照 [此資料庫欄位圖片](https://firebasestorage.googleapis.com/v0/b/hexschool-courses.appspot.com/o/hex-website%2Fnode%2F1739179853094-fitness_5.png?alt=media&token=a65de209-3ae6-4263-bdc0-d4f08638ff20) 定義