Хранение флагов в БД - PullRequest
       28

Хранение флагов в БД

4 голосов
/ 16 января 2011

В моем приложении я бы хотел, чтобы пользователь выбирал свои рабочие дни.затем сохраните их в базе данных.Конечно, мое приложение будет обрабатывать данные пользователей, такие как: сегодня рабочий день для конкретного пользователя, кто из пользователей должен работать сегодня, и т. Д.

Мой вопрос: что лучше?практиковаться в этом?я должен использовать:

  1. Поле битовой маскировки в таблице пользователей
  2. Многие ко многим таблицам отношений, создавая таблицу для days, users и days_users.Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 16 января 2011

Я бы сказал, что поля битовой маски являются реляционным антишаблоном.

Поле должно иметь одно значащее значение, в противном случае у вас возникнут проблемы с запросом - разбор поля каждый раз, когда вам нужно выполнить запрос, используя его.

Такое поле также требует дополнительной документации, так как значения, которые оно хранит, не описывают сами себя.

2 голосов
/ 16 января 2011

Я допустил ошибку, выбрав вариант 1, и, если бы у меня была возможность вернуться во времени, я бы сделал это совершенно иначе.

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

Дополнительные таблицы и объединения могут показаться болезненными, но битовая маска получится хуже. Поверь мне в этом. Используйте вашу базу данных в качестве базы данных.

2 голосов
/ 16 января 2011

Поле битовой маскировки немного более загадочно по своей природе, и вам нужно создать что-то еще, чтобы интерпретировать то, что вы храните в битовой маске.

Второй подход намного более прозрачен и легко понятен, и он немного более гибок, если вам нужно добавить больше значений. С битовой маской вам снова нужно повторять ваш растровый декодер каждый раз, когда вы добавляете значение, которое может быть кошмаром по сравнению с реляционным подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...