PostgreSQL
What it is
PostgreSQL คือฐานข้อมูลเชิงสัมพันธ์ (relational ) แบบโอเพนซอร์สที่เติบโตมานาน เก็บข้อมูลในตารางที่มีชนิดข้อมูลชัดเจน พร้อมรองรับ (Structured Query Language) ธุรกรรม (transaction) และความถูกต้องของข้อมูลอย่างเข้มแข็ง มันเป็นที่รู้จักในเรื่องความถูกต้องแม่นยำ ความสามารถในการขยายฟีเจอร์ และฟีเจอร์อันหลากหลาย เช่น JSONB (ชนิดข้อมูล แบบไบนารีของ Postgres) การค้นหาข้อความเต็มรูปแบบ (full-text search) และฟังก์ชันหน้าต่าง (window functions) มันคือตัวเลือกเริ่มต้นสำหรับแบ็กเอนด์ของแอปพลิเคชันส่วนใหญ่ที่ต้องการข้อมูลเชิงโครงสร้างที่เชื่อถือได้
Strengths
- ลองนึกถึงการโอนเงินระหว่างบัญชีธนาคาร ที่ต้องเสร็จสมบูรณ์ทั้งหมดหรือยกเลิกทั้งหมด — ไม่มีทางทำค้างไว้ครึ่งๆ กลางๆ การรับประกันแบบ "ทำทั้งหมดหรือไม่ทำเลย" นี้เรียกว่าธุรกรรมแบบ ACID (Atomicity, Consistency, Isolation, Durability) และ Postgres มอบความสอดคล้องของข้อมูล (consistency) ที่แข็งแกร่งให้เป็นค่าเริ่มต้น
- SQL ที่ทรงพลัง: joins, CTEs (Common Table Expressions), window functions และ aggregates
- ชนิดข้อมูลที่ยืดหยุ่น รวมถึง
JSONB, arrays, ranges และชนิดข้อมูลกำหนดเอง - ส่วนขยาย (extensions) อย่าง PostGIS (ข้อมูลเชิงภูมิศาสตร์) และ
pgvector(embeddings) - ข้อจำกัด (constraints), foreign keys และกฎตรวจสอบ (check rules) ที่เข้มงวด ช่วยรักษาคุณภาพของข้อมูล
Trade-offs
- การขยายในแนวตั้ง (vertical scaling) ทำได้ง่าย แต่การแบ่งข้อมูลในแนวนอน (horizontal sharding) ต้องใช้เครื่องมือเสริม
- ต้องทำ schema migration เมื่อโมเดลข้อมูลของคุณเปลี่ยนแปลงไป
- ดูแลรักษายากกว่าฐานข้อมูลแบบไฟล์เดียวสำหรับโปรเจกต์เล็กๆ
- รูปแบบหนึ่งการเชื่อมต่อต่อหนึ่งไคลเอนต์ (connection-per-client) ต้องใช้ตัวจัดการพูล (pooler) อย่าง PgBouncer เมื่อขยายสเกลใหญ่ขึ้น
When to use it
เลือกใช้ PostgreSQL เป็นค่าเริ่มต้นสำหรับแอปแทบทุกประเภทที่มีข้อมูลเชิงสัมพันธ์ ธุรกรรม หรือความต้องการด้านการรายงาน: แบ็กเอนด์ของ SaaS (Software as a Service) อีคอมเมิร์ซ การวิเคราะห์ข้อมูล และอะไรก็ตามที่ได้ประโยชน์จากข้อจำกัด (constraints) และการเชื่อมตาราง (joins)
Vibe coding fit
เมื่อสั่งงาน AI ให้บอกเอนทิตี (entities) และความสัมพันธ์ระหว่างกันของมัน จากนั้นขอให้มันสร้าง schema ที่ผ่านการทำ normalization พร้อม primary keys, foreign keys, ข้อจำกัด NOT NULL และดัชนี (indexes) ที่เหมาะสม ยืนกรานให้ใช้ parameterized queries (ไม่เอา SQL ที่ต่อสตริงเอง) เพื่อป้องกันการโจมตีแบบ injection และให้ AI ห่อการเขียนข้อมูลหลายขั้นตอนไว้ในธุรกรรมเดียว เคล็ดลับที่ดี: บอกให้ AI สร้างไฟล์ migration ที่ย้อนกลับได้ (reversible) ด้วย และขอให้มันอธิบายดัชนีแต่ละตัวที่เพิ่มเข้าไปด้วย เพื่อให้คุณเข้าใจข้อแลกเปลี่ยนระหว่างการอ่านและการเขียน (read/write trade-offs) ก่อนที่จะนำไปใช้จริง
CREATE TABLE users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE orders (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL CHECK (total >= 0),
status TEXT NOT NULL DEFAULT 'pending'
);
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- Parameterized query (placeholders, not concatenation)
SELECT o.id, o.total
FROM orders o
WHERE o.user_id = $1 AND o.status = $2;