Великолепный вопрос!
Во-первых, давайте сделаем некоторые предположения о «лучшем».
Я предполагаю, что вам не очень важен объем дискового пространства - битовая маска эффективна из пространстваточка зрения, но я не уверен, что это имеет большое значение, если вы используете сервер SQL.
Я предполагаю, что вы заботитесь о скорости.При использовании вычислений битовая маска может быть очень быстрой, но вы не сможете использовать индекс при запросе битовой маски.Это не должно иметь большого значения, но если вы хотите узнать, какие пользователи имеют доступ для создания, ваш запрос будет выглядеть примерно так:
select * from user where permsission & CREATE = TRUE
(у вас нет доступа к SQL Server сегодня, в дороге).Этот запрос не сможет использовать индекс из-за математической операции - поэтому, если у вас огромное количество пользователей, это будет довольно болезненно.
Я полагаю, вы заботитесь о ремонтопригодности.С точки зрения удобства обслуживания битовая маска не так выразительна, как основная проблемная область, как хранение явных разрешений.Вам почти наверняка придется синхронизировать значение флагов битовой маски для нескольких компонентов, включая базу данных.Не невозможно, но боль в спине.
Итак, если нет другого способа оценки «лучше», я бы сказал, что маршрут с битовой маской не так хорош, как хранение разрешений в нормализованной структуре базы данных.Я не согласен с тем, что это будет «медленнее, потому что вам нужно выполнить соединение» - если у вас нет полностью нефункциональной базы данных, вы не сможете измерить это (тогда как запросы без использования активного индекса могут стать заметномедленнее даже с несколькими тысячами записей).