Ответ
Основное различие между JSON и JSONB в PostgreSQL заключается в способе хранения данных, что напрямую влияет на производительность и возможности.
-
JSON: Хранит точную текстовую копию входных данных. Сохраняются все пробелы, порядок ключей и дубликаты ключей. При каждом запросе данные требуют повторного парсинга. -
JSONB(Bозначает Binary): Хранит данные в декомпозированном бинарном формате. Пробелы удаляются, порядок ключей не сохраняется (они сортируются), а при наличии дубликатов сохраняется только последнее значение. Данные парсятся один раз при вставке.
Ключевые отличия
| Характеристика | JSON |
JSONB |
|---|---|---|
| Хранение | Текст | Бинарный формат |
| Скорость вставки | Быстрее (нет преобразования) | Медленнее (требуется парсинг) |
| Скорость чтения | Медленнее (требуется парсинг) | Значительно быстрее |
| Индексация | Не поддерживается | Поддерживаются GIN-индексы |
| Пробелы и порядок | Сохраняются | Не сохраняются |
Пример использования
-- Создаем таблицу для демонстрации
CREATE TABLE products (
id serial PRIMARY KEY,
attributes_json JSON,
attributes_jsonb JSONB
);
-- Вставляем данные с пробелами и разным порядком ключей
INSERT INTO products (attributes_json, attributes_jsonb)
VALUES
('{"price": 99.9, "name": "Gadget" }', '{"price": 99.9, "name": "Gadget" }');
-- Проверяем, как данные сохранились
SELECT attributes_json, attributes_jsonb FROM products;
-- attributes_json: {"price": 99.9, "name": "Gadget" } (как есть)
-- attributes_jsonb: {"name": "Gadget", "price": 99.9} (отформатировано)
-- Создаем индекс для JSONB для ускорения запросов
CREATE INDEX idx_products_attributes ON products USING GIN (attributes_jsonb);
-- Этот запрос будет работать очень эффективно благодаря индексу
SELECT * FROM products WHERE attributes_jsonb @> '{"name": "Gadget"}';
Рекомендация: Почти всегда следует использовать JSONB, так как он обеспечивает значительно лучшую производительность запросов и поддерживает индексацию. JSON стоит выбирать только в редких случаях, когда необходимо сохранить исходное форматирование JSON-документа.