指南

如何為你的應用程式加入資料庫(避免日後資料遺失)

要為你的應用程式加入資料庫,請選擇一個託管的關聯式資料庫(通常預設為 Postgres),將連線字串保存在伺服器端的機密設定中,為你的應用程式儲存的每一類事物建立一個資料表,並讓你的後端(而不是瀏覽器)負責讀寫資料庫。如果你使用 AI 應用程式建置工具,通常只要說「把這個存到資料庫」,代理程式就會設定資料表和程式碼;你的工作是清楚描述資料,並確認資料真的有被保存。

本指南涵蓋何時需要資料庫、主要選項、如何描述你的資料,以及會導致資料遺失或外洩的錯誤。

你的應用程式何時需要資料庫

當你的應用程式必須在頁面關閉後記住某些東西,或在人與人之間共享資料時,就需要資料庫。常見的徵兆包括:

  • 訪客提交東西:表單、註冊、預約或訂單
  • 使用者擁有帳號,並保存自己的內容
  • 管理員需要查看或編輯其他人建立的內容
  • 你想要隨時間推移的報表或統計數字

如果是所有人看到相同內容的靜態網站(例如作品集或簡單的著陸頁),就不需要資料庫。如果你不確定資料庫到底是什麼,請先閱讀什麼是資料庫。

你的選項

選項說明適合取捨
應用程式建置工具內建的資料庫為你的專案建立並連接好的資料庫大多數用 AI 建置工具做的應用程式綁定該平台的託管;匯出與備份取決於平台
託管的 Postgres 或 MySQL你另外註冊的託管關聯式資料庫自行託管的應用程式,或多個服務共用的情況你需要自己管理金鑰、連線數上限與方案
後端即服務(Backend-as-a-service)資料庫加上身分驗證、儲存與 API,一次到位前端為主、想要現成登入功能的應用程式需要學習更多廠商專屬的概念
文件型(NoSQL)資料庫儲存彈性的類 JSON 文件結構非常不規則的資料關聯與報表較困難
用試算表當資料庫透過 API 使用 Google Sheets 或類似工具小型內部工具、原型速度慢、沒有真正的限制,同時編輯時容易出問題

對大多數中小型網頁應用程式來說,Postgres 這類關聯式資料庫是正確的預設選擇。它擅長處理關聯(一位客戶有多筆訂單),能維持資料一致性,之後也可以用 SQL 回答各種問題。想要白話的概述,請參考什麼是 Postgres。

在建置前先描述你的資料

你能做的最有用的事,就是寫下你的應用程式要儲存的事物,以及它們如何彼此相連。你不需要資料庫術語。以預約應用程式為例:

  • 客戶: 姓名、電子郵件、電話
  • 服務項目: 名稱、時長、價格
  • 預約: 哪位客戶、哪項服務、開始時間、狀態(待確認、已確認、已取消)

這樣就是三個資料表。「哪位客戶」和「哪項服務」會變成彼此之間的連結(外部鍵)。越早把這件事弄對越重要,遠比選擇哪種技術更關鍵,因為要改變已經有真實資料列的資料結構,比改變頁面版面困難得多。

幾條實用的經驗法則:

  • 每一類事物一個資料表。 不要把訂單塞進客戶身上的一個文字欄位。
  • 每一列都要有 ID 和建立時間。 之後你一定會需要它們。
  • 使用正確的型別。 日期就存成日期,金額存成整數的分或小數型別,不要存成文字。
  • 把必填欄位標示為必填。 讓資料庫拒絕不良資料,而不只是靠表單檢查。

提示詞範例

一次只做一個功能,而不是一次丟出整個結構描述:

為這個應用程式加入資料庫。建立一個 bookings 資料表,包含客戶姓名、電子郵件、服務項目、開始時間和狀態(待確認、已確認、已取消;預設為待確認)。將預約表單的提交內容儲存到這個資料表,顯示成功訊息,並新增一個管理頁面,依最新排序列出所有預約。

接著擴充它:

新增 services 資料表(名稱、時長(分鐘)、價格(分))。把預約上自由填寫的服務欄位,改成連結到 services 的關聯,並遷移既有的預約資料,但不要刪除任何資料。

再加強安全性:

確保所有資料庫的讀寫都在伺服器端進行。瀏覽器絕對不能拿到資料庫連線字串。在寫入前,先在伺服器端驗證電子郵件和開始時間。

