Wspaniałe pytanie!
Najpierw przyjmijmy pewne założenia dotyczące „lepszego”.
Zakładam, że nie zależy Ci zbytnio na przestrzeni dyskowej — maska bitowa jest wydajna z punktu widzenia przestrzeni, ale nie jestem pewien, czy ma to duże znaczenie, jeśli używasz serwera SQL.
Zakładam, że zależy ci na szybkości. Maska bitowa może być bardzo szybka podczas korzystania z obliczeń - ale nie będziesz w stanie użyć indeksu podczas zapytań o maskę bitową. Nie powinno to mieć większego znaczenia, ale jeśli chcesz wiedzieć, którzy użytkownicy mają dostęp do tworzenia, Twoje zapytanie będzie wyglądało mniej więcej tak
select * from user where permsission & CREATE = TRUE
(nie mam dziś dostępu do SQL Server, w drodze). To zapytanie nie będzie mogło użyć indeksu ze względu na działanie matematyczne - więc jeśli masz ogromną liczbę użytkowników, byłoby to dość bolesne.
Zakładam, że zależy Ci na łatwości utrzymania. Z punktu widzenia łatwości konserwacji maska bitowa nie jest tak wyrazista jak domena problemu, jak przechowywanie jawnych uprawnień. Prawie na pewno będziesz musiał zsynchronizować wartości flag masek bitowych w wielu komponentach - w tym w bazie danych. Nie niemożliwe, ale ból w plecach.
Tak więc, chyba że istnieje inny sposób oceny „lepszej”, powiedziałbym, że trasa maski bitowej nie jest tak dobra, jak przechowywanie uprawnień w znormalizowanej strukturze bazy danych. Nie zgadzam się, że byłoby to „wolniejsze, ponieważ musisz wykonać dołączenie” - o ile nie masz całkowicie dysfunkcyjnej bazy danych, nie będziesz w stanie tego zmierzyć (podczas gdy zapytania bez korzyści z aktywnego indeksu mogą stać się zauważalnie wolniej przy nawet kilku tysiącach rekordów).