Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Duvida sobre o composição manter ID Inicialmente gostaria de parabenizá-los pelo Framework e pelo livro, durante a leitura me ocorreu uma dúvida sobre a classe TRecord, a classe trata os relacionamentos do tipo composição citando a tabela customer e contact, onde um cliente poderá ter vários contatos e um contato só pertence a um cliente, pois bem, pelo exemplo do livro na figura 15 (pag 66) a tabela contact possuiria um iden...
JS
Duvida sobre o composição manter ID  
Fechado
Inicialmente gostaria de parabenizá-los pelo Framework e pelo livro, durante a leitura me ocorreu uma dúvida sobre a classe TRecord, a classe trata os relacionamentos do tipo composição citando a tabela customer e contact, onde um cliente poderá ter vários contatos e um contato só pertence a um cliente, pois bem, pelo exemplo do livro na figura 15 (pag 66) a tabela contact possuiria um identificador único "id" mas seria manipulada pelos métodos de sobrecarga dos métodos nativos dentro do model customer. o que me intrigou foi o fato de que toda vez que o método "store" é invocado na classe customer os registros de contato são excluídos e re-inseridos na base.
ai vem minha indagação com base em uma aplicação que eu desenvolvi onde o tráfego de alterações é muito alto na tabela principal (customer), mas nos registros de composição quase não se tem alterações (contact), observei que aderindo ao método "deleteComposite" citado no livro na pag 69 teria uma geração notória de novos registros diários, estourando assim o campo de chave primaria do meu registro de contatos tendo que eventualmente re-indexar a tabela.

ai vem a duvida existe alguma alternativa que verifica se os registros forma alterados e realiza updates ao invés de deletes dentro do próprio framework?

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (8)


FA

Não entendi bem... "os registros de contato são excluídos e re-inseridos na base."
Isso implica dizer que o Framework após uma inserção de dados ele deleta toda base de dados (mysql por exemplo) existente e em seguida faz a inserção de tudo?

LC

Exclui os registros ralcionados, ou seja, exclui os contatos e apos faz a inclusão novamente.
Eu também não gosto disso, em um cadastro de pessoas do meu sistema, onde tenho uma tabela de endereços relacionada com a tabela de pessoa, eu fiz os controles manualmente, então para incluir/alterar/excluir os endereços eu tenho que obrigatoriamente já ter incluido a pessoa.
FA

Leandro, eu antes de ir para o Framework eu relaciono toda meu banco de dados, onde em algumas tabelas que existe chaves estrangeiras, assim como sua explicação
da tabela de "pessoa". Sendo assim o banco não deixaria o framework trabalhar dessa forma, visto que há dependências. Você esta certo disso?

Eu vejo isso como uma coisa a se preocupar se de fato for assim. Pois imagine uma tabela com 89 mil registros (eu tenho uma tabela dessas, que diariamente são inclusos mais de mil registros em média). O Framework deletar tudo e incluir tudo pode ocasionar um grande esforço e consequentemente um futuro problema.

LC

Fred, não é que o frame exclui tudo, só os registros que são realcionados, ou seja, se uma pessoa tem 2 contatos, quando voçe faz uma alteração nesta pessoa ele vai excluir e incluir esses 2 contatos, não a tabela toda.
PD

Na composição, geralmente os registros relacionados são poucos (Ex: contatos), e o esforço computacional de comparar quais registros mudaram entre o que estão na memória e o que está em um BD geralmente é maior do que reinseri-los. Esta explicação está no livro do próprio Fowler (www.martinfowler.com/books/eaa.html).

Mas caso vocês tenham chaves estrangeiras apontando para o ID do objeto composto (Ex: Contato), e queiram preservar is ID's na composição podem usar essa estratégia:

  1. <?php
  2. class Book extends TRecord
  3. {
  4.     // ...
  5.     public function store()
  6.     {
  7.         // grava o livro
  8.         parent::store();
  9.         
  10.         // critério para apagar os agregados
  11.         $criteria = new TCriteria;
  12.         $criteria->add(new TFilter('book_id''='$this->id));
  13.         
  14.         // descobre os ids dos items que devem ser mantidos
  15.         if ($this->items)
  16.         {
  17.             foreach ($this->items as $item)
  18.             {
  19.                 if ($item->id)
  20.                 {
  21.                     $item_ids[] = $item->id;
  22.                 }
  23.             }
  24.         }
  25.         
  26.         
  27.         // apaga todos os itens, menos os que persistem
  28.         $criteria->add(new TFilter('id''NOT IN'$item_ids));
  29.         $repository = new TRepository('Item');
  30.         $repository->delete($criteria);
  31.         
  32.         // store the items
  33.         if ($this->items)
  34.         {
  35.             foreach ($this->items as $item)
  36.             {
  37.                 $item-> book_id $this-> id;
  38.                 $item->store();
  39.             }
  40.         }
  41.     }
  42. }
  43. ?>


1) Apaga só os que não existem mais em memória
2) Dá um store() em todos os demais, mantendo o ID, ou gerando um novo.

Atenciosamente,
LC

Putz eu escrevi errado: realcionados e voçe , da zero pra mim, rsrsrs. Agora esta diga do Pablo é bem legal.
AR

Fiquei ainda pensando no pq na necessidade de ainda termos que usar o delete(), mas acabei entendendo que se ele não for utilizado não se conseguiria remover um dado que se desejasse, da composição. Estou certo?
AR

Consigo realizar essa mudança no studio para que todas as models já fique nesse padrão?