逐步操作

  1. 列出你的資料:如上所述,列出事物、欄位,以及它們之間的關聯。
  2. 建立資料庫。 在 AI 建置工具中,直接在對話中要求即可。其他情況下,建立一個託管的 Postgres 實例並複製它的連線字串。
  3. 將連線字串存成機密(伺服器上的環境變數),絕不寫在程式碼裡。參考環境變數與機密。
  4. 建立資料表。 使用 migration(可版本化的腳本,用來變更結構描述),讓變更可以重複執行,也能還原。
  5. 建立伺服器路由,負責新增、讀取、更新和刪除資料列(CRUD)。瀏覽器呼叫這些路由,絕不直接與資料庫溝通。
  6. 將 UI 連接到這些路由:負責儲存的表單、負責載入的清單,以及沒有資料時的空白狀態。
  7. 測試持久性。 提交一筆資料,重新整理頁面,再用另一個瀏覽器開啟。如果資料不在,代表它並沒有儲存到資料庫。
  8. 檢查存取權限。 以第二位使用者登入,確認你看不到或編輯不了第一位使用者的資料。
  9. 發布,然後在正式網址上再測試一次,因為已發布的應用程式可能使用與預覽不同的連線。

常見錯誤

  • 存到瀏覽器就以為已經儲存。 localStorage 在你自己的電腦上看起來運作正常,但換一台裝置打開應用程式就不見了。務必用第二個瀏覽器測試。
  • 把連線字串放在前端程式碼裡。 任何人都能讀取前端程式碼,這等於把整個資料庫交給他們。
  • 沒有存取權限檢查。 「顯示我的訂單」必須在伺服器端依登入的使用者篩選,而不是在 UI 裡篩選。這是 AI 製作的應用程式中最常見的安全漏洞;我們的AI 建置應用程式安全檢查清單涵蓋了這一點。
  • 破壞性的結構變更。 要求「重新命名資料表」或「改變結構」,可能會直接刪除並重建資料表。當已有真實資料時,請說「遷移既有資料列,不要刪除任何東西」。
  • 把檔案存在資料庫裡。 圖片和 PDF 應存放在檔案儲存空間,資料表中只存它們的 URL 或金鑰。參考如何為應用程式加入檔案上傳。
  • 沒有備份。 在有客戶之前,就要先了解平台如何備份資料,以及如何還原。

檢查清單

  • 每一類事物都有自己的資料表,並含 ID 與建立時間
  • 必填欄位與型別由資料庫強制執行
  • 連線字串只存在伺服器端的機密中
  • 所有讀寫都透過伺服器路由進行
  • 每位使用者只能讀取和修改自己的資料列
  • 重新整理後資料仍在,並能在另一個瀏覽器中看到
  • 結構變更使用 migration,並保留既有資料列
  • 你知道備份與還原如何運作
  • 發布後已在正式版應用程式上測試過

在 Mythex 中加入資料庫

在 Mythex 上,每個專案都可以取得自己專屬的 Postgres 資料庫,免費方案和 Pro 方案皆可。你通常不需要點選獨立的「附加」按鈕:在對話中提出需求(例如「把候補名單的電子郵件存到資料庫」),或輸入 /database,連線資訊就會注入到工作區和你已發布的應用程式中。專案設定會顯示資料庫是否已啟用。

資料庫閒置 5 分鐘後會進入休眠,收到下一個請求時會再喚醒。已發布的使用量,會依資料庫實際醒著的時間計費,並從你建置時使用的同一點數餘額中扣除。如果你是在已經發布之後才加入資料庫,請重新發布,讓正式版應用程式接上它。

參閱文件中的資料庫和建立 CRUD 應用程式食譜。若想了解每位使用者資料的登入部分,請閱讀如何為應用程式加入登入功能。

常見問題

我的應用程式需要資料庫嗎?

只要應用程式必須在訪客離開後仍記住某些東西,或要在使用者之間共享資料,就需要。例如註冊、訂單、預約、貼文或設定。只給所有人看相同內容的靜態網站則不需要。

小型網頁應用程式應該用哪種資料庫?

對大多數小型網頁應用程式來說,Postgres 這類關聯式資料庫是安全的預設選擇。它能很好地處理使用者、訂單、關聯與報表,支援廣泛,而且在小規模下幾乎不會不夠用。

我可以把資料存在瀏覽器裡,不用資料庫嗎?

localStorage 之類的瀏覽器儲存只存在於單一裝置、單一瀏覽器中,使用者隨時可以清除。它適合用來存主題選擇這類偏好設定,但不適合需要日後讓你或其他使用者查看的資料。

Mythex 有包含資料庫嗎?

有。Mythex 專案在免費方案和 Pro 方案上都能取得專屬的 Postgres 資料庫。你可以在對話中提出需求,或使用 /database 指令,連線資訊會自動注入。使用量從與建置相同的點數餘額中扣除。

Mythex · Pricing · 用 AI 打造任何東西 · 網站與應用程式範本 · Mythex 比較 · AI 應用程式開發詞彙表 · 免費的 AI 應用程式開發工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港)