Іноді структура даних не вкладається у звичні рядки й числа. Наприклад, користувач може мати список хобі, довільні налаштування профілю або вкладені параметри замовлення. Жорстко задавати під це окремі таблиці — незручно. Тут на допомогу приходить JSON.
PostgreSQL підтримує два формати для роботи з такими даними: JSON і JSONB. Обидва дозволяють зберігати структуровані дані всередині однієї колонки, але між ними є важливі відмінності.
Давай розберемося, як це працює, коли використовувати який формат і які можливості вони відкривають.
Що таке JSON
JSON (JavaScript Object Notation) — це текстовий формат обміну даними, який був створений для зручного представлення структурованих даних. Це формат, який чудово знайомий будь-якому розробнику, що працює з веб-додатками, і його можна описати як "зрозумілий для людини" і "легко парситься комп'ютером". У PostgreSQL цей формат використовується для зберігання та обробки структурованих даних.
Ось приклад JSON-об'єкта:
{
"name": "Alex Lin",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JavaScript"],
"address": {
"city": "Berlin",
"postal_code": "10115"
}
}
Примітка: JSON — це просто текст, але текст з правилами. Наприклад, імена ключів завжди беруться у лапки.
JSONB: Binary JSON
JSONB — це "бінарний JSON", який також підтримується PostgreSQL. На відміну від JSON, JSONB індексується і оптимізований для швидкого пошуку та змін. Основна різниця між JSON і JSONB у PostgreSQL полягає у способі їх зберігання:
- JSON зберігається як текстовий рядок у тому вигляді, в якому ти передав дані.
- JSONB перетворює дані у бінарний формат, який ефективніший для більшості операцій.
JSONB дає тобі такі фічі: фільтрація, індексація, порівняння складних вкладених структур.
Основні переваги JSONB
Чому варто обрати JSONB, а не JSON? Ось кілька причин:
- Прискорення пошуку та фільтрації
JSONB створений для швидкого витягування даних. Наприклад, якщо у тебе є великий масив об'єктів, JSONB дозволяє швидко знайти потрібний елемент без повного перебору.
- Можливість індексації
З індексацією ти можеш шукати по ключах і значеннях всередині JSONB, роблячи запити блискавичними. Розглядати JSON як текст (у форматі JSON) індексацію не дозволяє.
- Зручність роботи з вкладеними даними
JSONB круто працює з вкладеними структурами. Тобі не треба роздувати кількість таблиць для роботи з ієрархічними даними — все може бути компактно запаковано.
Коли використовувати JSON, а коли JSONB
- JSON варто використовувати, якщо ти хочеш зберегти дані "як є" у текстовому вигляді. Наприклад, якщо важлива точна фіксація даних або потрібна мінімальна обробка.
- JSONB стане у пригоді, якщо ти збираєшся активно робити вибірки, фільтрації та модифікації даних, або якщо потрібна індексація.
Приклади JSON-об'єктів
Давай розглянемо кілька прикладів JSON-об'єктів, щоб побачити можливості їх структури.
Простий JSON-об'єкт.
Структура ключ-значення:
{
"name": "Kateryna",
"age": 29
}
Масиви у JSON
JSON підтримує масиви:
{
"skills": ["Python", "SQL", "Data Analysis"]
}
Вкладені об'єкти
JSON дозволяє створювати компоновки для зберігання складних даних:
{
"name": "Andrii",
"contacts": {
"email": "andrey@example.com",
"phone": "+79012345678"
}
}
Комбінування масивів та об'єктів
Ти можеш комбінувати масиви й об'єкти:
{
"team": [
{
"name": "Olena",
"role": "menedzher"
},
{
"name": "Pavlo",
"role": "rozrobnyk"
}
]
}
JSON і PostgreSQL
PostgreSQL підтримує два окремих типи даних для роботи з JSON:
JSON: текстовий формат.JSONB: бінарний формат.
Створення таблиці з колонками JSON та JSONB
Подивимось, як можна використовувати JSON/JSONB у таблицях PostgreSQL. Наприклад, створимо таблицю для зберігання інформації про співробітників компанії:
-- Створюємо таблицю з колонками JSON та JSONB
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
details JSON, -- текстовий JSON
profile JSONB -- бінарний JSON
);
На перший погляд здається, що різниці між цими колонками немає. Але це не так: JSON ідеально підходить для зберігання даних у незмінному вигляді, а JSONB краще для фільтрації та пошуку.
-- Вставляємо дані
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"}');
Витягування JSONB-даних
Ти можеш витягувати дані з JSONB за допомогою спеціальних функцій, які ми розглянемо у наступній лекції. Наприклад, щоб дізнатися про навички співробітників:
-- Витягування навичок
SELECT name, profile->'skills' AS skills
FROM employees;
Результат:
| name | skills |
|---|---|
| Alex Lin | ["SQL", "PostgreSQL"] |
| Maya Novak | ["Python", "Machine Learning"] |
Застосування JSON у реальному житті
JSON (і JSONB) широко використовується у реальних додатках. Ось кілька прикладів:
- API та мікросервіси. JSON є стандартним форматом передачі даних у RESTful API. PostgreSQL підтримує його на рівні зберігання та обробки.
- Інтеграція даних. Якщо твоя база даних отримує дані з різних систем, працювати з JSONB буде зручніше.
- Володіння складними структурами. Наприклад, JSONB підходить для зберігання даних анкет, користувацьких налаштувань або корпоративних метаданих.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