Bạn có thực sự cần sử dụng cơ sở dữ liệu NoSQL? Hay một cơ sở dữ liệu quan hệ có thể đáp ứng các yêu cầu dữ liệu bán cấu trúc của bạn?
PostgreSQL là một cơ sở dữ liệu quan hệ rất đầy đủ tính năng và phổ biến — nhưng bạn có biết rằng nó cũng hỗ trợ nhiều chức năng như một cơ sở dữ liệu phi quan hệ?
PostgreSQL hỗ trợ dữ liệu phi quan hệ như thế nào?
PostgreSQL hỗ trợ dữ liệu phi quan hệ theo 3 cách khác nhau:
- XML
- JSON
- JSONB
XML
PostgreSQL hỗ trợ XML thông qua kiểu dữ liệu xml
gốc. Bạn có thể lưu trữ và truy vấn dữ liệu XML bằng XPath.
CREATE TABLE products ( id SERIAL PRIMARY KEY, data XML
); INSERT INTO products (data)
VALUES ( '<product><name>Smartphone</name><price>999.99</price></product>'
); -- Extract the product name using XPath
SELECT xpath('//name/text()', data) AS name
FROM products;
Khi nào dùng XML?
Rất hữu ích khi bạn tích hợp với hệ thống cũ hoặc API bên ngoài vẫn dùng định dạng XML. Tuy nhiên, so với JSON thì nó kém hiệu quả hơn trong hầu hết các tình huống hiện đại.
JSON
PostgreSQL hỗ trợ kiểu dữ liệu json
để lưu trữ cấu trúc JSON dưới dạng văn bản thuần (plain text). Rất phù hợp cho dữ liệu bán cấu trúc.
CREATE TABLE users ( id SERIAL PRIMARY KEY, profile JSON
); INSERT INTO users (profile)
VALUES ( '{ "name": "John Doe", "age": 21, "skills": ["golang", "typescript", "clickhouse"] }'
); -- Querying JSON data
SELECT profile->>'name' AS name, profile->'skills' AS skills
FROM users;
Ưu điểm của JSON:
Dữ liệu được giữ nguyên định dạng ban đầu, bao gồm cả khoảng trắng và thứ tự khóa — điều này hữu ích cho logging hoặc lưu dữ liệu thô. Tuy nhiên, khả năng truy vấn không tối ưu dù tốc độ ghi rất tốt.
JSONB
jsonb
là viết tắt của JSON dạng nhị phân (binary JSON). Nó lưu trữ JSON ở định dạng nhị phân — tối ưu hơn cho việc lập chỉ mục và truy vấn.
CREATE TABLE events ( id SERIAL PRIMARY KEY, metadata JSONB
); INSERT INTO events (metadata)
VALUES ( '{ "type": "click", "user_id": 42, "timestamp": "2025-06-18T09:00:00Z" }'
); -- Filter events by user_id
SELECT *
FROM events
WHERE metadata->>'user_id' = '42'; -- Create a GIN index for better performance
CREATE INDEX idx_metadata ON events USING GIN (metadata);
Ưu điểm của JSONB:
Hỗ trợ chỉ mục GIN (Generalized Inverted Index), giúp tăng tốc truy vấn tài liệu JSON lớn. Ngoài ra, nó cũng loại bỏ các khóa trùng và bỏ qua khoảng trắng. Nếu GIN chưa đủ, bạn có thể sử dụng chỉ mục B-Tree hoặc Hash — dù hiệu quả có thể không cao bằng.
So sánh tổng quan
Kết luận
PostgreSQL cung cấp một bộ công cụ mạnh mẽ để xử lý dữ liệu bán cấu trúc, giúp nó có thể đảm nhận vai trò như một cơ sở dữ liệu NoSQL khi cần. Nếu bạn đang lên kế hoạch xây dựng một hệ thống mới có nhu cầu xử lý dữ liệu bán cấu trúc và PostgreSQL đã nằm trong tech stack của nhóm bạn, thì nó hoàn toàn là một lựa chọn đáng cân nhắc — vừa tiết kiệm chi phí học công cụ mới, vừa không tăng độ phức tạp hệ thống.
Tuy nhiên, cũng cần lưu ý rằng có nhiều trường hợp bạn thực sự cần một cơ sở dữ liệu NoSQL chuyên biệt như MongoDB, Cassandra, hoặc Scylla. Vì vậy, hãy luôn đánh giá kỹ ưu và nhược điểm của từng lựa chọn trước khi đưa ra quyết định kiến trúc.