Trabalho com um aplicativo que usa máscaras para armazenar atribuições de função de usuário. É uma dor no traseiro. Se isso me torna tendencioso, culpado de acusado.
Se você já estiver usando um banco de dados relacional, é um antipadrão que viola a maioria das teorias relacionais e todas as regras de normalização. Quando você cria seu próprio armazenamento de dados, pode não ser uma má idéia.
Há muitas tabelas sendo juntadas, mas bancos de dados relacionais são criados para lidar com isso. Muitos possuem recursos adicionais se o desempenho se tornar um problema: índices, visualizações indexadas etc. Mesmo que os valores que você está pesquisando não sejam alterados com muita frequência, o que é uma vantagem para o Bitmask, a sobrecarga de ter que gerenciar a indexação é bastante fácil no banco de dados.
Embora o banco de dados faça um bom trabalho de agregação de dados, eles podem ficar lentos quando você começa a introduzir coisas como fórmulas complexas ou Funções Escalares nos conjuntos de dados. Você pode fazer o bit a bit no seu aplicativo, mas se tudo o que você está fazendo é obter dados relacionados (procurando as funções de um usuário), não está tirando proveito do que seu armazenamento de dados faz melhor.
Meu último argumento contra isso seria a simplicidade para outros desenvolvedores. Você tem usuários, funções e atribuições. É um conjunto de relações muitos-para-muitos (porque há mais de um relacionamento) que é tão comum que deve ser fácil de gerenciar. São apenas coisas CRUD.