Я пишу небольшое приложение в PHP + MySQL и дошел до того момента, когда есть объект, у которого есть пара (до сих пор, но не ожидается увеличения) связанных с ним флагов. Флаги довольно несвязаны, хотя есть несколько комбинаций, которые не имели бы никакого смысла. Объект представляет строку в БД (имеет некоторые методы для ее сохранения и загрузки), поэтому вопрос также относится к выбору метода хранения.
Вопрос - как наилучшим образом представить их как в коде, так и в БД? Я могу представить несколько способов:
Один из способов хранения их в БД находится в одном целочисленном поле в виде поразрядных флагов. На стороне PHP я могу представить несколько способов их представления:
- Просто экспортируйте целочисленное значение и определите пару констант флага; Пусть каждое место, где нужны флаги, выполняет свою собственную поразрядную магию;
- Определить методы класса
GetFlag()
,SetFlag()
иUnsetFlag()
, которые выполняют побитную магию для частной целочисленной переменной; Эти методы затем будут переданы одной из констант флага в качестве параметров. - Определить методы
GetFlagA()
,GetFlagB()
и т.д. (вместе с Set и Unset counterparts); - Определите группу переменных-членов, каждая из которых представляет один флаг; Установите их при загрузке из БД и соберите их при сохранении.
- Создайте переменную-член, являющуюся массивом всех значений флага. Используйте предопределенные константы в качестве индексов массива для доступа к каждому флагу. Также заполните/собрайте массив при загрузке/сохранении.
Другой способ - сохранить их в БД как отдельные поля BIT. В PHP, который затем переводится на несколько переменных-членов. ИМХО это усложнит запросы.
И последним способом было бы определить анонированную таблицу для всех флагов и промежуточную таблицу для отношений "многие ко многим" между флагами и исходными объектами. ИМХО - самый грязный из всех решений, учитывая, что в противном случае будет только 3 таблицы.
Я не делал много PHP-разработки, поэтому я не знаю, какой будет лучшая практика. В С# я, вероятно, сохранил бы их как побитовые флаги и делал бы свойства, которые выполняют побитную магию на частном целое. Но у PHP нет свойств (я использую последнюю стабильную версию)...