如何為你的應用程式加入資料庫(資料不會日後遺失的做法)
要為應用程式加入資料庫,請選擇一個託管的關聯式資料庫(通常預設為 Postgres),把連線字串存放在伺服器端的機密設定中,為你的應用程式儲存的每一類事物各建一張資料表,並讓後端(而不是瀏覽器)負責讀寫資料庫。如果你使用 AI 應用程式生成工具,通常只需說一句「把這些資料儲存到資料庫」,代理便會建立資料表與程式碼;你的工作是清楚描述資料,並確認資料真的被保存。
本指南涵蓋何時需要資料庫、主要選擇、如何描述你的資料,以及導致資料遺失或外洩的錯誤。
你的應用程式何時需要資料庫
當應用程式必須在頁面關閉後記住某些資料,或在人與人之間共用資料時,就需要資料庫。常見的情況包括:
- 訪客提交資料:表格、註冊、預約、訂單
- 用戶擁有帳戶,並保存自己的內容
- 管理員需要查看或編輯其他人建立的內容
- 你需要隨時間統計的報表或數字
如果是所有人看到相同內容的靜態網站,例如作品集或簡單的宣傳頁,則不需要資料庫。如果你不確定資料庫究竟是什麼,請先閱讀什麼是資料庫。
你的選擇
| 選擇 | 是什麼 | 適合 | 須留意 |
|---|---|---|---|
| AI 應用程式生成工具內建的資料庫 | 為你的專案建立並連接好的資料庫 | 大多數用 AI 生成工具建立的應用程式 | 綁定該平台的託管服務;匯出和備份取決於平台 |
| 託管 Postgres 或 MySQL | 你另行註冊的託管關聯式資料庫 | 自行託管的應用程式,或多個服務共用的資料庫 | 你需要自行管理金鑰、連線數上限和方案 |
| 後端即服務 | 資料庫加上登入、儲存空間和 API,全部在同一產品內 | 重視前端、希望直接使用現成登入功能的應用程式 | 需要學習較多供應商專屬的概念 |
| 文件型(NoSQL)資料庫 | 儲存彈性的類 JSON 文件 | 結構非常不規則的資料 | 關係和報表較難處理 |
| 用試算表當資料庫 | 透過 API 使用 Google Sheets 或類似工具 | 小型內部工具、原型 | 速度慢、沒有真正的約束,同時編輯時容易出錯 |
對大多數中小型網絡應用程式來說,Postgres 這類關聯式資料庫是合適的預設選擇。它擅長處理資料關係(一位客戶有多筆訂單)、維持資料一致,並讓你日後可以用 SQL 查詢問題。如需淺白的概覽,請參閱什麼是 Postgres。
建造前先描述你的資料
最有用的做法,是先寫下應用程式要儲存的事物,以及它們之間如何連結。你不需要資料庫術語。以預約應用程式為例:
- **客戶:**姓名、電郵、電話
- **服務:**名稱、時長、價錢
- **預約:**屬於哪位客戶、哪項服務、開始時間、狀態(待確認、已確認、已取消)
這樣就有三張資料表。「哪位客戶」和「哪項服務」會成為彼此之間的連結(外來鍵)。及早做好這一步,遠比任何技術選擇重要,因為一旦資料表已有真實資料,要改變其結構比改變頁面版面困難得多。
幾條實用原則:
- **每類事物各用一張資料表。**不要把訂單塞進客戶的一個文字欄位。
- **每一筆資料都要有 ID 和建立時間。**日後你一定會用到。
- **使用正確的資料類型。**日期就存為日期,金額就以整數的仙(分)或小數類型儲存,不要存成文字。
- **把必填欄位標示為必填。**讓資料庫拒絕不良資料,而不只是靠表格把關。
例子提示詞
每次先處理一項功能,不要一次過丟出整份結構:
為這個應用程式加入資料庫。建立一張 bookings 資料表,包括客戶姓名、電郵、服務、開始時間和狀態(待確認、已確認、已取消;預設為待確認)。把預約表格的提交內容儲存到這張資料表,顯示成功訊息,並加入一個管理頁面,按最新排序列出所有預約。
之後再擴充:
加入 services 資料表(名稱、時長(以分鐘計)、價錢(以仙計))。把預約中自由輸入的服務欄位,改為連結到 services,並在遷移現有預約時不要刪除任何資料。
再加強要求:
確保所有資料庫的讀寫都在伺服器端進行。瀏覽器絕不可以收到資料庫連線字串。在插入資料之前,先在伺服器端驗證電郵和開始時間。
逐步進行
- 列出你的資料,如上所述:事物、欄位、事物之間的連結。
- **建立資料庫。**在 AI 生成工具中,直接在對話裡提出要求;其他平台則建立託管的 Postgres 執行個體,並複製其連線字串。
- 把連線字串儲存為機密(伺服器上的環境變數),切勿寫在程式碼中。請參閱環境變數與機密。
- **建立資料表。**使用遷移(migration),即用來改動結構的版本化腳本,令每次改動都可重複執行、可還原。
- 建立伺服器路由,負責新增、讀取、更新和刪除資料列(CRUD)。瀏覽器呼叫這些路由,而不是直接連接資料庫。
- **把介面連接到這些路由。**儲存資料的表格、載入資料的清單,以及尚無資料時的空白狀態。
- **測試資料是否真的保存。**提交一筆資料,重新載入頁面,再用另一個瀏覽器開啟。如果資料不見了,代表它並未存入資料庫。
- **檢查存取權限。**以第二位用戶登入,確認你無法看見或修改第一位用戶的資料。
- 發布後再次測試正式網址,因為已發布的應用程式可能使用與預覽環境不同的連線。
常見錯誤
- **存到瀏覽器就以為已經儲存。**localStorage 看似運作正常,直到有人在另一部裝置上開啟應用程式才會發現問題。一定要用第二個瀏覽器測試。
- **把連線字串放在前端程式碼中。**任何人都可以讀取前端程式碼,這等於把整個資料庫交給他們。
- 沒有存取檢查。「顯示我的訂單」必須在伺服器端按登入用戶篩選,而不是在介面上篩選。這是 AI 生成應用程式中最常見的安全漏洞;我們的安全檢查清單有相關說明。
- **破壞性的結構改動。**要求「重新命名資料表」或「更改結構」,可能會刪除並重建資料表。當已有真實資料時,請明確說明「遷移現有資料列,不要刪除任何東西」。
- **把檔案存在資料庫中。**圖片和 PDF 應存放在檔案儲存空間,資料表中只保存它們的 URL 或鍵。詳見如何為應用程式加入檔案上傳。
- **沒有備份。**在有客戶之前,先了解平台如何備份資料,以及如何還原。
檢查清單
- 每一類事物都有自己的資料表,並包含 ID 和建立時間
- 必填欄位和資料類型由資料庫強制執行
- 連線字串只存放在伺服器端的機密中
- 所有讀寫都經過伺服器路由
- 每位用戶只能讀取和修改自己的資料列
- 資料在重新載入後仍然存在,並能在另一個瀏覽器中看到
- 結構改動使用遷移,並保留現有資料列
- 你清楚知道備份和還原的運作方式
- 發布後已測試正式運行的應用程式
在 Mythex 加入資料庫
在 Mythex,每個專案都可以取得自己的專用 Postgres 資料庫,免費及 Pro 方案均適用。你通常不需要另外按「附加」按鈕:在對話中提出要求(例如「把候補名單的電郵儲存到資料庫」),或輸入 /database,連線資料便會注入工作區及已發布的應用程式。專案設定會顯示資料庫是否已啟用。
資料庫閒置 5 分鐘後會進入休眠,並在下一個請求時喚醒。已發布的用量,按資料庫實際醒着的時間計費,並從你建立應用程式時使用的同一個點數餘額扣除。如果你在發布後才加入資料庫,請重新發布,讓正式應用程式使用它。
詳情請參閱文件中的資料庫,以及建立 CRUD 應用程式的範例。關於按用戶保存資料的登入部分,請參閱如何為應用程式加入登入功能。
常見問題
我的應用程式需要資料庫嗎?
只要應用程式需要在訪客離開後仍記住某些資料,或在用戶之間共用資料,就需要。例如註冊、訂單、預約、帖文或設定。如果只是向所有人顯示相同內容的靜態網站,例如作品集或簡單的單頁網站,則不需要。
小型網絡應用程式應該用哪個資料庫?
對大多數小型網絡應用程式來說,Postgres 這類關聯式資料庫是穩妥的預設選擇。它能妥善處理用戶、訂單、資料關係及報表,支援廣泛,而且在小規模使用時很少會不敷應用。
我可以把資料存在瀏覽器裡,而不用資料庫嗎?
localStorage 之類的瀏覽器儲存空間只存在於同一部裝置、同一個瀏覽器中,用戶隨時可以清除。它適合保存主題選擇之類的偏好設定,但不適合存放你或其他用戶日後需要查看的資料。
Mythex 有包括資料庫嗎?
有。Mythex 專案在免費及 Pro 方案下都可以獲得自己的專用 Postgres 資料庫。你可以在對話中提出要求,或使用 /database 指令,連線資料會自動注入。用量與建立應用程式時使用的同一個點數餘額一併扣除。