quinta-feira, 25 de novembro de 2010

Criando VIEWS pelo phpMyAdmin em MySQL

Explicando a situação

Não quero introdução, mande-me direto ao ponto

Confesso que trabalhei um bom tempo sem saber da existência do conceito de uma VIEW (ou visões). Descobri isso poucos meses atrás, meus olhos brilharam quando eu entendi do que elas são capazes.

Até então sempre que eu precisava retornar informações de várias tabelas eu precisa criar as junções dentro da query no script php, ou pior, quando eu não estava com vontade nenhuma de colocar meu cérebro para trabalhar, eu esquecia totalmente do conceito de junções de tabelas e criava uma query para buscar cada informação de que eu precisava, era algo mais ou menos assim:


//Vamos buscar todas as compras
$sql = mysql_query('SELECT clientes_id, produtos_id, data_compra FROM compras');

while($dados = mysql_fetch_array($sql)){

 //Aqui eu pego o nome do cliente
 $sql_clientes = mysql_query('SELECT nome_cliente FROM clientes WHERE clientes_id ='.$dados['clientes_id']);
 $dados_clientes = mysql_fetch_array($sql_clientes);
 $nome_cliente = $dados_clientes['nome_cliente'];

 //Aqui eu pego o nome do produto
 $sql_clientes = mysql_query('SELECT nome_produto FROM produtos WHERE produtos_id ='.$dados['produtos_id']);
 $dados_produtos = mysql_fetch_array($sql_produtos);
 $nome_produto = $dados_produtos['nome_produto'];

 //Mostrando os resultados
 echo("Cliente: $dados_clientes[nome_cliente] - Produto: $dados_produtos[nome_produto] - Data da compra: $dados[data_compra]
");

}

Inegável que ela é totalmente ineficiente, mais lenta do que uma query com JOINs, além de mais trabalhosa, mas quando você tem recursos como o CTRL+C e CTRL+V disponíveis e tem que entregar tudo "pra ontem" é simplesmente mais simples e menos arriscado fazer isso, do que fazer JOINs que podem embolar o cérebro.

Abaixo a alternativa eficiênte, utilizando JOINs:


$sql = mysql_query('
 SELECT
  clientes.nome_cliente,
  produtos.nome_produto,
  compras.data_compra
 FROM `compras`
 LEFT JOIN clientes ON compras.clientes_id = clientes.clientes_id
 LEFT JOIN produtos ON compras.produtos_id = produtos.produtos_id

');

while($dados = mysql_fetch_array($sql)){

 echo("Cliente: $dados[nome_cliente] - Produto: $dados[nome_produto] - Data da compra: $dados[data_compra]
");

}

Com VIEWs podemos simplificar a história ainda mais e reduzir nosso bloco de código para algo assim:


$sql = mysql_query('SELECT cliente, produto, data FROM v_compras');
while($dados = mysql_fetch_array($sql)){

 echo("Cliente: $dados[cliente] - Produto: $produtos[nome] - Data da compra: $dados[data]
");

}

Bem mais simples certo? Mais ou menos, pois para que isso seja possível, teremos que criar a VIEW no nosso banco de dados, digamos que ela vai fazer o trabalho sujo e facilitar nosso trabalho durante o desenvolvimento.
Em uma situação ideal, quem faria isso seria um DBA, o que tornaria ainda mais simples a vida do programador, mas como esta não é a realidade de muitos, inclusive da minha, teremos que criar a VIEW nós mesmos.

Utilizando o phpMyAdmin para criar nossas VIEWS

Antes de mais nada espero que você já esteja com seu phpMyAdmin aberto, se não tiver por gentileza abra-o.

  1. Clique em uma tabela qualquer;
  2. No canto inferior da página, procure por "Operações resultantes da consulta" ou "Query results operations" para quem utiliza o phpMyAdmin em inglês, clique onde diz CREATE VIEW;
  3. Você será apresentando a um formulário pedindo para inserir algumas informações para criar a VIEW, neste caso o que nós apenas teremos que informar será:
    • Nome da VIEW
    • Campos da VIEW
    • Query da VIEW
  4. Escolha um nome para ela, convencionalmente eu utilizo v_nome_da_tabela_original, para distingui-las melhor em relação as tabelas originais;
  5. Defina os nomes das colunas da view, utilize vírgulas para separá-las;
  6. Por último, crie a query que fará a seleção dos valores que queremos que a VIEW nos retorne.

Seguindo nosso exemplo, ficaria algo assim:

Nome: v_compras
Colunas: id,cliente,produto,data
Query:
 SELECT
  clientes.nome_cliente,
  produtos.nome_produto,
  compras.data_compra
 FROM `compras`
 LEFT JOIN clientes ON compras.clientes_id = clientes.clientes_id
 LEFT JOIN produtos ON compras.produtos_id = produtos.produtos_id

Como você pode notar, a query que a gente utilizou aqui, foi a mesma do nosso segundo exemplo.
Feito isso, é só confirmar e começar a usufruir de sua criação.

Utilizar este recurso de banco de dados pode trazer diversas vantagens bem como desvantagens, não vou entrar em muitos detalhes, mas vamos dar uma olhadinha rápida nessas questões:

Algumas vantagens das VIEWs

  • Restringir acesso aos dados de uma tabela a apenas alguns usuários;
  • Combinar dados de várias tabelas em uma única VIEW (conforme nosso exemplo)
  • Menos retrabalho
  • Melhorar a performance de acesso aos dados
  • Mais segurança

Desvantagens das VIEWs

  • VIEWs muito complexas podem acabar exigindo muito processamento, tornando-se lentas;
  • Para atualizar uma VIEW, na maioria dos casos é necessários efetuar um DROP, atualizar a query e recriar a VIEW.

Se você tiver mais interesse em aprender sobre este assunto, achei um link bem interessante e completo que pode agregar em muito seu conhecimento: TWiKi - Lição Visões.

É isso aí, até mais!

3 comentários:

  1. Em desvantagens da View, o que você quis dizer no segundo item? Atualizar uma View no sentido de Query (mudar a string da query) ou quando alguém atualizar as demais tabelas onde está ligada a View ela não se atualiza, tendo que eliminar a View colocando outra no lugar? Desculpe sou leigo no assunto. Obrigado.

    ResponderExcluir
  2. Seu post me ajudou muito! Muito Obrigado ^^

    ResponderExcluir