Хранение флагов в БД
В моем приложении я бы хотел, чтобы пользователь выбирал свои рабочие дни. затем сохраните их в базе данных. Конечно, мое приложение будет обрабатывать данные пользователей, например: сегодня рабочий день для конкретного пользователя, кто из пользователей должен работать сегодня, и т. Д.
У меня вопрос, какова лучшая практика для этого? я должен использовать:
- Поле битовой маскировки в таблице пользователей
- Много ко многим таблицам отношений, создавая таблицу для days, users и days_users. Заранее спасибо.
3 ответа
Я бы сказал, что поля битовой маски являются реляционным анти-паттерном.
Поле должно иметь одно значащее значение, в противном случае вы столкнетесь с проблемами - анализируйте поле каждый раз, когда вам нужно выполнить запрос, используя его.
Такое поле также требует дополнительной документации, так как значения, которые оно хранит, не описывают сами себя.
Поле битовой маскировки немного более загадочно по своей природе, и вам нужно создать что-то еще, чтобы интерпретировать то, что вы храните в битовой маске.
Второй подход намного более прозрачен и легко понятен, и он немного более гибок, если вам нужно добавить больше значений. С битовой маской вам снова нужно повторять ваш растровый декодер каждый раз, когда вы добавляете значение, которое может быть кошмаром обслуживания по сравнению с реляционным подходом.
Я допустил ошибку, выбрав вариант 1, и, если бы у меня была возможность вернуться назад во времени, я бы поступил совершенно иначе.
Ваша база данных почти наверняка не будет использовать индекс для выполнения побитовых запросов в вашей битовой маске. Так что, если вы хотите найти, скажем, всех, кто работает по вторникам, вы каждый раз будете выполнять индексное сканирование. Поскольку ваши таблицы становятся большими, это может снизить производительность. Вы можете попытаться оптимизировать это, кэшируя SELECT DISTINCT(bitmaskfield)
заблаговременно, делая логику битовой маски в вашем собственном приложении, и превращая ее в соответствующий WHERE bitmaskfield IN (...)
предложение, но это быстро становится неуправляемым, так как вам придется обновлять свой кэш с разным битовой маской в каждом месте, где вы изменяете значения в базе данных.
Дополнительные таблицы и объединения могут показаться болезненными, но битовая маска получится хуже. Поверь мне в этом. Используйте вашу базу данных в качестве базы данных.