PostgreSQL là hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở được mệnh danh là "most advanced open source database" — lựa chọn hàng đầu của Instagram, Shopify, Discord và hàng nghìn startup toàn cầu. Bài viết giải thích PostgreSQL là gì, kiến trúc hoạt động, và cách kết nối thực tế bằng Python và Node.js.
Cần giải pháp dữ liệu cho doanh nghiệp?
AlgoData đồng hành cùng doanh nghiệp về data engineering, phân tích & AI từ 2019.
PostgreSQL là gì?
PostgreSQL (đọc là "post-gres-Q-L" hoặc "postgres") là hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) mã nguồn mở, ra đời từ dự án POSTGRES tại Đại học UC Berkeley năm 1986 bởi giáo sư Michael Stonebraker. Đến năm 1996, dự án đổi tên thành PostgreSQL và trở thành cộng đồng phát triển độc lập.

Điều khiến PostgreSQL nổi bật là sự kết hợp hiếm có: tuân thủ chuẩn SQL chặt chẽ trong khi vẫn hỗ trợ JSON/JSONB, mảng, kiểu dữ liệu tùy chỉnh, và hơn 100 extension mạnh mẽ như PostGIS (dữ liệu địa lý) và pgvector (vector embedding cho AI).
Kiến trúc PostgreSQL
Khi một ứng dụng kết nối đến PostgreSQL, luồng xử lý như sau:

- Client gửi kết nối đến Postmaster (process quản lý chính)
- Postmaster tạo một Backend process riêng cho mỗi kết nối
- Backend đọc/ghi qua Shared Buffer (bộ nhớ đệm dùng chung)
- Dữ liệu được persist xuống Data Files trên disk
PostgreSQL dùng mô hình process-per-connection (một process OS cho mỗi client), khác với MySQL dùng thread. Đây là lý do connection pooler như PgBouncer quan trọng khi scale lên hàng nghìn kết nối.
ACID và MVCC
PostgreSQL đảm bảo ACID đầy đủ thông qua cơ chế MVCC (Multi-Version Concurrency Control): khi update một row, Postgres không ghi đè mà tạo phiên bản mới — reader thấy phiên bản cũ, writer tạo phiên bản mới. Kết quả: đọc không bao giờ block ghi, và ghi không bao giờ block đọc.
Kết nối PostgreSQL bằng Python và Node.js
Python với psycopg2:
1import psycopg2
2
3conn = psycopg2.connect(
4 host="localhost",
5 port=5432,
6 dbname="mydb",
7 user="postgres",
8 password="secret"
9)
10cur = conn.cursor()
11
12# Insert với parameterized query (tránh SQL injection)
13cur.execute(
14 "INSERT INTO users (name, email) VALUES (%s, %s)",
15 ("Alice", "alice@example.com")
16)
17conn.commit()
18
19# Select
20cur.execute("SELECT id, name FROM users WHERE active = %s", (True,))
21rows = cur.fetchall()
22for row in rows:
23 print(row) # (1, 'Alice')
24
25cur.close()
26conn.close()
Node.js với pg:
1const { Pool } = require('pg');
2
3const pool = new Pool({
4 host: 'localhost',
5 port: 5432,
6 database: 'mydb',
7 user: 'postgres',
8 password: 'secret',
9});
10
11async function getActiveUsers() {
12 const result = await pool.query(
13 'SELECT id, name FROM users WHERE active = $1',
14 [true]
15 );
16 return result.rows; // [{ id: 1, name: 'Alice' }]
17}
CLI psql cơ bản:
1psql -h localhost -U postgres -d mydb
2
3# Trong psql
4\dt -- liệt kê các bảng
5\d users -- xem cấu trúc bảng users
6\timing on -- bật đo thời gian query
Indexing trong PostgreSQL

PostgreSQL hỗ trợ nhiều loại index. Phổ biến nhất:
| Loại | Dùng khi | Ví dụ |
|---|---|---|
| B-tree | Mặc định, cho =, <, >, BETWEEN |
CREATE INDEX ON users(email) |
| GIN | Tìm kiếm trong JSONB, array, full-text | CREATE INDEX ON posts USING GIN(tags) |
| Partial | Index chỉ một tập con rows | CREATE INDEX ON orders(created_at) WHERE status = 'pending' |
1-- B-tree index trên email
2CREATE INDEX idx_users_email ON users(email);
3
4-- GIN index để query JSONB
5CREATE INDEX idx_products_meta ON products USING GIN(metadata);
6
7-- Partial index cho orders chưa xử lý
8CREATE INDEX idx_pending_orders ON orders(created_at)
9WHERE status = 'pending';
PostgreSQL vs MySQL — Khi nào chọn cái nào?
| Tiêu chí | PostgreSQL | MySQL |
|---|---|---|
| JSON support | JSONB với index | JSON cơ bản |
| Full-text search | Tích hợp sẵn | Hạn chế |
| Kiểu dữ liệu | Phong phú (array, hstore, range) | Cơ bản |
| Replication | Logical + streaming | Binary log |
| License | PostgreSQL (free, commercial ok) | GPL |
Chọn PostgreSQL khi cần query phức tạp, ACID chặt, hoặc JSON hybrid. Chọn MySQL khi stack WordPress/LAMP hoặc cần ecosystem PHP rộng hơn.
Use cases thực tế
- Instagram: dùng PostgreSQL cho toàn bộ social graph và media metadata
- Shopify: PostgreSQL làm primary store cho hàng triệu merchant
- Stripe: PostgreSQL làm primary database cho toàn bộ hệ thống thanh toán xử lý hàng tỷ USD
Redis là gì? Cache, Pub/Sub và hàng đợi với in-memory database

