Вопрос

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

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

  1. Поле Bitmasking в таблице пользователей
  2. Многие ко многим таблицам отношений, создавая таблицу в течение нескольких дней, пользователей и Days_users. Заранее спасибо.
Это было полезно?

Решение

Я бы сказал, что поля Bit Mask-это реляционный анти-паттерн.

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top