指南

什麼是資料庫?為應用程式建置者寫的指南

資料庫是應用程式用來儲存與讀取資訊的一個有組織的儲存區,例如它的使用者、訂單、預約與訊息。與只存在瀏覽器分頁中的資訊不同,資料庫中的資料在重新整理或重新啟動後依然存在,而且所有使用這個應用程式的人看到的都是相同的紀錄。大多數資料庫會把資料組織成資料表,很像試算表的工作表,但有嚴格的規則來維持資料的一致性。

為什麼使用 AI 建置時這很重要

使用 AI 建置時最常見的意外,是應用程式看起來已經完成,卻什麼都不記得。你新增了一位客戶,重新整理頁面,它就不見了。這通常代表應用程式把資料保存在瀏覽器的記憶體中,而不是資料庫裡。

資料庫也是許多重要決定的所在,不管你是否意識到:

  • 你記錄什麼。 如果你沒有儲存預約的狀態,就無法顯示哪些預約已取消。
  • 事物如何連結。 一位客戶能否有多筆預約,或一筆預約能否包含多項服務,決定了整個應用程式的形狀。
  • 誰能看到什麼。 大多數隱私問題,都出在使用者能讀取哪些紀錄上。

你不需要自己設計資料庫,但了解基本概念,能讓你清楚描述你的資料,並及早發現問題。

日常生活的比喻

想像一間管理良好的小型辦公室裡的檔案櫃。

每個抽屜裝一種東西:一個抽屜放客戶,一個放預約,一個放發票。每個抽屜裡,每個資料夾都遵循相同的格式,並填寫相同的欄位。每個資料夾都有唯一的參考編號,而當一張發票屬於某位客戶時,發票資料夾會記下那位客戶的編號,而不是把整份客戶檔案影印一份。

這就是關聯式資料庫。抽屜是資料表,資料夾是資料列,欄位是資料行,參考編號是主鍵,而指向另一個資料夾的註記就是外鍵。一位好的辦公室主管還會執行規則,例如不能沒有日期的預約、不能有兩位同編號的客戶,資料庫也是如此。

實例:沙龍預約應用程式

假設你請 AI 替一間美髮沙龍建一個預約網站。合理的資料庫會有四張資料表。

services(服務)

idnameduration_minutesprice
1剪髮4540.00
2染髮9095.00

staff(員工)

idnameemail
1Sarasara@example.com
2Omaromar@example.com

customers(客戶)

idnameemailphone
101Lena Parklena@example.com555-0100

bookings(預約)

idcustomer_idservice_idstaff_idstarts_atstatus
5001101122026-10-03 14:00confirmed

看看 bookings 這張資料表。它沒有把 Lena 的姓名和電話複製到每一筆預約中,而是儲存 customer_id = 101。如果 Lena 更改電話號碼,只需在一個地方更新,每筆預約就都會顯示新號碼。這就是關聯式資料庫的核心概念:每個事實只存一次,然後用連結去引用它。

同樣的結構也能回答實用的問題:

  • 「Omar 週五哪些時段是空的?」——查看 Omar 當天的預約。
  • 「本月染髮服務賺了多少?」——把預約與服務連接起來,並加總價格。
  • 「哪些客戶九十天內沒有預約?」——比對客戶與他們最近的一筆預約。

常用術語說明

術語意義
資料表(Table)同一類紀錄的集合,例如客戶或預約。
資料列 / 紀錄(Row / record)資料表中的一項,例如一位客戶、一筆預約。
資料行 / 欄位(Column / field)每一列都有的一項資訊,例如電子郵件或價格。
主鍵(Primary key)每一列的唯一 ID,通常是數字或隨機字串。
外鍵(Foreign key)指向另一張資料表某一列的欄位,例如預約中的 customer_id。
結構描述(Schema)整體設計:有哪些資料表、各自的欄位,以及彼此如何連結。
查詢(Query)讀取或修改資料的請求,例如「明天所有的預約」。
SQL結構化查詢語言(Structured Query Language),查詢關聯式資料庫的標準語言。
遷移(Migration)可以儲存並重複執行的結構描述變更,例如新增一個欄位。
索引(Index)讓某個欄位的搜尋更快的查找結構,就像書的索引。
CRUD建立(Create)、讀取(Read)、更新(Update)、刪除(Delete),是應用程式處理資料的四種基本操作。
備份(Backup)資料的副本,發生問題時可以用來還原。

資料庫的類型

