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