CodeGym /Các khóa học /SQL SELF /Làm việc với kiểu dữ liệu JSONB

Làm việc với kiểu dữ liệu JSONB

SQL SELF
Mức độ , Bài học
Có sẵn

JSON (JavaScript Object Notation) — là một định dạng dữ liệu phổ biến để trao đổi thông tin giữa các hệ thống. Nó nhẹ, dễ đọc với con người và cực kỳ phù hợp để biểu diễn dữ liệu có cấu trúc như object hoặc array.

PostgreSQL hỗ trợ hai kiểu dữ liệu để làm việc với JSON:

  • JSON: lưu dữ liệu dưới dạng chuỗi. Đây là biểu diễn JSON thuần text, không có tối ưu hóa bên trong.
  • JSONB: biểu diễn JSON dạng nhị phân. Nó hiệu quả hơn cho việc đọc, lọc và xử lý vì PostgreSQL sẽ parse JSON và tối ưu hóa lưu trữ trước.

Tại sao thường chọn JSONB? Vì:

  • Nó nhanh hơn cho truy vấn nhờ lưu trữ nhị phân.
  • Có thể tạo index, rất lý tưởng cho bộ dữ liệu lớn.
  • Giữ key có thứ tự và loại bỏ trùng lặp, giúp xử lý dễ dàng hơn.

Ví dụ về cấu trúc JSON:

{
  "name": "Alice",
  "age": 25,
  "skills": ["SQL", "PostgreSQL", "JSONB"]
}

Tại sao JSONB hữu ích?

Lưu trữ dữ liệu bán cấu trúc. Ở ngoài đời, dữ liệu thường đến dưới dạng object phức tạp (ví dụ: metadata, cài đặt, profile người dùng). JSONB cho phép lưu trữ chúng mà không cần tạo hàng trăm bảng và liên kết.

Mô hình hóa dữ liệu thay đổi thường xuyên. Khi cấu trúc object thay đổi liên tục (ví dụ: thêm hoặc xóa field), JSONB giúp lưu trữ linh hoạt.

Làm việc với API. Nhiều web app gửi dữ liệu ở dạng JSON. Thay vì phải convert request, bạn có thể lưu "nguyên xi" và thao tác trực tiếp.

Tạo bảng với JSONB

Bắt tay vào thực hành luôn nhé! Giả sử tụi mình tạo database để lưu profile người dùng.

Cột profile sẽ lưu toàn bộ thông tin bổ sung (ví dụ: tuổi, sở thích, liên hệ) ở dạng JSON. Cực tiện nếu cấu trúc dữ liệu mỗi user lại khác nhau.

id name - VARCHAR(100) profile - JSONB
1 Alice {"age": 25, "skills": ["SQL", "PostgreSQL", "JSONB"], "location": "New York"}
2 Bob {"age": 30, "interests": ["hiking", "photography"], "location": "Denver"}
3 Charlie {"email": "charlie@example.com", "verified": true}
4 Diana {"age": 22, "skills": ["Python"], "bio": "Data enthusiast", "location": "Berlin"}
5 Eve {"age": 28, "skills": [], "preferences": {"theme": "dark", "notifications": false}}

Dữ liệu JSON có thể insert như chuỗi. PostgreSQL sẽ tự động convert sang định dạng JSONB.

Lấy dữ liệu từ JSONB

Giờ có data rồi, cùng xem cách truy xuất nhé. PostgreSQL cung cấp nhiều toán tử để thao tác với JSONB.

Truy cập giá trị field

Dùng toán tử -> để lấy giá trị field:

-- Hiển thị tuổi của user
SELECT profile->'age' AS age FROM users;

Chuyển giá trị thành text

Toán tử ->> cho phép lấy giá trị dưới dạng chuỗi:

-- Hiển thị nơi ở của user
SELECT profile->>'location' AS location FROM users;

Lọc dữ liệu với JSONB

Sức mạnh của JSONB thể hiện rõ khi truy vấn có lọc. Bạn có thể dùng các toán tử SQL chuẩn để thao tác với JSON.

Ví dụ lọc theo key:

-- Tìm user có nơi ở là "New York"
SELECT * FROM users
WHERE profile->>'location' = 'New York';

Tìm kiếm trong array

JSON hỗ trợ array và PostgreSQL biết cách tìm giá trị trong đó:

-- Tìm user biết SQL
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'skills'));

Hàm jsonb_array_elements_text chuyển phần tử array thành chuỗi để so sánh.

Có cách ngắn hơn dùng toán tử @>:

-- Tìm user biết SQL
SELECT * FROM users
WHERE profile->'skills' @> '["SQL"]';

Chi tiết về các hàm và cách thao tác với JSON tụi mình sẽ bàn sau, khi tới lúc :P

Tóm tắt nhanh: khi nào nên dùng JSONB

JSONB cực hợp cho:

  • Lưu trữ dữ liệu cấu trúc phức tạp.
  • Xử lý dữ liệu từ API ngoài.
  • Tình huống object thay đổi cấu trúc liên tục.

Nhưng nhớ nhé, lạm dụng JSONB có thể làm việc index và quản lý database phức tạp hơn. Nếu cấu trúc dữ liệu ổn định, tốt nhất nên dùng mô hình quan hệ.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION