Иногда структура данных не укладывается в привычные строки и числа. Например, пользователь может иметь список хобби, произвольные настройки профиля или вложенные параметры заказа. Жёстко задавать под это отдельные таблицы — неудобно. Здесь на помощь приходит 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": "Екатерина",
"age": 29
}
Массивы в JSON
JSON поддерживает массивы:
{
"skills": ["Python", "SQL", "Data Analysis"]
}
Вложенные объекты
JSON позволяет создавать компоновки для хранения сложных данных:
{
"name": "Андрей",
"contacts": {
"email": "andrey@example.com",
"phone": "+79012345678"
}
}
Комбинирование массивов и объектов
Вы можете комбинировать массивы и объекты:
{
"team": [
{
"name": "Елена",
"role": "менеджер"
},
{
"name": "Павел",
"role": "разработчик"
}
]
}
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 подходит для хранения данных анкет, пользовательских настроек или корпоративных метаданных.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