Это зависит от того, что вы подразумеваете под «эффективными» и как будут использоваться ваши данные.
Если вы стремитесь к удобочитаемости, у меня будет один столбец для каждого дня недели. Разработчик, который пытается выяснить, проводится ли курс по понедельникам, просто должен взглянуть на колонку «Понедельник»; Все запросы будут очень наглядными и простыми для понимания. Однако тот факт, что в ваших дневных столбцах будут редкие данные с низким количеством элементов, означает, что они не будут индексированными; если вы храните миллионы строк, это может стать проблемой.
Если вы стремитесь к абсолютной скорости, я бы использовал целое число для хранения дней и использовал побитовую арифметику; большинство движков СУБД действительно хороши в этом, и целочисленное поле может быть более «дружественным к индексу», потому что у вас, вероятно, будет приличный разброс значений. Однако запросы менее разборчивы, и вы можете получить глупые ошибки (начинается ли неделя в воскресенье или в понедельник?).
Это очень быстро, потому что каждая комбинация дат соответствует разному уникальному целому числу, которое, в свою очередь, позволяет эффективно индексировать столбец. Первоначальный расчет (превращение «понедельник и вторник, а не среда и (четверг или пятница) в целое число») происходит только один раз и выполняется очень быстро. Однако сравнение этого целого числа с миллионами записей в вашей таблице "классов" (я получил "миллионы" из вашего комментария, но это кажется очень большим числом ...) - это трудоемкий бит.
Я, конечно, не буду хранить ваш битовый флаг в строке - таким образом вы потеряете преимущество встроенной битовой логики.
Отдельная таблица может быть легко читаемой, но может привести к неловким запросам - для поиска всех курсов, которые работают по понедельникам и вторникам, но не по средам, требуется несколько объединений / предложений. Это может быть сложнее приклеить к интерфейсу (особенно если вы используете ORM).