Herrliche Frage!
Lassen Sie uns zunächst einige Annahmen über "besser" treffen.
Ich gehe davon aus, dass Sie sich nicht viel um Speicherplatz kümmern - eine Bitmaske ist aus Platzgründen effizient, aber ich bin mir nicht sicher, ob dies wichtig ist, wenn Sie SQL Server verwenden.
Ich gehe davon aus, dass Ihnen Geschwindigkeit wichtig ist. Eine Bitmaske kann bei der Verwendung von Berechnungen sehr schnell sein - Sie können jedoch keinen Index verwenden, wenn Sie die Bitmaske abfragen. Dies sollte nicht allzu wichtig sein, aber wenn Sie wissen möchten, welche Benutzer Zugriff erstellen, ist Ihre Abfrage ungefähr so
select * from user where permsission & CREATE = TRUE
(Ich habe heute unterwegs keinen Zugriff auf SQL Server). Diese Abfrage kann aufgrund der mathematischen Operation keinen Index verwenden. Wenn Sie also eine große Anzahl von Benutzern haben, ist dies ziemlich schmerzhaft.
Ich gehe davon aus, dass Ihnen die Wartbarkeit am Herzen liegt. Unter dem Gesichtspunkt der Wartbarkeit ist die Bitmaske nicht so aussagekräftig wie die zugrunde liegende Problemdomäne wie das Speichern expliziter Berechtigungen. Sie müssten mit ziemlicher Sicherheit den Wert der Bitmaskenflags über mehrere Komponenten hinweg synchronisieren - einschließlich der Datenbank. Nicht unmöglich, aber Rückenschmerzen.
Sofern es keine andere Möglichkeit gibt, "besser" zu bewerten, würde ich sagen, dass die Bitmaskenroute nicht so gut ist wie das Speichern der Berechtigungen in einer normalisierten Datenbankstruktur. Ich bin nicht damit einverstanden, dass es "langsamer ist, weil Sie einen Join durchführen müssen" - wenn Sie nicht über eine völlig funktionsgestörte Datenbank verfügen, können Sie dies nicht messen (während das Abfragen ohne den Vorteil eines aktiven Index spürbar werden kann langsamer mit sogar ein paar tausend Datensätzen).