指南

什麼係 Postgres?好多 app 背後嘅資料庫,淺白解說

Postgres(正式名稱 PostgreSQL)係免費、開源嘅關聯式資料庫:一個將 app 資料儲存喺有行同列嘅資料表入面、將資料表互相連結,並且用一種叫 SQL 嘅語言回答有關問題嘅程式。佢以可靠、嚴格保持資料正確,以及彈性足以處理由一張報名清單到大公司紀錄嘅一切見稱。好多網頁 app,以及好多託管呢啲 app 嘅服務,都係建基於佢之上。

用 AI 寫嘢時點解重要

當 AI app builder 為你個項目加入「一個資料庫」,好大機會就係 Postgres。你唔使寫 SQL 都可以用到佢,但明白少少就會有好大幫助:

  • 你可以用資料庫需要嘅形狀描述資料。 「客戶有多張訂單;每張訂單有多件貨品」可以直接翻譯成資料表。
  • 你可以要求正確嘅保護。 只要 AI 設定咗規則,Postgres 本身就可以拒絕壞資料,例如重複嘅電郵,或者一張指向唔存在客戶嘅訂單。
  • 你可以睇到 AI 做咗咩。 資料表名稱、欄位同關係,喺資料表檢視器入面好容易核對,就算你從來都唔郁程式碼。

日常比喻:一間非常嚴格嘅檔案室

想像一間檔案室,每種嘢都有一個櫃:一個放客戶,一個放訂單,一個放產品。每個抽屜入面嘅每張卡片,都有相同印好嘅格仔要填。每張卡片都有一個獨一無二嘅編號,而一張訂單卡唔會重複客戶嘅資料,只會寫「客戶 #214」,指向客戶櫃。

負責人好嚴格。如果一張訂單指向一個唔存在嘅客戶,佢唔會收檔;如果一個必填嘅日期格仔留空,佢唔會接受嗰張卡片;而如果你叫佢將錢由一個帳戶卡轉去另一個,佢要麼兩邊都做,要麼兩邊都唔做——絕對唔會只做一半。

嗰位負責人就係 Postgres。抽屜就係資料表,印好嘅格仔就係欄位,每張卡片就係一行,而「客戶 #214」嗰個連結就係外鍵(foreign key)。

Postgres 擅長嘅嘢

功能白話解釋
資料表同關係資料儲存喺一個個資料表入面,彼此互相指向,所以唔會將同一樣嘢複製五次
SQL一種標準語言,用嚟提問:「上個月所有未付款嘅訂單,最新嘅排喺前面」
交易(Transactions,ACID)一組改動要麼全部發生,要麼全部唔發生,即使伺服器中途當機都一樣
約束(Constraints)資料庫自己執行嘅規則:必填欄位、唯一電郵、資料表之間有效嘅連結
索引(Indexes)查找捷徑,等資料表增長之後搜尋都仍然快
JSONB當固定結構唔適合時,喺一個欄位入面儲存彈性、類似文件嘅資料
全文搜尋簡單情況下,唔使另外一個搜尋服務,就可以喺文字欄位入面搜尋字詞
擴充(Extensions)附加功能,例如用於地圖同位置嘅 PostGIS,或者用於儲存 AI embeddings 嘅 pgvector
Row-level security(行級安全)資料庫入面嘅規則,控制某個用戶可以睇邊啲行

Postgres 原本係 1980 年代加州大學伯克利分校嘅一個研究項目,自 1990 年代以嚟就由全球社群公開開發。咁悠久嘅歷史,正正係佢成為常見預設選擇嘅原因:有完整文件、支援廣泛,而且每個主要雲端服務商都提供託管版本。

實例:將試算表變成資料表

假設你經營一間細型飲食承辦生意,所有嘢都記喺一張試算表入面:每一行係一項活動,有客人嘅名字、電話、電郵、日期、菜單項目同價錢。

問題好快就出現。同一位客人喺六行出現,而且有兩個唔同電話號碼。菜單項目全部打喺一格入面,寫住「canapés x40, salad x2」,所以你冇辦法計出今個月總共做咗幾多份 canapés。

用 Postgres,同一批資料會變成四個資料表:

資料表欄位備註
clientsid, name, phone, email電郵必須唯一
eventsid, client_id, date, venue, statusclient_id 必須對應一個真實客戶
menu_itemsid, name, unit_price每道菜一行
event_itemsevent_id, menu_item_id, quantity將活動同菜式連結,並記錄數量

而家,客人嘅電話只儲存喺一個地方。「三月份我哋做咗幾多份 canapés?」就係一條 SQL 查詢。而當你連同項目一齊記錄一個新活動,交易會確保你唔會有一個活動只儲存咗一半項目。

好多人叫 AI「將我嘅試算表變成 app」嗰陣,就會跳過呢一步。將試算表變成 app 嘅指南會再講深啲。

