Я бы сделал третий вариант, который изменил бы ваши битовые поля на tinyint (все в семействе int или varbinary также работало бы, но вам, вероятно, нужно всего 2-3 флага) и использовал бы битовые операторы ( преобразование не потребуется) для проверки уровня безопасности. Это не добавит столбцы или таблицы.
Обычно я делаю это, когда есть несколько комбинаций контроля доступа, необходимых для одного и того же ресурса. Например, у меня есть столбец int с именем calendar_permissions и я присваиваю следующие значения от наименьшего к наиболее значимому биту: view (1), add (2), edit (4), delete (8). Поэтому, если бы я хотел проверить разрешения на удаление, я бы выполнил условие «intvalue AND 8 = 1». (если бы у пользователя были все разрешения, значение было бы 15 = 8 + 4 + 2 + 1)
В вашем случае 1 будет разрешением пользователя, 2 будет разрешением группы, а при желании 3 будет разрешением пользователя и группы. Вы можете показать это через представление, если вам не нравится, когда ваше приложение выполняет побитовую арифметику.
Поскольку вы определяете 2 как групповое разрешение, ваши вызовы для проверки разрешения «пользователь» должны быть обратно совместимыми, поскольку целочисленное значение 1 приводит к значению true.
При желании вы можете наложить ограничения на эти поля, чтобы ограничить значения, которые имеют смысл для вашего приложения.
PRO: нет дополнительных столбцов / таблиц, обратно совместимых с текущей системой.
CON: Не столь удобочитаемый, у некоторых людей возникают проблемы с побитовыми операциями. Возможно, вам придется создать представление, чтобы заставить кого-либо фактически использовать его.