Eu tenho um simples relacionamento N:M:
Usuário da tabela:
- Código da coluna
- Nome de usuário da coluna
- Coluna is_superuser (booleano)
Permissão de Tabela:
- Código da coluna
- Nome da coluna
Permissão de usuário da tabela:
- Código da coluna
- Usuário de chave estrangeira
- Permissão de chave estrangeira
Eu quero garantir que, se o usuário tiver "is_superuser=True", ele deverá ter todas as permissões disponíveis definidas via N:M Table UserPermission.
Operações típicas:
- Atualizar ou inserir na tabela "User": o usuário é definido como "is_superuser". Agora a UserPermission precisa ter todas as permissões para este usuário
- Uma nova permissão é adicionada à tabela de permissões. Agora a UserPermission precisa obter N novas linhas (para cada usuário com is_superuser=True).
Como garantir isso com o Postgres 9.6?
Sub-questão (por favor, deixe um comentário): Existe um nome para este padrão?
Isto é um erro. Basta juntar as tabelas e inferir permissões.
Agora escrevemos uma consulta que une usuários com permissões para que possamos ver todas as permissões de usuários. E, então, deixamos a junção externa para todos os usuários que não são superusuários, com a tabela de vinculação. Nós inferimos se
has_permission
eles sãois_superuser OR /have entry in linking table/
. Ois_superuser
é uma fonte superior: não nos importamos mais com o que está na tabela de vinculação se tivermos esse conjunto bool. Isso torna seu trabalho simples e eficiente. Você não precisa manter as tabelas sincronizadas.Produz