Стоит ли использовать JSONB для хранения данных, по которым предстоит фильтроваться?

Есть задача сделать набор динамических атрибутов у объекта в БД. Они могут быть разных типов, например, числа и строки. Выбираю между тем, чтобы записывать их в JSONB поле в виде ключей и значений или сделать классическую таблицу с атрибутами one to many relation. Сильно ли скорость выборок по JSON будет ниже? Фильтрации будут простые, но объектов может быть довольно много. Или лучше использовать JSONB только для тех данных, по которым фильтрации не будет?


Ответы (1 шт):

Автор решения: Ainar-G

Начну с того, что лучше всё же проектировать нормализованную схему по умолчанию. Из личного опыта мучений работы с изменяемым JSON(B) в PostgreSQL (правда, до включения в него расширений SQL/JSON) я выработал простое эмпирическое правило. Используйте JSON(B), если:

  1. данные либо неизменяемые, либо заменяемые целиком, и…
  2. данные небольшие (≤ 2–3 КиБ), и…
  3. у вас действительно будут разные запросы по разным частям этих данных.

Если вы собираетесь эти атрибуты менять, то я бы всё же рекомендовал нормализованные данные. Насчёт же скорости работы судить без реальных данных тяжело, да и от машины может зависеть. Но на небольших данных, средней машине, и с подходящими индексами замедление JSON(B) критичным быть не должно.

→ Ссылка