Loading...

phpms@googlegroups.com

[Prev] Thread [Next]  |  [Prev] Date [Next]

Re: [phpms] Modelos com relacionamentos dinâmicos Cauan Cabral Tue Feb 07 13:00:46 2012

Opa pessoal, desculpem a demora na resposta, vou tentar comentar todas as
sugestões.

@begnini
Sobre o uso de herança, parece a solução ideal, mas em várias situações
ainda temos de trabalhar com MySQL. Onde trabalho
com PostgreSQL, irei com certeza estudar a aplicação.

Quanto ao uso de uma tabela que relacione minha classe "base" com as
"filhas", não vejo vantagens. De qualquer maneira continuarei
tendo de ver cada registro da tabela pai explicitamente para saber onde
buscar a tabela filha, com um nível a mais apenas. Talvez seja
uma forma mais normalizada de trabalhar, deixando a tabela pai ligeiramente
mais enxuta, mas não vejo grandes ganhos com isso.

No momento mantenho a integridade em nível de aplicação. O SGDB não garante
nada no esquema elaborado (nestes casos), cada vez que uma
operação envolve as tabelas de interesse as rotinas garantem a integridade
(qualquer erro do desenvolvedor pode sim prejudicar a integridade,
obviamente).
Acredito ser essa a vantagem maior do esquema envolvendo mais uma tabela.


@Bruno
Sua solução é idêntica a minha, como você mesmo apontou. Só diferencia ao
usar uma tabela extra para o relacionamento. Uso a própria tabela "pai" para
guardar o nome do modelo relacionado. Caímos nos mesmos problemas =]


@Evaldo
Realmente, tudo que é relacionado "vem", mas as queries costumam não ser
tão eficientes, e quando envolvem muitos relacionamentos o problema se
agrava.

Gostaria de reduzir o número de queries necessárias e lançar o máximo de
processamento das associações para o SGBD, atualmente tenho que deixar parte
da preparação dos dados no próprio script, fazendo queries individualmente
- por exemplo a vinculação de informações com mais de 2 níveis de
relacionamentos
mas que trazem informações relevantes, como nome de situações.

2012/2/6 Evaldo Barbosa <[EMAIL PROTECTED]>

