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