¡Espléndida pregunta!
En primer lugar, hagamos algunas suposiciones sobre "mejor".
Supongo que no le importa mucho el espacio en disco:una máscara de bits es eficiente desde el punto de vista del espacio, pero no estoy seguro de que eso importe mucho si está utilizando un servidor SQL.
Supongo que te importa la velocidad. Una máscara de bits puede ser muy rápida cuando se usan cálculos, pero no podrá usar un índice cuando consulte la máscara de bits. Esto no debería importar tanto, pero si desea saber qué usuarios tienen acceso de creación, su consulta sería algo como
select * from user where permsission & CREATE = TRUE
(no tengo acceso a SQL Server hoy, en el camino). Esa consulta no podría usar un índice debido a la operación matemática, por lo que si tiene una gran cantidad de usuarios, esto sería bastante doloroso.
Supongo que te preocupas por la mantenibilidad. Desde el punto de vista de la mantenibilidad, la máscara de bits no es tan expresiva como el dominio del problema subyacente como el almacenamiento de permisos explícitos. Es casi seguro que tendrá que sincronizar el valor de los indicadores de máscara de bits en varios componentes, incluida la base de datos. No imposible, pero dolor en la parte trasera.
Entonces, a menos que haya otra forma de evaluar "mejor", diría que la ruta de máscara de bits no es tan buena como almacenar los permisos en una estructura de base de datos normalizada. No estoy de acuerdo en que sería "más lento porque tiene que hacer una unión":a menos que tenga una base de datos totalmente disfuncional, no podrá medir esto (mientras que consultar sin el beneficio de un índice activo puede volverse notablemente más lento incluso con unos pocos miles de registros).