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 profile->'skills' @> '["SQL"]';
Оператор @> перевіряє, чи містить JSONB-значення зазначений фрагмент — найзручніший варіант для пошуку елемента в масиві.
Альтернатива через EXISTS:
SELECT * FROM users
WHERE EXISTS (
SELECT 1 FROM jsonb_array_elements_text(profile->'skills') AS skill
WHERE skill = 'SQL'
);
Зверни увагу: jsonb_array_elements_text — це set-returning function, її не можна використовувати напряму у WHERE (PostgreSQL видасть ERROR: set-returning functions are not allowed in WHERE). Її розгортають через підзапит або LATERAL.
Детальніше про функції та способи роботи з JSON поговоримо пізніше, коли прийде час :P
Коротке резюме: коли використовувати JSONB
JSONB ідеально підходить для:
- Зберігання складних структурованих даних.
- Обробки даних з зовнішніх API.
- Ситуацій, коли структура об'єкта змінюється.
Але не забувай, що надмірне використання JSONB може ускладнити індексацію і керування базою даних. Якщо структура даних стабільна, краще використовувати реляційну модель.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