Лучший способ индексировать все поля JSONB с логическими значениями в PostgreSQL - PullRequest
0 голосов
/ 08 ноября 2019

Я создаю таблицу со столбцом features jsonb. Будет динамический набор функций (каждая строка может иметь неизвестный набор функций). Каждая функция имеет логическое значение true / false.

Пример:

  • Строка 1: функция: {"happy": true, "tall": false, "мотивированный": true}
  • Row 2:feature: {"happy": true, "fast": true, "strong": false}
  • строка 3: feature: {"smart": true, "fast": true, "sleepy": false}

Как лучше всего индексировать этот столбец, чтобы я мог выполнять запросы, чтобы найти все строки с featureX = true? Похоже, что во всех примерах, которые я просмотрел, необходимо использовать имя поля для индексации.

1 Ответ

4 голосов
/ 08 ноября 2019

Вы можете создать индекс по полному значению JSON:

create index on the_table using gin (features);

Его можно использовать, например, для оператора @>:

select *
from the_table
where features @> '{"happy": true}'

Другим способом было бы несохранить пары ключ / значение, но перечислить только те функции, которые являются «истинными» в массиве: ["happy", "motivated"], а затем использовать оператор ?. Таким образом, значение JSON будет немного меньше, и это может быть более эффективным.

select *
from the_table
where features ? 'happy'

или если вы хотите проверить несколько функций:

select *
from the_table
where features ?| array['happy', 'motivated']

Это тоже может использоватьиндекс Джин

...