---
# System prepended metadata

title: 第十五堂：資料庫設計
tags: [2025 Node.js 後端工程師培訓營]

---

# 第十五堂：資料庫設計

* 記得錄影

## 資料庫
- 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) 定義