owned this note
owned this note
Published
Linked with GitHub
# 11/27 每日任務
## 需要必備的知識點
* 觀看 [group by 分組資料](https://hackmd.io/gDseaambSbW1pP-H6Yek8g?view)章節
## 教練身份講解
在一個網頁平台上,會有多種角色,而在我們的任務二中的角色(`role`)會有:
1. 一般客戶:`USER`
2. 教練:`COACH`
在我們的[線稿圖](https://miro.com/app/board/uXjVLbiDml0=/?share_link_id=404709829822)中,也有繪製如果他是教練角色時,他可以填寫自己的相關教練資料,其中欄位包含:
1. 大頭照
2. 教練姓名
3. 教練資歷
4. 教練簡介
5. 專長(可複選)

## 資料庫預設資訊與欄位介紹

```sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE "USER" (
"id" uuid PRIMARY KEY NOT NULL DEFAULT (gen_random_uuid()),
"name" varchar(50) NOT NULL,
"email" varchar(320) UNIQUE NOT NULL,
"role" varchar(20) NOT NULL,
"created_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),
"updated_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)
);
CREATE TABLE "COACH" (
"id" uuid PRIMARY KEY NOT NULL DEFAULT uuid_generate_v4(),
"user_id" uuid NOT NULL REFERENCES "USER"(id),
"experience_years" integer,
"description" text,
"profile_image_url" varchar(2048),
"created_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),
"updated_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),
UNIQUE("user_id")
);
CREATE TABLE "CREDIT_PACKAGE" (
"id" serial PRIMARY KEY,
"name" varchar(50) NOT NULL,
"credit_amount" integer NOT NULL,
"price" numeric(10,2) NOT NULL,
"created_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)
);
CREATE TABLE "CREDIT_PURCHASE" (
"id" uuid PRIMARY KEY NOT NULL DEFAULT (gen_random_uuid()),
"user_id" uuid NOT NULL REFERENCES "USER"(id),
"credit_package_id" integer NOT NULL REFERENCES "CREDIT_PACKAGE"(id),
"purchased_credits" integer NOT NULL,
"price_paid" numeric(10,2) NOT NULL,
"created_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),
"purchase_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)
);
```
## 題目一
**請先將 [11/25 每日任務的使用者題目](https://hackmd.io/@hexschool/r1Knh0lXke)加入到資料庫指令後,再行答題**
### 教練資料 ,資料表為 `COACH`
**1\. 新增**:在 `COACH` 資料表新增三筆資料,資料需求如下:
- 將用戶 `李燕容` 新增為教練,並且年資設定為2年(提示:使用 `李燕容` 的email ,取得 `李燕容` 的 `id` )
- 將用戶`肌肉棒子`新增為教練,並且年資設定為2年(提示:使用 `肌肉棒子` 的email ,取得 `肌肉棒子` 的 `id` )
- 將用戶`Q太郎`新增為教練,並且年資設定為2年(提示:使用 `Q太郎` 的email ,取得 `Q太郎` 的 `id` )
## 題目二:何謂一對多、一對一
### 解釋一對多關係
口訣:「多的要設定外來鍵」
流程:從欄位角度去規劃
1. 以「使用者」角度:一個「使用者」會有**多筆**購買紀錄
2. 以「購買紀錄」角度:一筆「購買紀錄」只會屬於 一個 使用者
➡️ 所以在「購買紀錄」表格(多的那方)設定外來鍵

```sql
-- 一對多(使用者 -> 購買紀錄)
CREATE TABLE "CREDIT_PURCHASE" (
"user_id" uuid NOT NULL REFERENCES "USER"(id), -- 多的那方加外來鍵
);
```
### 解釋一對一關係
**口訣:「外來鍵加唯一值」**
流程:從欄位角度去規劃
1. 以「使用者」角度:一個「使用者」最多只能是 **一個** 教練
2. 以「教練」角度:一個「教練」只能對應到 **一個** 使用者
**在雙方資料表都只能對應一個資訊時,則會是一對一的資料關係**
➡️ 所以在「教練」表格設定外來鍵,並加上 UNIQUE 限制
```sql
-- 一對一(使用者 <-> 教練)
CREATE TABLE "COACH" (
"user_id" uuid NOT NULL REFERENCES "USER"(id)
-- ...
UNIQUE("user_id") -- 外來鍵加唯一值
);`
```
`UNIQUE` 意思:表示此 `user_id` 在 `COACH` 資料表上不能重複,因為一個「教練」只能對應到 **一個** 使用者

## 題目二:使用者與部落格文章的資料表關係
請依照以下資料表線索,來分享:
1. 你的分析流程,如下
流程:從欄位角度去規劃
以「」角度:一個「」有 ? 個 「」
以「」角度:一個「」有 ? 個 「」
2. 依照上述描述,他是一對一關係、還是一對多?
`以「用戶」角度:一個「用戶」有 多 個 「文章」`
`以「文章」角度:一個「文章」有 1 個 「用戶」`
`所以文章設FK、用戶設PK`
3. 請下載下方資料表圖片後,用小畫家繪製線條(一對一**或**一對多)
>>> 一對多
```sql=
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE "USER" (
"id" uuid PRIMARY KEY NOT NULL DEFAULT (gen_random_uuid()),
"name" varchar(50) NOT NULL,
"email" varchar(320) UNIQUE NOT NULL,
"role" varchar(20) NOT NULL,
"created_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),
"updated_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)
);
CREATE TABLE "BLOG_POST" (
"id" uuid PRIMARY KEY NOT NULL DEFAULT (gen_random_uuid()),
"user_id" uuid NOT NULL REFERENCES "USER"(id),
"title" varchar(255) NOT NULL,
"content" text NOT NULL,
"featured_image_url" varchar(2048),
"category" varchar(20) NOT NULL,
"spend_minutes" smallint NOT NULL,
"created_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),
"updated_at" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)
);
```
