У меня есть база данных, полная рецептов, по одному рецепту на строку.Мне нужно хранить несколько произвольных «флагов» для каждого рецепта, чтобы отметить различные свойства, такие как отсутствие глютона, отсутствие мяса, отсутствие красного мяса, отсутствие свинины, отсутствие животных, быстрый, легкий, низкий уровень жира, низкий уровень сахара, низкая калорийность,Низкий натрий и низкий карбонат.Пользователи должны иметь возможность искать рецепты, содержащие один или несколько из этих флагов, установив флажки в пользовательском интерфейсе.
Я ищу лучший способ сохранить эти свойства в таблице рецептов.Мои идеи до сих пор:
- Для каждого свойства есть отдельный столбец и создайте индекс для каждого из этих столбцов.У меня может быть более 20 таких свойств, поэтому мне интересно, есть ли какие-либо недостатки в создании целой группы столбцов BOOL в одной таблице.
- Используйте битовую маску для всех свойств и сохраните все этов одном числовом столбце, который содержит соответствующее количество битов.Создайте отдельный индекс для каждого бита, чтобы поиск был быстрым.
- Создайте ENUM со значением для каждого тега, а затем создайте столбец с массивом этого типа ENUM.Я полагаю, что ЛЮБОЕ предложение в столбце массива может использовать INDEX, но никогда этого не делали.
- Создайте отдельную таблицу, в которой есть сопоставление рецептов «один ко многим» с тегами.Каждый тег будет строкой в этой таблице.Таблица будет содержать ссылку на рецепт и значение ENUM, для которого тег «включен» для этого рецепта.При запросе я должен был бы сделать вложенный SELECT, чтобы отфильтровать рецепты, в которых не было хотя бы одного из этих тегов.Я думаю, что это более «нормальный» способ сделать это, но он делает некоторые запросы более сложными - если я хочу запросить 100 рецептов, а также отобразить все их теги, мне придется использовать INNER JOIN и объединитьстрок или используйте вложенный SELECT и агрегируйте на лету.
Производительность записи здесь не слишком большая проблема, так как рецепты добавляются бэкэнд-процессом, а скорость поиска критична (может бытьнесколько сотен тысяч рецептов в итоге).Я сомневаюсь, что я буду добавлять новые теги так часто, но я хочу, чтобы по крайней мере было возможно обойтись без серьезных головных болей.
Спасибо!