# 第十五堂:資料庫設計
* 記得錄影
## 資料庫
- 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 個部門
* 以「部門」角度:**一個「部門」會有 多 個員工**

```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);
```
### 班級與學生資料表關係

```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) 定義