什麼係 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,同一批資料會變成四個資料表:
| 資料表 | 欄位 | 備註 |
|---|---|---|
| clients | id, name, phone, email | 電郵必須唯一 |
| events | id, client_id, date, venue, status | client_id 必須對應一個真實客戶 |
| menu_items | id, name, unit_price | 每道菜一行 |
| event_items | event_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 增長時你唔使轉換資料庫。託管服務令你唔使有資料庫管理員都可以輕鬆運行。