Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tayron Miranda

Fazer insert em multiplas tabelas no banco de dados tratanto exceções

Recommended Posts

Bom, olá...

 

Gostaria de saber quais técnicas existem para atender a seguinte condição:

Hoje em dia, devido novos conceitos, tanto na parte de programação, quando na parte de criação de DER, tenho a seguinte dúvida cruel... fazer insert em multiplas tabelas...

 

Bom, eu tenho que cadastrar cliente no meu sistema, porém a tabela cliente tem relação com pelo menos umas 10 tabelas.. (endereco, email, usuario, avatar, etc....)

 

Hoje para realizar esse cadastro o que faço:

 

/*
* Cadastrando cliente
*/

// Cadastrando endereco
$sql   = "Insert into endereco set logradouro = '$logradouro', numero = '$numero'.....";
$query = mysql_query($sql);

// Verifico se consegui cadastrar o endereco
if($query == true){
   $idendereco = mysql_insert_id();

   // Cadastrando email 
    $sql   = "Insert into email set nome = '$email'";
    $query = mysql_query($sql);  

   // Verifico se consegui cadastrar o email
   if($query == true){

       $idemail = mysql_insert_id(); 

       // Cadastrando cliente
        $sql   = "Insert into cliente set nome = '$nome', endereco_idendereco = $idendereco, email_idemail = $idemail";
        $query = mysql_query($sql);  

        // Verifico se consegui cadastrar o cliente
        if($query == true){

           $return TRUE;

        }else{

           // se nao consegui cadastrar o cliente delete o endereco e email_idemail
           $sql = "Delete from endereco where idendereco = '$idendereco'";
           mysql_query($sql);         

           $sql = "Delete from email where idemail = '$idemail'";
           mysql_query($sql);  

           return FALSE;                   
        }         

   }else{

       // Se eu nao consegui cadastrar o email eu deleto o registro do endereco
       $sql = "Delete from endereco where idendereco = '$idendereco'";
       mysql_query($sql);

       return FALSE;
   }

}else{

  // Se eu nao consegui cadastrar o endereco retorno false   
  return FALSE;
}

 

Isso acima foi apenas para realizar cadastro envolvendo 3 tabelas com poucos atributos.. lembrando que o exemplo acima foi improvisado, se funciona.. é outra história.. rsrrs

Enfim.. imagina isso ai com umas 10 tabelas.. :( vai ser massante tratar os efs e else..

 

Alguém realiza essa tarefa de forma mais elegante?

Lembrando que uso o bando de dados Mysql

Compartilhar este post


Link para o post
Compartilhar em outros sites

agora me diga... pq não faz um tabela só para clientes???

 

com todos os seus dados...

 

não tem lógica você fazer uma tabela só pra email, outra só para endereço, outra só pra outra coisa...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse exemplo acima.. não tá baseado em nenhuma regra... mas no caso digamos que essas tabelas serão reaproveitadas por outras demais tabelas.. e que o email por exemplo não deve duplicar... enfim.. jogar todos os dados em uma única tabela... dificulta uma implementação futura, ainda mais se tratando de clientes que vivem mudando as regras do sistema..

 

 

Mas o problema no caso não é como deve ser criado a modelagem.. mas sim como tratar esse tipo de insert.. pois como visto acima se torna complicado tratar as exceções, pois, fazer isso com delete e update é filé, pois rola de usar inner join, mas insert não tem inner join...

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Jonatã Cioni está certo, você criando várias tabelas assim

vai acabar dando pau no banco de dados, você cria uma tabela única prós clientes

e pronto, procura eles por um valor único como ID ..

 

Mas o problema no caso não é como deve ser criado a modelagem..

 

Claro que tem, um banco mal modelado, torna seu sistema mal feito

você pode não ter problema hoje, amanha .. mais vai ser um grande

desperdício de processamento, imagina se você tem uma tabela pra cada cliente

e você tem 200 clientes, uma tabela pra cada email, e tem 200 emails ...

e você vai fazer 200 inserts, em 200 tabelas ? não faz sentido isso

 

no Titulo do tópico:

Fazer insert em multiplas tabelas no banco de dados tratando exceções

 

Isso não dispara exceções para poderem ser tratadas, o que você está fazendo

e lógica simples

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas se tratando de POO, não acha que o banco de dados deveria acompanhar essa metodologia...criando tabelas mais genéricas..

 

Se tenho uma tabela pra armazenar clientes, teremos dentro dessa tabela os atributos que faz com que um cliente exista...

Ex.: todo cliente tem que ter um nome.. mas um cliente sem numero de celular, ainda é um cliente, afinal de contas, ninguém vai deixar de vender pra ele caso ele não tenha um telefone..., dai torna-se indispensável o nome, mas o telefone nem tanto...

 

Com isso na hora de criar a programação, teremos as classes mais definidas... não nego a perda de desempenho, mas temos um grande ganho em termo de implementação, manutenção e redução de código futuramente...

 

 

Aqui tá um exemplo de uma modelagem que fiz, gostaria que olhassem e criticasse..

 

Modelagem DER

Compartilhar este post


Link para o post
Compartilhar em outros sites

depende da modelagem mesmo... você deve fazer tabela de endereço separados se por exemplo não tiver limite de cadastro de endereço para o cliente....

 

e para controlar isso você pode usar transações que se inserir todas as condições que você queria nas tabelas especificadas ocorre um commit e salva tudo se não banco da rollback e não grava em nenhuma tabela

 

sua modelagem tem algumas coisas estranhas, veja caso usuario > email:

 

se o objetivo era separar é pq era para usuaário ter mais de um email... desse modo que está no diagrama usando id_email na tabela usuário seria mesma coisa que colocar um atributo ali chamado email (pq desse modo usuário so pode ter 1 id_email. Você nao vai criar 2 linhas iguais com dados de usuário com id_email diferente correto?)

 

agora se objetivo é ter mais de um email o id_usuario vai na tabela email assim você tem como cadastrar mais de 1 email para mesma usuário

Compartilhar este post


Link para o post
Compartilhar em outros sites

A solução que cheguei ao meu problema, pra evitar um monte de if ao fazer os insert é o "Transaction" do mysql...

Onde eu tento fazer uma transação.. caso de problema em algum ponto ele desfaz tudo que foi feito anteriormente sem eu ter que fazer isso manualmente...

 

http://dev.mysql.com/doc/refman/5.0/en/commit.html

 

No meu caso como uso codeigniter a sintaxe ficou assim:

   function cadastrar(){

       $this->db->trans_begin();

       // Cadastro o email        
       $this->db->insert('email',  array('nme_email' => $this->usuario_model->get('nme_email')));
       $idemail = $this->db->insert_id();

       // Cadastro o nome da pessoa
       $this->db->insert('pessoa',  array('nme_pessoa' => $this->usuario_model->get('nme_pessoa')));
       $idpessoa = $this->db->insert_id();

       // Cadastro o usuario
       $this->db->insert('usuario',  array(
                                           'grupo_idgrupo'     => $this->usuario_model->get('grupo_idgrupo'),
                                           'email_idemail'     => $idemail,
                                           'pessoa_idpessoa'   => $idpessoa,
                                           'usu_usuario'       => $this->usuario_model->get('usu_usuario'),
                                           'sen_senha'         => $this->usuario_model->get('sen_senha')
                                           )
                        );


       if($this->db->trans_status() === FALSE){

           $this->db->trans_rollback();
           return FALSE;

       }else{

           $this->db->trans_commit();
           return TRUE;

       }

   }

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.