Я допустил ошибку, выбрав вариант 1, и, если бы у меня была возможность вернуться во времени, я бы сделал это совершенно иначе.
Ваша база данных почти наверняка не будет использовать индекс для выполнения побитовых запросов в вашей битовой маске. Так что, если вы хотите найти, скажем, всех, кто работает по вторникам, вы каждый раз будете выполнять индексное сканирование. Поскольку ваши таблицы становятся большими, это может снизить производительность. Вы можете попытаться оптимизировать эту ситуацию, заблаговременно кэшируя SELECT DISTINCT(bitmaskfield)
, выполняя логику битовой маски в своем собственном приложении и включая ее в соответствующее предложение WHERE bitmaskfield IN (...)
, но это быстро становится неосуществимым, поскольку вам необходимо обновить свое отдельное -bitmask кеш в каждом месте, где вы меняете значения в базе данных.
Дополнительные таблицы и объединения могут показаться болезненными, но битовая маска получится хуже. Поверь мне в этом. Используйте вашу базу данных в качестве базы данных.