Estou no processo de criar um esquema de banco de dados para o seguinte cenário:
- Existem usuários
- Os usuários têm funções (como "Desenvolvedor" ou "CEO")
- As funções têm aplicativos (como "Topdesk")
- Os aplicativos têm permissões (como "Atualizar a Base de Conhecimento")
- Uma função pode ter permissões, se a função já tiver acesso ao aplicativo
Assumindo que não haja ambiente de alto desempenho (sem necessidade de otimizar a velocidade), qual seria a melhor maneira de implementar esse esquema? O ambiente de banco de dados pode ser MySQL, MSSQL ... trata-se mais do design de banco de dados relacional.
Eu mesmo propus o seguinte:
A parte sobre a qual tenho mais incerteza é a tabela Applications_Permissions_Roles. É uma tabela de ligação em cima de outra tabela de ligação. Eu nunca usei ou vi isso antes. Outra maneira de fazer isso seria substituí-lo por uma tabela de vinculação entre Funções e Permissões e, em seguida, usar código ou restrições para garantir as relações necessárias ... mas isso não parece ser uma boa solução para mim. Essas coisas devem ser aplicadas no nível do banco de dados, se possível (e parece possível), não no nível do código.
Em segundo lugar, é necessário o link entre Permissions.Application e Applications.Id? Eu o uso porque talvez não haja linhas em Roles_Applications (como quando você acabou de adicionar um novo aplicativo) e, em seguida, não é possível determinar quais permissões pertencem a qual aplicativo. Também é um ponto de referência único para pesquisar a qual aplicativo uma permissão pertence. Eu acho que isso está certo, mas também faz um círculo no design do banco de dados. Erros MSSQL nele ao tentar definir ON_DELETE ou ON_UPDATE para cascata.
Alguma sugestão, ou é assim que deve ser feito? Quaisquer outras sugestões relacionadas à convenção de nomenclatura e outras também são bem-vindas (talvez como comentário).
Obrigado
Luc
Editar: Título alterado, espero torná-lo mais claro. O anterior foi mais abrangente, mas provavelmente muito complicado.
Roles_Applications
seja real. Dado que todas as permissões são específicas do aplicativo, parece que existem Applications_Permissions
(o que você rotulou Permissions
), que podem ser atribuídas a funções específicas por meio de um registro no Applications_Permissions_Roles
. Roles_Applications
, de fato, parece estar descrevendo a permissão de aplicativo mais básica - acesso simples. Ou, é afirmar que uma função tem algum nível de permissões para um aplicativo, mas você precisa procurar em outro lugar para determinar quais.