42. 設計資料庫 schema
我要設計〔專案,例如:一個線上課程平臺〕,需要儲存這些東西:〔例如:學員、課程、報名紀錄〕。請幫我設計資料庫結構(schema):每一種資料該有哪些欄位、各是什麼型態、彼此之間怎麼關聯(例如一個學員可以報名多門課)。請用白話解釋你的設計,並提醒我有沒有漏掉常見會用到的欄位。
資料結構是地基,蓋歪了以後很難改。花時間跟 AI 對這一步,並主動問「我以後想加 X 功能,現在的設計擋不擋得住」。
《零基礎學 Vibe Coding》讀者專區
作者現身說法:vista.tw 流量分析與名單管理系統
把方括號〔〕裡的內容換成你自己的情況,整段複製貼給 AI 就能用。
我要設計〔專案,例如:一個線上課程平臺〕,需要儲存這些東西:〔例如:學員、課程、報名紀錄〕。請幫我設計資料庫結構(schema):每一種資料該有哪些欄位、各是什麼型態、彼此之間怎麼關聯(例如一個學員可以報名多門課)。請用白話解釋你的設計,並提醒我有沒有漏掉常見會用到的欄位。
資料結構是地基,蓋歪了以後很難改。花時間跟 AI 對這一步,並主動問「我以後想加 X 功能,現在的設計擋不擋得住」。
我的資料表〔表名與欄位說明〕。我想查出「〔用白話描述你要什麼,例如:這個月報名人數最多的前五門課,含各自的報名人數〕」。請幫我寫出這段查詢,並逐句用白話解釋它在做什麼,讓我看得懂、以後能自己微調。如果有更有效率的寫法也請告訴我。
查詢用白話描述你要的結果最好,別自己猜語法。重點是請 AI 逐句解釋,這樣你會慢慢看懂,而不是永遠只能複製貼上。
請幫我建立一個 API 端點(endpoint),功能是「〔做什麼,例如:接收前端送來的報名資料,存進資料庫,回傳成功或失敗〕」。請說明這個端點的網址、該用哪種請求方式、前端要送什麼格式的資料、會收到什麼回應。並幫我加上基本的錯誤處理(例如資料不完整時回傳清楚的錯誤訊息)。
把 API 想成點餐窗口:前端遞單子(送資料)進去,後端把菜(回應)端出來。講清楚送什麼、回什麼,這個窗口就打通了。
我想在我的專案裡串接〔某個外部服務,例如:把地址轉成地圖座標的服務〕。請先幫我規劃:這類服務常見的選擇有哪些、串接大致要哪些步驟、我需要去申請什麼、免費額度大概到哪、要注意什麼限制。金鑰我會自己申請保管,你在程式裡需要用到的地方請留〔佔位符〕並註明。
串接外部服務前,先問免費額度到哪、超過會怎樣?很多新手不小心接了會計費的服務,用一用才發現帳單來了。
我有一些機密資訊(例如 API 金鑰、資料庫密碼)需要在程式裡使用,但我知道不能直接寫死在程式碼裡。請用零基礎能懂的方式教我:什麼是環境變數(environment variable)、為什麼機密要放在這裡、我該怎麼設定、以及要怎麼確保它不會不小心被上傳到公開的地方。請幫我把專案設定成正確的做法。
金鑰寫死在程式碼裡、又推上公開的地方,是新手最貴的一課(可能被盜刷)。務必一開始就把環境變數+不上傳機密這件事做對。
前端表單雖然有做檢查,但我知道不能只信任前端。請幫我在後端(收到資料、存進資料庫之前)也加一層驗證:檢查〔必填欄位有沒有缺、格式對不對、數字有沒有在合理範圍、有沒有奇怪的內容〕。驗證不過就擋下來、回傳清楚的錯誤,不要讓髒資料進到資料庫。
請謹記這句話:「永遠不要只相信前端的檢查。」前端驗證是為了體驗,後端驗證才是真正的防線,因為前端的檢查是能被繞過的。
我的〔某個功能,例如:首頁的熱門文章排行〕每次載入都要重新計算,有點慢。這份資料其實不用即時、每〔10 分鐘〕更新一次就好。請幫我加上快取(cache):把結果暫存起來,時間內直接用暫存的,時間到了再重算。請用白話解釋你的做法,並提醒我快取可能帶來的副作用(例如資料會有點延遲)。
快取是用一點點資料新鮮度,換很多速度。先確認這份資料晚幾分鐘更新有沒有關係,如果沒關係的才適合快取,會即時變動的資料別亂快取。
我想讓〔某件事,例如:每天早上 9 點自動寄出前一天的報名統計信〕自動定時執行。請幫我規劃這個排程任務(scheduled task):該用什麼方式設定、要執行什麼、失敗了怎麼辦(例如要不要重試、要不要通知我)。請用零基礎能懂的方式解釋,並提醒我測試時該怎麼確認它真的有照時間跑。
排程任務最怕你以為它有跑,其實默默失敗了。一定要問 AI 失敗時怎麼通知我,別讓它在背後無聲無息地掛掉。
我需要〔要做的變更,例如:在現有的客戶資料表新增一個來源管道欄位,並把舊資料的這個欄位預設為「其他」〕。這裡面已經有正在使用的真實資料,我很怕改壞。請幫我規劃一個安全的資料遷移(migration)步驟:先做什麼、怎麼備份、怎麼驗證改完後資料沒問題、萬一出錯怎麼還原。
動到真實資料前,第一件事永遠是先備份。就像遊戲打魔王前先存檔,出事了才有回頭路。務必請 AI 把備份和還原步驟寫進去。寫程式遇到出錯,不是你笨,是全世界工程師的日常。真正的差別在於會不會求救:把問題描述清楚的人,AI 三兩下就幫他解決;描述得含糊的人,來回半天還在鬼打牆。這一關教你怎麼把卡關的情況講到 AI 一聽就懂,就像你去看醫生,症狀說得愈準,愈快對症下藥。
找不到一模一樣的沒關係,抓錯誤訊息的關鍵字對大方向就行。 完整清單與萬能救援句在卡關 FAQ。
connection refused / could not connect to database我的程式出現 `connection refused`,連不上資料庫。請帶我逐項排查:資料庫服務有沒有在跑、連線設定(主機、埠號、帳號、密碼、資料庫名稱)對不對、是不是被防火牆擋。我用的資料庫是〔資料庫種類,例如 PostgreSQL、MySQL 或 Supabase〕。
先確認資料庫本身有沒有在運作?本機的資料庫常常只是忘了啟動,雲端的則要確認連線字串一字不差。
migration failed(資料表建置/更新失敗)我跑資料庫 migration 時失敗,訊息如下。請幫我看懂它卡在哪一步、為什麼,最安全的處理方式是什麼(尤其我不想弄丟現有資料)。訊息:〔貼上整段〕。我用〔資料庫或工具名〕。
涉及 migration 一定要小心,動到的是真實資料。跟 AI 強調「我不想弄丟資料」,請它先解釋清楚再動手,重要資料先備份。
schema 不一致(drift,程式跟資料庫對不上)我遇到程式跟資料庫對不上的問題(它說某欄位不存在/型別不符,但我以為改過了)。請幫我判斷是不是「我改了定義但沒同步到資料庫」,並帶我確認兩邊目前的實際結構、怎麼把它們對齊。我用〔工具名,例如 Prisma、Drizzle、Supabase〕。
這種「明明改了卻沒生效」的問題,先分清楚你改的是程式裡的定義,還是資料庫的實際結構?兩者要同步,光改一邊不夠。
syntax error at or near "xxx"(SQL 語法錯誤)我執行這段 SQL 時出現 `syntax error at or near ``"``〔它指的那個字〕``"`。請幫我找出文法錯在哪、改好給我。我用的資料庫是〔種類〕。這是我的 SQL:〔貼上整段查詢〕。
不同資料庫的 SQL 有小差異。一定要跟 AI 講清楚你用哪一種(PostgreSQL、MySQL、SQLite...),它才能給對版本的寫法。
foreign key constraint 或 unique constraint 衝突我在〔新增/刪除〕資料時出現 `〔``unique``/``foreign`` key``〕`` constraint` 衝突。請用白話解釋這條規矩在保護什麼,並幫我判斷正確的做法是什麼(例如是不是該先檢查有沒有重複、或先處理關聯的資料)。完整訊息:〔貼上〕。
這類錯誤其實是資料庫在幫你把關,避免髒資料。別想著硬繞過限制,先問 AI這條規矩想擋的是什麼,順著它做才安全。這一區是這份手冊最想補給你的部分。前面八區都在講程式的錯,但當你用 Claude Code、Codex 或 Antigravity 這類會自己動手做事的 AI 工具時,卡關的常常是 AI 這個夥伴本身:它改壞了、它鑽牛角尖、它說謊或是連不上。這些書裡不會教,但你天天會遇到。這一區教你怎麼管理你的 AI 夥伴。