Как лучше сделать и стоит ли использовать Enum/Set?
Суть задачи. Есть материалы - которые должны отображаться только в выбранных городах.
При сохранении мы указываем - где они отображаются.
Города на выбор:Москва, Казань, Уфа, Пекин, либо все города.
Можно выбирать - несколько городов, либо вообще все города.
Задача: каким образом хранить данные о городе в БД, чтобы в последующем в один запрос вывести все связанные материалы.
P.S. Вариант отдельной таблицы - где хранить информацию о выбранных городах пока откладываем, так как, записей будет достаточно много.
Всем заранее спасибо за мысли!
UPD
Города представлены как:
Москва - 1
Казань - 10
Уфа - 100
Пекин - 1000
И создан массив возможных пар для каждого города, который представляет собой сумму значений bindec().
То есть для материала, который должен отображаться в Москве и Казани будет 11 => 3.
О том, насколько это производительнее пока сложно сказать - чуть позже сделаю тест и отпишусь же здесь.
Салават Ситдиков: производительнее - хранить связанные ID в одном поле в записи (через запятую, или в любом другом формате).
Но тогда возникает проблема добавления\удаление\изменения данных в этих полях. Большая вероятность ошибки и потери целостности данных.
D' Normalization: как альтернативный вариант продумывал - но при выборке придется использовать LIKE %,id,% что уже не производительно.
Альтернативный вариант - это создать таблицу комбинаций и пользоваться ею. Тогда вся логика будет в программном коде, а из базы будут доставаться уже нужные величины.
То есть, если города представим в двоичном формате
Москва - 0001
Казань - 0010
Уфа - 0100
Пекин - 1000
То для Казани будут варианты:
0010, 0011, 0110, 1010, 0111, 1110, 1011 - переводим их в десятичное и храним эти значения, а потом проверяем через city_id IN .
Правда не уверен, что это корректный и правильный способ.