Excellente question !
Tout d'abord, formulons quelques hypothèses sur le terme "meilleur".
Je suppose que vous ne vous souciez pas beaucoup de l'espace disque - un masque de bits est efficace du point de vue de l'espace, mais je ne suis pas sûr que cela ait beaucoup d'importance si vous utilisez le serveur SQL.
Je suppose que vous vous souciez de la vitesse. Un masque de bits peut être très rapide lors de l'utilisation de calculs - mais vous ne pourrez pas utiliser d'index lors de l'interrogation du masque de bits. Cela ne devrait pas avoir beaucoup d'importance, mais si vous voulez savoir quels utilisateurs ont un accès de création, votre requête serait quelque chose comme
select * from user where permsission & CREATE = TRUE
(je n'ai pas accès à SQL Server aujourd'hui, je suis sur la route). Cette requête ne pourrait pas utiliser d'index à cause de l'opération mathématique - donc si vous avez un grand nombre d'utilisateurs, ce serait assez pénible.
Je suppose que vous vous souciez de la maintenabilité. Du point de vue de la maintenabilité, le bitmask n'est pas aussi expressif que le stockage de permissions explicites pour le domaine du problème sous-jacent. Il est presque certain que vous devrez synchroniser la valeur des drapeaux bitmask sur plusieurs composants, y compris la base de données. Ce n'est pas impossible, mais c'est pénible.
Donc, à moins qu'il n'y ait une autre façon d'évaluer ce qui est "mieux", je dirais que la route du bitmask n'est pas aussi bonne que le stockage des permissions dans une structure de base de données normalisée. Je ne suis pas d'accord sur le fait que ce serait "plus lent parce que vous devez faire une jointure" - à moins que vous ayez une base de données totalement dysfonctionnelle, vous ne serez pas en mesure de mesurer cela (alors que l'interrogation sans le bénéfice d'un index actif peut devenir sensiblement plus lente avec même quelques milliers d'enregistrements).