CodeGym /Các khóa học /SQL SELF /Làm việc với JSON và JSONB

Làm việc với JSON và JSONB

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

Đôi khi cấu trúc dữ liệu không chỉ là các dòng và số như bình thường. Ví dụ, một người dùng có thể có danh sách sở thích, cài đặt profile tùy ý hoặc các tham số đơn hàng lồng nhau. Việc tạo bảng riêng cho từng thứ như vậy thì khá phiền. Lúc này JSON sẽ cứu cánh cho bạn.

PostgreSQL hỗ trợ hai định dạng để làm việc với kiểu dữ liệu này: JSONJSONB. Cả hai đều cho phép lưu dữ liệu có cấu trúc trong một cột, nhưng giữa chúng có những điểm khác biệt quan trọng.

Cùng tìm hiểu xem nó hoạt động thế nào, khi nào nên dùng định dạng nào và những gì bạn có thể làm với chúng nhé.

JSON là gì

JSON (JavaScript Object Notation) — là định dạng văn bản để trao đổi dữ liệu, được tạo ra để biểu diễn dữ liệu có cấu trúc một cách tiện lợi. Đây là định dạng mà bất kỳ dev nào làm web đều biết, có thể mô tả là "dễ đọc với người" và "máy tính dễ parse". Trong PostgreSQL, định dạng này dùng để lưu trữ và xử lý dữ liệu có cấu trúc.

Ví dụ về một object JSON:

{
  "name": "Alex Lin",
  "age": 25,
  "skills": ["SQL", "PostgreSQL", "JavaScript"],
  "address": {
    "city": "Berlin",
    "postal_code": "10115"
  }
}

Lưu ý: JSON chỉ là text thôi, nhưng là text có luật. Ví dụ, tên key luôn phải để trong dấu ngoặc kép.

JSONB: Binary JSON

JSONB — là "binary JSON", cũng được PostgreSQL hỗ trợ. Khác với JSON, JSONB có thể index và tối ưu cho việc tìm kiếm, thay đổi nhanh. Điểm khác biệt chính giữa JSON và JSONB trong PostgreSQL là cách lưu trữ:

  • JSON lưu dưới dạng chuỗi text đúng như bạn truyền vào.
  • JSONB chuyển dữ liệu sang dạng nhị phân, hiệu quả hơn cho hầu hết thao tác.

JSONB cho bạn các tính năng như: lọc, index, so sánh các cấu trúc lồng nhau phức tạp.

Ưu điểm chính của JSONB

Tại sao nên chọn JSONB thay vì JSON? Đây là vài lý do:

  1. Tăng tốc tìm kiếm và lọc

JSONB được thiết kế để truy xuất dữ liệu nhanh. Ví dụ, nếu bạn có một mảng object lớn, JSONB cho phép tìm phần tử cần mà không phải duyệt hết.

  1. Có thể index

Nhờ index, bạn có thể tìm theo key và value bên trong JSONB, giúp query cực nhanh. Nếu chỉ lưu JSON dạng text thì không index được.

  1. Dễ làm việc với dữ liệu lồng nhau

JSONB cực kỳ tiện khi làm với cấu trúc lồng nhau. Bạn không cần tạo thêm nhiều bảng cho dữ liệu dạng cây — tất cả có thể gói gọn trong một cột.

Khi nào dùng JSON, khi nào dùng JSONB

  • JSON nên dùng nếu bạn muốn lưu dữ liệu "nguyên bản" ở dạng text. Ví dụ, khi cần lưu chính xác dữ liệu hoặc chỉ cần xử lý tối thiểu.
  • JSONB hợp lý khi bạn cần query, lọc, sửa dữ liệu thường xuyên, hoặc cần index.

Ví dụ về object JSON

Cùng xem vài ví dụ về object JSON để thấy cấu trúc của nó đa dạng thế nào nhé.

Object JSON đơn giản.

Cấu trúc key-value:

{
  "name": "Ekaterina",
  "age": 29
}

Mảng trong JSON

JSON hỗ trợ mảng:

{
  "skills": ["Python", "SQL", "Data Analysis"]
}

Object lồng nhau

JSON cho phép bạn tạo cấu trúc để lưu dữ liệu phức tạp:

{
  "name": "Andrey",
  "contacts": {
    "email": "andrey@example.com",
    "phone": "+79012345678"
  }
}

Kết hợp mảng và object

Bạn có thể kết hợp mảng và object:

{
  "team": [
    {
      "name": "Elena",
      "role": "menedzher"
    },
    {
      "name": "Pavel",
      "role": "razrabotchik"
    }
  ]
}

JSON và PostgreSQL

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

  • JSON: định dạng text.
  • JSONB: định dạng nhị phân.

Tạo bảng với cột JSON và JSONB

Xem thử cách dùng JSON/JSONB trong bảng PostgreSQL. Ví dụ, tạo bảng lưu thông tin nhân viên công ty:

-- Tao bang voi cot JSON va JSONB
CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    details JSON,    -- JSON text
    profile JSONB    -- JSON nhi phan
);

Nhìn qua thì hai cột này có vẻ giống nhau. Nhưng thực ra không phải vậy: JSON hợp cho lưu dữ liệu nguyên bản, còn JSONB tốt hơn cho lọc và tìm kiếm.

-- Chen du lieu
INSERT INTO employees (name, details, profile)
VALUES
('Alex Lin', '{"age": 30, "city": "Tallinn"}', '{"skills": ["SQL", "PostgreSQL"], "hobby": "football"}'),
('Maya Novak', '{"age": 25, "city": "Riga"}', '{"skills": ["Python", "Machine Learning"], "hobby": "reading"}');

Lấy dữ liệu JSONB

Bạn có thể lấy dữ liệu từ JSONB bằng các hàm đặc biệt, sẽ học ở bài sau. Ví dụ, để xem kỹ năng của nhân viên:

-- Lay ky nang
SELECT name, profile->'skills' AS skills
FROM employees;

Kết quả:

name skills
Alex Lin ["SQL", "PostgreSQL"]
Maya Novak ["Python", "Machine Learning"]

Ứng dụng JSON trong thực tế

JSON (và JSONB) được dùng rất nhiều trong các ứng dụng thực tế. Đây là vài ví dụ:

  1. API và microservice. JSON là định dạng chuẩn để truyền dữ liệu trong RESTful API. PostgreSQL hỗ trợ lưu trữ và xử lý nó luôn.
  2. Tích hợp dữ liệu. Nếu database của bạn nhận dữ liệu từ nhiều hệ thống khác nhau, dùng JSONB sẽ tiện hơn nhiều.
  3. Quản lý cấu trúc phức tạp. Ví dụ, JSONB hợp để lưu dữ liệu form, cài đặt người dùng hoặc metadata doanh nghiệp.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION