Estou tentando adicionar a capacidade de um usuário ser autorizado com uma determinada função em um contrato/site/experimento.
Mais especificamente, quero que um usuário tenha a função A em um contrato, mas ao mesmo tempo a função B em um site específico desse mesmo contrato e possivelmente uma função C em um experimento desse site.
Minha primeira ideia foi uma tabela de junção entre User
e Role
com uma terceira coluna armazenando o id de um contrato, site ou experimento.
Esta solução tem muitos problemas na minha opinião:
- Preciso de uma linha para o contrato, cada site autorizado e cada experimento autorizado. Pode crescer muito muito rápido.
- Nenhuma integridade. Um contrato inexistente pode ser referenciado
- Se eu quiser saber todos os sites e experimentos de um contrato onde um usuário está autorizado, primeiro tenho que consultar todos os sites desse contrato, depois todos os experimentos desses sites e então encontrar todas as linhas que fazem referência a esses IDs. Parece um pouco hackeado.
Sinto que essa solução pode funcionar, mas eu estava pensando se havia outra maneira? Talvez algum padrão que eu não conheça?
PS: Estou usando MySQL v8