Estou tendo dificuldade em encontrar uma resposta porque estou tendo dificuldade em expressar a pergunta. Portanto, peço desculpas se a pergunta for duplicada (ou semelhante) aqui.
Existe uma maneira de limitar o número de referências a uma chave estrangeira específica no MySQL?
Explicado via metáfora:
Imagine-o como um grupo de estudo com um 'líder'. Você tem uma mesa de 'líderes' e uma mesa de 'membros'.
Existe uma maneira de evitar que cada 'líder' tenha mais de 'x número' de 'membros' atribuídos a eles via chave estrangeira?
Ou isso é algo que eu teria que fazer ao criar os 'membros' em primeiro lugar? ou seja alguma maneira de verificar quantas referências já existem e alterar a chave estrangeira se o ID for > 'x número'
Obrigado por qualquer ajuda ou direção que você possa dar!
Não tenho certeza se esta é uma solução muito limpa, mas pode funcionar.
Suponha que você tenha uma
Leader
mesa e umaMember
mesa. Crie uma terceira tabela,LeaderMember
. Isso deve ter três colunas,LeaderID
,MemberID
eMemberNumber
.LeaderID
eMemberID
são chaves estrangeiras para as respectivas tabelas.CREATE TYPE
para aMemberNumber
coluna, restringindo os valores inteiros que ela pode assumir, por exemplo de 1 a 8.Agora imponha duas restrições na tabela. Primeiro, uma
UNIQUE
restrição emMemberID
, que garante que um membro só pode ter um líder. Em seguida, umaUNIQUE
restrição na combinação de colunas(LeaderID, MemberNumber)
. Isso significa que cada líder só pode ter tantos membros quantos forem os valores distintos possíveis paraMemberNumber
.Posso ver algumas desvantagens com isso - antes de mais nada, inserir um novo
Member
agora é um pouco complicado, pois você precisa encontrar um valorMemberNumber
que não foi usado. Lembre-se de que você deve fazer uma verificação neste ponto de qualquer maneira - para ver se oLeader
em questão já possui membros suficientes. Em segundo lugar, o tipo para oMemberNumber
pode sugerir que há alguma diferença entre os membros que têm valores diferentes - que os números são significativos.No entanto, acho que é um design razoavelmente limpo e normalizado.