Otimização de atualização de atributos em uma tabela!

4 respostas
Victor_Neves

Pessoal, estou com um problema que na verdade nem sei que nome dar a esse problema…
Imagine voce tendo de atualizar uma tabela cheia de atributos referente a um cliente, como voce faria isso sem que fosse muito custoso para o servidor e para o banco?
Vamos à situação:

Voce tem o cliente zezinho, dai no cadastro dele no seu sistema ele pode setar os atributos em como ele deseja receber um arquivo qualquer, então ele tem as opções: Receber por e-mail (1), Receber por SMS (2), Receber por fax(3), Receber por correspondência (4).

Daí inicialmente ele marca 1 e 3, então numa tabela chamada “atributoscliente” é gravado o id do registro, o id do atributo (no nosso exemplo é um 1 e 3) e o id do cliente; [color=red]MAS NOTEM[/color], é gravado um registro por atributo marcado!! ou seja, serão duas linhas registradas na tabela!

Então depois ele muda de ideia e decide desmarcar os atributos 1 e 3 e marcar 2 e 4… vejamos o trabalho que estou tendo…
Eu tenho que fazer count para saber se o registro com idatributo 1 está na tabela e um IF…ELSE para saber se o cliente marcou ou nao na JSP, se o registro com idatributo 1 estiver na tabela e o cliente tiver setado false para o atributo então realiza a exclusão; no caso do idatributo 2 , eu faço um count na tabela pra saber se o atributo existe e se o cliente marcou como true na JSP, se nao existir o registro mas estiver setado na JSP, então realizo o insert…

O problema é que tenho um count para cada atributo, verificação se foi marcado ou não na JSP, e um insert ou delete, a questão é, como otimizar isso??? :?

Alguém já passou por algo parecido?!

4 Respostas

L

E ai velho, tranquilo?

Uai velho, ao invés de criar um registro para cada opçao que o cara marcar, na tabela “atributoscliente” vc cria um campo para cada um dessas 4 opções:

Receber por e-mail (1), Receber por SMS (2), Receber por fax(3), Receber por correspondência (4);

Daí vc pode colocar como um int(1), pra marcar apenas se a opção foi escolhida ou não.

Aí, na hora de salvar as alterações do cliente, vc vai acessar o banco apenas uma vez e setar tudo de uma vez, sem precisar fazer essa confusão toda que vc está fazendo.
Na hora de adicionar um novo registro é a mesma coisa: 1 único acesso para gravar tudo.

Acho essa a melhor forma. Criar 1 registro para cada opção é um erro de projeto seu.

Victor_Neves

foi isso que eu havia sugerido quando ainda na definição do sistema, mas ai o cara do banco de dados discordou ¬¬

L

Bom, cara, eu trabalho com situações assim todos os dias.
Já discuti diversas vezes com os DBA’s da empresa e todos acharam de boa fazer dessa forma como te disse.

Vc com um único acesso, conseguiria pegar todas as opções, e no caso de setar ou adicionar a mesma coisa.

Do jeito que vc está, só para montar essa parte, vc faz vários acessos e testes que, a meu ver, são desnecessários e estão pesando o sistema a toa.

Mas sem alterar a estrutura, vc poderia trazer do banco todas opções daquele cliente e montar via código.
Para fazer update/delete, a mesma coisa. Tentar fazer o processo em bloco.

No mais, cara, ainda acho que a melhor opção é mudar a estrutura do banco.

GusMcCart

Porque ao invés então de criar um campo para cada opção, você não cria um campo único e insere determinado valor nele,
por exemplo, 0 = NDA, 2 - E-mail, 4 - SMS, 8 - Fax, 16 - Correspondencia.
E soma esses valores ao resultado então se gravar 20 o usuario selecionou correspondencia e SMS. Etc…
Não sei se seria a melhor opção, mas você teria um único registro, um único campo, na hora de gravar você soma os valores, na hora de recuperar subtrai (do maior pro menor SE o total for maior que a opção), com isso e um DBA que prefere ter N registros e N acessos ao invés de 4 campos estáticos ocupando (1) int de informação acredito que resolve para você

Criado 9 de agosto de 2012
Ultima resposta 9 de ago. de 2012
Respostas 4
Participantes 3