Найти тему

json и jsonb в PostgreSQL

JSON (JavaScript Object Notation) и JSONB (JSON Binary) являются двумя форматами хранения данных в PostgreSQL, которые позволяют хранить и манипулировать данными в формате JSON. В этой статье мы рассмотрим эти два формата и их особенности.

JSON является текстовым форматом обмена данными, основанным на языке JavaScript. Он представляет данные в виде пар "ключ-значение" и списков, записанных в фигурных скобках "{}". Пример JSON-объекта:

{
"name": "John",
"age": 30,
"city": "New York"
}

JSONB, с другой стороны, является бинарным форматом хранения данных в PostgreSQL. Он представляет данные в виде двоичного дерева, что делает его более эффективным для работы с данными, сравнимыми с JSON. JSONB служит для ускорения поиска, индексации и сортировки данных в формате JSON.

При работе с JSONB в PostgreSQL доступны различные операторы и функции, которые позволяют манипулировать данными в формате JSON. Например, вы можете получить значение определенного ключа из JSONB-объекта, использовав `->` оператор. Пример:

SELECT data->'name' AS name FROM my_table;

Кроме того, с помощью операторов `->>` и `#>>` можно получить значение ключа как текстовую строку. Пример:

sql SELECT data->>'name' AS name FROM my_table;

JSONB также поддерживает индексацию данных для более быстрого доступа к ним. Вы можете создать индекс на конкретные ключи внутри JSONB-объектов, чтобы улучшить производительность запросов, которые используют эти ключи. Пример создания индекса:

CREATE INDEX idx_name ON my_table USING GIN (data->'name');

JSONB также позволяет выполнять различные операции, такие как добавление или удаление элементов из JSONB-объекта, объединение объектов, извлечение значений и многие другие. Примеры операций:

UPDATE my_table SET data = jsonb_set(data, '{name}', '"John"');
SELECT jsonb_agg(data) FROM my_table;

JSONB в PostgreSQL также поддерживает индексацию GIN (Generalized Inverted Index), что позволяет выполнять поиск текста в JSONB-объектах с использованием оператора `@@`. Пример:

SELECT * FROM my_table WHERE data @@ 'New York';