> Se você trabalhar com uma ferramenta ORM esse seu problema será
> minimizado, pois toda vez que você precisar fazer busca na tabela "filha"
> com um eagerload você traz todos os dados que quiser.
>
> Atenciosamente,
>
> Evaldo Barbosa
> Analista de Sistemas / Desenvolvedor Web
>
> ESTOU SUBSTITUINDO ESSA CAIXA DE E-MAIL PELA:
> > [EMAIL PROTECTED]
> http://www.vivaolinux.com.br/~collapse
> http://www.twitter.com/evaldobarbosa
> http://www.via6.com.br/evaldobarbosa
>
>
>
> 2012/2/6 Bruno Gasparetto <[EMAIL PROTECTED]>
>
>> Com a herança no banco de dados o serviço fica mais fácil. Quando li
>> sobre herança no Postgres ainda haviam muitos comentários divergentes sobre
>> tal funcionalidade, mas ao que parece agora estão pensando com mais carinho
>> nessa funcionalidade.
>>
>> Usando o MySQL eu utilizo uma solução semelhante à do Begnini, com a
>> diferença que a utilizo uma tabela "genérica" para fazer o relacionamento
>> da "Balance" com os outros modelos, então nesta tabela guardo o nome do
>> modelo ao qual o relacionamento se refere, nesta parte de forma parecida ao
>> que o Cauan faz. Porém tenho o mesmo problema que você, Cauan, na questão
>> da complexidade em algumas tarefas simples.
>>
>> Em 5 de fevereiro de 2012 22:36, Humberto Pereira <[EMAIL 
>> PROTECTED]>escreveu:
>>
>> Vc resolve isso com heranca simples (especializacao).
>>>
>>> O seu movimento de caixa (Balance) eh a classe pai, e cada um dos
>>> modelos relacionados eh uma especializacao (EmployeeBalance,
>>> ServiceBalance, etc.)
>>>
>>> Alguns bancos de dados (PostgreSQL, por ex.) suportam heranca (sharding
>>> eh outro nome dessa funcionalidade) naturalmente. Voce tem uma tabela base
>>> onde todos os dados sao inseridos, e, dependendo de certo campo, sao
>>> inseridos em uma tabela filha tbm. Qdo vc faz o SQL na tabela pai, voce
>>> trabalha com todos os dados, e qdo faz em alguma tabela filha, voce ve
>>> apenas os dados daquele tipo.
>>>
>>> Para os bancos que nao suportam voce tem uma tabela base (Balance) e uma
>>> tabela filha (EmployeeBalance, por ex.) relacionadas 1 p/ 1. Nessa tabela
>>> filha fica o relacionamento com a outra entidade (Employee, nesse ex.).
>>> Isso resolve o problema da integridade que provavelmente vc nao esta
>>> mantendo hoje (qdo apaga um funcionario ou um produto, o q acontece com o
>>> movimento de caixa?)
>>>
>>> []s
>>> Begnini
>>>
>>>
>>> 2012/2/5 Cauan Cabral <[EMAIL PROTECTED]>
>>>
>>>> Tarde pessoal,
>>>>
>>>> Corriqueiramente enfrento o seguinte problema: um Modelo (M do MVC)
>>>> precisa manter relacionamentos
>>>> com outros Modelos (vários diferentes). Trabalho muito com CakePHP, mas
>>>> queria deixar a questão de uma
>>>> forma mais geral, então apesar de fazer algumas referências aqui, não
>>>> precisam prender a questão ao framework.
>>>>
>>>> Pense na situação: tenho um modelo que representa um movimento de
>>>> caixa, vou chamar de Balance. Esse
>>>> movimento pode ter como referência um serviço realizado (Service), um
>>>> funcionário pago (Employee), uma
>>>> despesa qualquer (não há uma entidade ligada), um produto vendido
>>>> (Product), etc.
>>>>
>>>>  Costumo resolver isso guardando no registro o nome do Modelo à que ele
>>>> se refere e a chave estrangeira, daí
>>>> ao ler o registro, vejo o valor e carrego os dados relacionados. Porém
>>>> isso aumenta muito a complexidade
>>>> de tarefas simples como busca ou paginação.
>>>>
>>>> Já pensei em alternativas como moldar uma interface para o Balance e
>>>> que tudo que possa gerar um novo fluxo
>>>> de caixa implemente seus métodos. Ainda assim teria de olhar um a um os
>>>> registros e carregar os dados relacionados,
>>>> mas teria uma assinatura uniforme entre os diferentes modelos.
>>>>
>>>> Como vocês trabalham com isso? Outra situação que pode exemplificar
>>>> isso é no log de ações do usuário.
>>>>
>>>>  Abraços,
>>>> --
>>>> Cauan Cabral
>>>> ----------------
>>>> Como falar comigo: Google Talk: [EMAIL PROTECTED] Skype: CauanCabral MSN:
>>>> [EMAIL PROTECTED]
>>>> Onde me encontrar: [image: 
>>>> Linkedin]<http://www.linkedin.com/in/cauancabral>[image:
>>>> Facebook] <http://www.facebook.com/cauancabral>[image: 
>>>> Wordpress]<http://cauancabral.net>[image:
>>>> Twitter] <http://twitter.com/cauancabral>[image: 
>>>> Orkut]<http://www.orkut.com.br/Main#Profile?uid=7512190439488689375>
>>>>
>>>>
>>>>  --
>>>> Você recebeu esta mensagem porque está inscrito no Grupo "phpms" em
>>>> Grupos do Google.
>>>> As regras de utilização deste grupo encontram-se em:
>>>> http://www.phpms.org/regras-da-lista
>>>> Para postar neste grupo, envie um e-mail para [EMAIL PROTECTED]
>>>> Para cancelar a sua inscrição neste grupo, envie um e-mail para
>>>> [EMAIL PROTECTED]
>>>> Para ver mais opções, visite este grupo em
>>>> http://groups.google.com/group/phpms?hl=pt-PT
>>>> Para acessar o site do grupo, visite: http://www.phpms.org/
>>>>
>>>
>>>  --
>>> Você recebeu esta mensagem porque está inscrito no Grupo "phpms" em
>>> Grupos do Google.
>>> As regras de utilização deste grupo encontram-se em:
>>> http://www.phpms.org/regras-da-lista
>>> Para postar neste grupo, envie um e-mail para [EMAIL PROTECTED]
>>> Para cancelar a sua inscrição neste grupo, envie um e-mail para
>>> [EMAIL PROTECTED]
>>> Para ver mais opções, visite este grupo em
>>> http://groups.google.com/group/phpms?hl=pt-PT
>>> Para acessar o site do grupo, visite: http://www.phpms.org/
>>>
>>
>>
>>
>> --
>> Bruno Gasparetto
>>
>> --
>> Você recebeu esta mensagem porque está inscrito no Grupo "phpms" em
>> Grupos do Google.
>> As regras de utilização deste grupo encontram-se em:
>> http://www.phpms.org/regras-da-lista
>> Para postar neste grupo, envie um e-mail para [EMAIL PROTECTED]
>> Para cancelar a sua inscrição neste grupo, envie um e-mail para
>> [EMAIL PROTECTED]
>> Para ver mais opções, visite este grupo em
>> http://groups.google.com/group/phpms?hl=pt-PT
>> Para acessar o site do grupo, visite: http://www.phpms.org/
>>
>
>  --
> Você recebeu esta mensagem porque está inscrito no Grupo "phpms" em Grupos
> do Google.
> As regras de utilização deste grupo encontram-se em:
> http://www.phpms.org/regras-da-lista
> Para postar neste grupo, envie um e-mail para [EMAIL PROTECTED]
> Para cancelar a sua inscrição neste grupo, envie um e-mail para
> [EMAIL PROTECTED]
> Para ver mais opções, visite este grupo em
> http://groups.google.com/group/phpms?hl=pt-PT
> Para acessar o site do grupo, visite: http://www.phpms.org/
>



-- 
Cauan Cabral
----------------
Como falar comigo: Google Talk: [EMAIL PROTECTED] Skype: CauanCabral MSN:
[EMAIL PROTECTED]
Onde me encontrar: [image:
Linkedin]<http://www.linkedin.com/in/cauancabral>[image:
Facebook] <http://www.facebook.com/cauancabral>[image:
Wordpress]<http://cauancabral.net>[image:
Twitter] <http://twitter.com/cauancabral>[image:
Orkut]<http://www.orkut.com.br/Main#Profile?uid=7512190439488689375>

-- 
Você recebeu esta mensagem porque está inscrito no Grupo "phpms" em Grupos do 
Google.
 As regras de utilização deste grupo encontram-se em: 
http://www.phpms.org/regras-da-lista
 Para postar neste grupo, envie um e-mail para [EMAIL PROTECTED]
 Para cancelar a sua inscrição neste grupo, envie um e-mail para [EMAIL 
PROTECTED]
 Para ver mais opções, visite este grupo em 
http://groups.google.com/group/phpms?hl=pt-PT
 Para acessar o site do grupo, visite: http://www.phpms.org/