Relacionamento MySql

21 views
Skip to first unread message

Pablo

unread,
Nov 7, 2019, 12:33:55 PM11/7/19
to Lista PHP
Boa tarde pessoal, preciso de uma dica.

Estou fazendo um modulo no meu sistema para troca de mensagens inicialmente entre 3 atores, sendo eles, clientes, fornecedores e usuários.

Eu fiz uma tabela de mensagens  e não estou encontrando uma forma elegante de relacionar as mensagens com cada tipo de usuário.

Em minha primeira tentativa, relacionei cada ator com a tabela de mensagens mas futuramente os atores irão aumentar então desisti desta solução.

Na segunda coloquei um inteiro como chave genérica  e criei uma coluna para para identificar o tipo porem assim também não ficou legal...

Alguém ai saberia como resolver este tipo de problema? 

Márcio Fornari

unread,
Nov 7, 2019, 12:45:43 PM11/7/19
to list...@googlegroups.com
Comece pensando qual é a regra do negócio.
Quem cria a 1º Mensagem? Todos ou tem que ser um em específico?
Quem cria a mensagem, cria para quem?
Todos os atores são obrigados a responder a mensagem?
É permitido um Usuário enviar uma mensagem para um Fornecedor e para
um Cliente ao mesmo tempo, ou tem que ser mensagens diferentes?
> --
> --
> ============================================================
> JQUERY MAGAZINE > http://www.jquerymagazine.com.br
> --
> PHP MAGAZINE > http://www.phpmagazine.com.br
> --
> LISTA NODE.JS > https://groups.google.com/group/lista-nodejs?hl=pt-br
> --
> AJAX-BRASIL > http://groups.google.com/group/ajax-brasil
> --
> PYTHON-GOOGLE > http://groups.google.com.br/group/python-google
> --
> DOTNET-BRASIL > http://groups.google.com.br/group/dotnet_br
> ============================================================
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo "LISTA PHP" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para listaphp+u...@googlegroups.com.
> Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/listaphp/CAGC6fw%2BakGFbyQhN4LD5oEYbFeZindnetAVqut9mzLv8z%3DAHAA%40mail.gmail.com.



--
............
Márcio Fornari

..........................................................................

Cassiano Ricardo Mourão

unread,
Nov 7, 2019, 1:18:12 PM11/7/19
to list...@googlegroups.com
Sem entrar em muito detalhe, sua solução será:

ator (id_ator, tipo, nome, senha, etc)
mensagem (id_mensagem, id_ator_origem, id_ator_destino, id_mensagem_original, assunto, corpo, data, etc)

Fazendo um join simples vc consegue pegar mensagens por tipo de ator e tals... O campo id_mensagem_original é apenas uma sugestão, caso você queira encadear mensagens.

Sem mistério, é literalmente isso aí.

Você está recebendo esta mensagem porque se inscreveu no grupo "LISTA PHP" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para listaphp+u...@googlegroups.com.

Cassiano Ricardo Mourão

unread,
Nov 7, 2019, 1:19:59 PM11/7/19
to list...@googlegroups.com
Verdade, o Marcio levantou uma bola que eu tinha assumido que não aconteceria: mensagens com multi-destinos. Se isso for possível é simples:

ator (igual está acima)
mensagem (igual acima, exceto o id_ator destino)
mensagens_destinos (id_mensagem, id_ator_destino)

Pronto, resolvido.

Pablo

unread,
Nov 7, 2019, 3:15:35 PM11/7/19
to Lista PHP
Cassiano, então desta forma que vc passou na hora do join como saberia se tenho que fazer com a tabela de cliente de fornecedor ou de usuário visto que cada um tem seu ID próprio e podem ser conflitantes entre si?

ator (id_ator, tipo, nome, senha, etc)
mensagem (id_mensagem, id_ator_origem, id_ator_destino, id_mensagem_original, assunto, corpo, data, etc)


--
Pablo Vanni
(65) 9-9998-8480

Cassiano Ricardo Mourão

unread,
Nov 7, 2019, 3:30:20 PM11/7/19
to list...@googlegroups.com
No caso, como eu disse, seria apenas 1 tabela para os atores. Pelas informações que você passou, eu considerei que a única diferença entre eles era realmente o tipo.
Mas tudo bem, entendi que você tem 3 estruturas distintas pra cada um desses atores, certo?
Nesse caso o mais simples seria acrescentar uma coluna "tipo_ator" na tabela mensagem (e na mensagens_destinos, caso seja seu caso - multi destinatarios), com um código FIXO por cada tipo possível. Sugestão: C, F e U. 
O "problema" agora chegou no ponto que você questionou, que você pode resolver tranquilamente com um union ou com um IF (na verdade não lembro como funciona o IF no mysql, então o garantido seria o union). Dá um saque:

select m.*, c.nome_cliente from mensagem m, cliente c where m.tipo_ator = 'C' and m.id_ator = c.id_cliente union
select m.*, u.nome_usuario from mensagem m, usuario u where m.tipo_ator = 'U' and m.id_ator = u.id_usuario union
select m.*, f.nome_fornecedor from mensagem m, fornecedor f where m.tipo_ator = 'F' and m.id_ator = f.id_fornecedor   

Pra esse solução você precisa criar um índice em mensagem.tipo_ator pra evitar full table accesses desnecessários. Não vai ficar lento, confia.
Ah, claro que você pode optar também por fazer selects externos de acordo com o tipo do ator, nas tabelas específicas.

Ps.: Você REALMENTE precisa dessas entidades separadas? Eles compartilham assim tão poucas informações?
Porquê você pode ter a tabela pai ator com todas as informações compartilhadas (nome, login, email, data_criacao, etc etc etc) e filhas com as informações específicas de cada um (fornecedor = cnpj, cliente = cpf, etc)

Pablo

unread,
Nov 7, 2019, 3:33:22 PM11/7/19
to Lista PHP
Obrigado Cassiano, vou tentar fazer desta forma.

Reply all
Reply to author
Forward
0 new messages