主要術語

  • 資料表、行、欄位: 一類事物、該類事物嘅一個實例、關於它嘅一項資料。
  • 主鍵(Primary key): 每一行嘅獨一無二 ID,通常叫 id。
  • 外鍵(Foreign key): 一個指向另一個資料表某一行嘅欄位,例如 client_id。
  • 結構(Schema): 所有資料表同欄位嘅設計。
  • 遷移(Migration): 對結構作出嘅一個已儲存、可重複執行嘅改動,例如「喺 events 加一個 venue 欄位」。
  • 查詢(Query): 用 SQL 寫成嘅問題或者指令。
  • 連線字串(Connection string): 你嘅後端用嚟連接資料庫嘅地址同密碼。佢係秘密資料——睇吓環境變數同秘密資料。
  • 託管 Postgres(Managed Postgres): 代你運行、備份同更新 Postgres 嘅服務。

如果想了解 app 喺呢啲資料表上會做嘅日常操作——建立、讀取、更新、刪除——可以睇什麼係 CRUD。

常見錯誤同誤解

  • 只有一張超大資料表。 將試算表逐欄照抄,會帶嚟同樣嘅重複問題。將重複出現嘅嘢拆去自己嘅資料表。
  • 將清單儲存喺一個文字欄位入面。 一個單一欄位寫住「canapés x40, salad x2」,就冇辦法正確計數或者搜尋。要用一個連結資料表。
  • 冇約束。 冇「電郵必須唯一」或者「每個活動都要有客戶」呢類規則,壞資料會悄悄咁入面,然後幾個月後先浮現。
  • 喺正式環境用手動改資料庫。 要求將結構改動以遷移形式進行,咁樣改動就會有記錄,並且可以重複執行。
  • 容許瀏覽器直接同資料庫溝通。 前端應該經過後端,由後端檢查權限。資料庫密碼永遠唔應該出現喺頁面程式碼入面。
  • 「Postgres 只係大公司先用。」 佢一樣可以好好咁應付一個 50 行嘅輪候名單,而且你成長嗰陣都唔使轉走。
  • 以為資料庫就係備份。 資料庫儲存資料,但唔會自動保護你免受刪除資料之害。要睇清楚你嘅託管商提供咩備份。

你可以叫 AI builder 為你做咩

  • 「將[嘢]儲存喺資料庫。資料表:……,欄位有:……。將每張[訂單]連結去一位[客戶]。」
  • 「客戶嘅電郵設為唯一。呢啲欄位設為必填。唔容許冇客戶嘅訂單。」
  • 「每次結構改動都用遷移。」
  • 「為我哋最常做嘅搜尋加索引:按客戶同按日期查訂單。」
  • 「所有資料庫存取都經過伺服器。連線字串放喺環境變數入面。」

如果你完全未接觸過資料庫嘅概念,先睇什麼係資料庫,然後再返嚟呢度。全棧 app 會示範資料庫點樣同前端、後端並排放置。

Mythex 入面嘅 Postgres

Mythex 為每個需要資料庫嘅項目提供一個獨立嘅 Postgres 資料庫。你唔使設定:喺對話入面講(「將 waitlist 電郵儲存到資料庫」)或者用 /database 指令,Mythex 就會附加資料庫,將連線資料注入你個 app,並且可以幫你建立資料表。已發佈 app 嘅資料庫喺閒置五分鐘之後會休眠,下一個請求嚟到就會喚醒;你只需要為佢實際醒著嘅時間付費,而且用嘅係同建 app 同一個 credit 餘額。詳情可以睇資料庫文件,而儀表板模板係睇數據驅動 app 嘅好地方。

常見問題

Postgres 同 PostgreSQL 係同一樣嘢嗎?

係。PostgreSQL 係正式名稱,Postgres 係常用嘅簡稱;兩者都指同一個開源關聯式資料庫。

Postgres 係免費嘅嗎?

係。PostgreSQL 採用寬鬆嘅 PostgreSQL 授權條款,屬於開源,所以你可以免費使用,包括用喺商業產品入面。你只需要為運行佢嘅伺服器或者託管服務付費。

Postgres 同 MySQL 有咩分別?

兩者都係免費嘅 SQL 關聯式資料庫,而且對大部分 app 都夠用。Postgres 以嚴謹嘅資料完整性、豐富嘅資料類型(例如 JSONB 同陣列),以及龐大嘅擴充生態系統見稱;MySQL 則以簡單同喺網頁託管界悠久嘅歷史見稱。

Postgres 適唔適合細 app?

適合。佢用嚟做一個單一資料表嘅輪候名單好好,亦可以應付大型生產系統,所以 app 增長時你唔使轉換資料庫。託管服務令你唔使有資料庫管理員都可以輕鬆運行。

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