Как лучше всего в Postgres хранить кучу произвольных логических значений для строки?

У меня есть база данных, полная рецептов, один рецепт на ряд. Мне нужно сохранить кучу произвольных «флажков» для каждого рецепта, чтобы отметить различные свойства, такие как Без глутона, Без мяса, Без красного мяса, Без свинины, Без животных, Быстрый, Легкий, С низким содержанием жира, Низкое содержание сахара, Низкая калорийность, Низкое содержание натрия и углеводов. Пользователи должны иметь возможность искать рецепты, содержащие один или несколько из этих флагов, установив флажки в пользовательском интерфейсе.

Я ищу лучший способ сохранить эти свойства в таблице рецептов. Мои идеи на данный момент:

  1. Создайте отдельный столбец для каждого свойства и создайте индекс для каждого из этих столбцов. У меня может быть около 20 таких свойств, поэтому мне интересно, есть ли какие-либо недостатки при создании целой группы столбцов BOOL в одной таблице.
  2. Используйте битовую маску для всех свойств и сохраните все это в одном числовом столбце, содержащем соответствующее количество битов. Создайте отдельный индекс для каждого бита, чтобы поиск был быстрым.
  3. Создайте ENUM со значением для каждого тега, затем создайте столбец с ARRAY этого типа ENUM. Я считаю, что предложение ANY в столбце массива может использовать INDEX, но я никогда этого не делал.
  4. Создайте отдельную таблицу с отображением рецептов на теги "один ко многим". Каждый тег будет строкой в ​​этой таблице.Таблица будет содержать ссылку на рецепт и значение ENUM, для которого тег включен для этого рецепта. При запросе мне пришлось бы выполнить вложенный SELECT, чтобы отфильтровать рецепты, которые не содержали хотя бы одного из этих тегов. Я думаю, что это более «нормальный» способ сделать это, но он действительно усложняет определенные запросы - если я хочу запросить 100 рецептов, а также отобразить все их теги, мне придется использовать INNER JOIN и объединить строк или используйте вложенный SELECT и агрегируйте на лету.

Производительность записи здесь не является большой проблемой, поскольку рецепты добавляются внутренним процессом, а скорость поиска имеет решающее значение (в конечном итоге может быть несколько сотен тысяч рецептов). Сомневаюсь, что буду добавлять новые теги так часто, но хочу, чтобы это было по крайней мере без головной боли.

Спасибо!

5
задан Mike Christensen 5 December 2011 в 04:08
поделиться