Задача следующая:
Имеется айтем, у которого может быть до 20 определенных опций (их их количество не изменится в будущем). Как хранить их в бд?
Варианта 3:
1. Создать отдельную таблицу, где будет 20 столбцов опций + столбец item_id. Есть опция вкл - пишем единицу, иначе ноль.
2. В общей таблице айтемов создать столбец и хронить там json доступных опций
3. Создать новую таблицу из 3 столбцов: id, item_id, option, и потом искать, есть ли запись с таким-то item_id и таким-то option
Первый способ не очень нравится ввиду большого количество столбцов.
Во втором варианте смущает json в бд. Плюс нужно будет кодировать и декодировать каждый раз.
Третий способ смущает тем, что таблица получится большой. Плюс, если у айтема будет пропадать опция (и будет удаляться запись из бд соответсовенно), то будет фрагментация таблицы.
Всего 3 таблицы:
2 таблицы: items и options
и одну "многие-ко-многим" (промежуточную): item_id, option_id (есть строка-"связка" - опция есть/включена у объекта)
Т.е. промежуточная таблица будет хранить только уникальные связи.
А быстрый поиск - можно делать как по опции, так и по айтему.
И добавить свойства или айтемы - проблем нет.