類型儲存資料的方式範例適合用於
關聯式(SQL)具有固定欄位、彼此連結的資料表Postgres、MySQL、SQLite大多數商業應用程式:預約、商店、CRM、SaaS
文件式(NoSQL)有彈性的類 JSON 文件MongoDB、Firestore每筆紀錄的結構差異很大的資料
鍵值(Key-value)以鍵儲存的值Redis快取、工作階段等短期資料

對於創業者或小型企業首先要建置的幾乎所有東西,關聯式資料庫都是安全的預設選擇。

資料庫在應用程式中的位置

訪客不會直接與資料庫溝通。他們瀏覽器中的頁面(前端)會向你的伺服器(後端)要資料,通常透過 API。伺服器會檢查是誰在請求,以及是否有權限,然後查詢資料庫,只把該使用者應該看到的內容回傳。

這個中間步驟很重要。如果瀏覽器可以直接以完整權限查詢資料庫,任何人只要打開開發者工具,就能讀取所有資料。

常見錯誤與誤解

  • 把資料只存在瀏覽器裡。 瀏覽器儲存空間(例如 localStorage)只存在於一台裝置、一個瀏覽器中。記住篩選條件還可以,但訂單不行。
  • 把所有東西塞進同一張資料表。 一張「預約」表,每一列都複製了客戶的姓名、電話與服務價格,很快就會不同步。
  • 以純文字儲存密碼。 密碼應該經過雜湊處理,絕不能以可讀的形式儲存。請參閱什麼是驗證。
  • 資料沒有規則。 如果沒有必填欄位與唯一性規則,你最後會得到沒有日期的預約與重複的客戶。
  • 忘了考慮刪除。 要先決定刪除客戶時,是否也刪除他的預約、保留預約,還是直接禁止刪除。
  • 用正式資料做實驗。 先在安全的地方測試有風險的變更,並保留備份。
  • 永遠把試算表當成資料庫。 試算表很適合剛開始時使用,但面對許多同時使用者與權限控管時會力不從心。請參閱如何把試算表變成應用程式。

該向你的 AI 建置工具要求什麼

  • 「把這些存進資料庫,不要存在瀏覽器中。請告訴我你會建立哪些資料表。」
  • 「用簡單的表格向我展示結構描述:每張資料表、它的欄位,以及它們如何連結。」
  • 「一位客戶可以有多筆預約;每筆預約只對應一項服務和一位員工。」
  • 「客戶的電子郵件必填且唯一。」
  • 「阻止同一位員工的兩筆預約時間重疊。」
  • 「只有已登入的擁有者能讀取所有預約;客戶只能看到自己的預約。請在伺服器端強制執行這項規則。」
  • 「刪除服務時,不要刪除過去的預約,請改為將該服務標示為停用。」

Mythex 中的資料庫

當你的應用程式需要儲存資料時,Mythex 會在專案中加入一個專用的 Postgres 資料庫。你可以在聊天中提出需求(「把候補名單的報名資料存進資料庫」),也可以使用 /database 指令。連線資訊會自動傳給你的應用程式,代理會建立資料表。資料庫在五分鐘閒置後會進入休眠,並在下一次請求時喚醒;已發布的用量,則依資料庫醒著的時間計費,並從與建置相同的點數餘額中扣除。免費方案與 Pro 方案都可以使用。細節請參閱資料庫文件,而應用程式範本也提供了以資料為基礎的起點。

常見問題

用簡單的話說,什麼是資料庫?

資料庫是一個有組織的資訊儲存區,應用程式可以寫入與讀取,例如使用者、訂單或預約。與只存在瀏覽器分頁中的資料不同,資料庫中的資料在重新整理、重新啟動後,或從另一台裝置打開應用程式時,依然都在。

試算表是資料庫嗎?

試算表可以存放同樣類型的資料,但它不是為應用程式設計的。真正的資料庫會強制規範每一欄應該放什麼,可靠地把資料表彼此連結,能同時處理許多人寫入,並控制誰可以讀取什麼。

SQL 與 NoSQL 資料庫有什麼不同?

SQL(關聯式)資料庫,例如 Postgres 與 MySQL,把資料存在具有固定欄位與彼此關聯的資料表中。NoSQL 資料庫,例如 MongoDB,則儲存較有彈性的文件。大多數商業應用程式(預約、CRM、商店)都很適合關聯式模型。

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

如果它需要記住使用者輸入的任何內容,例如註冊、訂單、訊息或設定,並且之後要顯示出來或讓其他人看到,那就需要。純資訊型、沒有會儲存資料的表單的網站,通常不需要。

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 简体中文 繁體中文(香港)