# 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. 專長(可複選) ![截圖 2024-11-26 下午11.40.24](https://hackmd.io/_uploads/BJOj3P7Q1g.png) ## 資料庫預設資訊與欄位介紹 ![Untitled](https://hackmd.io/_uploads/By78oDQ71g.png) ```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. 以「購買紀錄」角度:一筆「購買紀錄」只會屬於 一個 使用者 ➡️ 所以在「購買紀錄」表格(多的那方)設定外來鍵 ![截圖_2024-11-27_上午12_01_19](https://hackmd.io/_uploads/Skvz-d7mke.png) ```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` 資料表上不能重複,因為一個「教練」只能對應到 **一個** 使用者 ![截圖 2024-11-27 上午12.09.17](https://hackmd.io/_uploads/SyXRzOQQye.png) ## 題目二:使用者與部落格文章的資料表關係 請依照以下資料表線索,來分享: 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) ); ``` ![截圖_2024-11-27_上午12_12_06](https://hackmd.io/_uploads/S15sX_7m1x.png)