JSON (JavaScript Object Notation) — це популярний формат даних для обміну інформацією між системами. Він легкий, зрозумілий людині і ідеально підходить для представлення структурованих даних, таких як об'єкти чи масиви.
PostgreSQL підтримує два типи даних для роботи з JSON:
JSON: зберігає дані у вигляді рядка. Це чисто текстове представлення JSON, без внутрішньої оптимізації.JSONB: бінарне представлення JSON. Воно ефективніше для читання, фільтрації та обробки, бо PostgreSQL заздалегідь парсить JSON і оптимізує його зберігання.
Чому частіше обирають JSONB? Бо:
- Він швидший для запитів завдяки бінарному зберіганню.
- Може індексуватися, що робить його ідеальним для великих наборів даних.
- Зберігає ключі впорядкованими і прибирає дублікати, що спрощує обробку.
Приклад JSON-структури:
{
"name": "Alice",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JSONB"]
}
Чому JSONB корисний?
Зберігання напівструктурованих даних. У реальному світі дані часто приходять у вигляді складних об'єктів (наприклад, метадані, налаштування, профілі користувачів). JSONB дозволяє зберігати їх, уникаючи створення сотень таблиць і зв'язків.
Моделювання даних, які змінюються. Коли структура об'єкта часто змінюється (наприклад, додаються чи видаляються поля), JSONB дозволяє гнучко зберігати такі дані.
Робота з API. Багато веб-додатків надсилають дані у форматі JSON. Замість перетворення запитів можна зберігати їх "як є" і працювати з ними напряму.
Створення таблиці з JSONB
Давай почнемо з практики! Уяви, що ми створюємо базу даних для зберігання профілів користувачів.
Стовпець profile буде зберігати всю додаткову інформацію (наприклад, вік, інтереси, контакти) у форматі JSON. Це зручно, якщо структура зберігання даних відрізняється у різних користувачів.
| 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}} |
JSON-дані можна вставляти як рядки. PostgreSQL автоматично перетворює їх у формат JSONB.
Витягування даних з JSONB
Тепер, коли у нас є дані, давай дізнаємось, як їх діставати. PostgreSQL дає купу операторів для роботи з JSONB.
Доступ до значення поля
Використовуємо оператор -> для отримання значення поля:
-- Виводимо вік користувача
SELECT profile->'age' AS age FROM users;
Перетворення значення в текст
Оператор ->> дозволяє витягнути значення у вигляді рядка:
-- Виводимо місце проживання користувача
SELECT profile->>'location' AS location FROM users;
Фільтрація даних з JSONB
Справжня сила JSONB розкривається у запитах з фільтрацією. Можна використовувати стандартні SQL-оператори для роботи з JSON.
Приклад фільтрації за ключем:
-- Знайти користувачів, у яких вказано місце проживання "New York"
SELECT * FROM users
WHERE profile->>'location' = 'New York';
Пошук у масиві
JSON підтримує масиви, і PostgreSQL вміє шукати у них значення:
-- Знайти користувачів, які володіють SQL
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'skills'));
Функція jsonb_array_elements_text перетворює елементи масиву у рядки, щоб їх можна було порівнювати.
Є і коротший варіант з оператором @>:
-- Знайти користувачів, які володіють SQL
SELECT * FROM users
WHERE profile->'skills' @> '["SQL"]';
Детальніше про функції та способи роботи з JSON поговоримо пізніше, коли прийде час :P
Коротке резюме: коли використовувати JSONB
JSONB ідеально підходить для:
- Зберігання складних структурованих даних.
- Обробки даних з зовнішніх API.
- Ситуацій, коли структура об'єкта змінюється.
Але не забувай, що надмірне використання JSONB може ускладнити індексацію і керування базою даних. Якщо структура даних стабільна, краще використовувати реляційну модель.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