Pular para o conteúdo principal

View em PostgreSQL

Estou fazendo um programa de almoxarifado e decidi me aventurar no Postgres. Por coincidência acabei estudando bancos de dados em geral. Aprendi uma maneira muito simples de aumentar a velocidade do programa e reaproveitar código.
Ao utilizar uma view, os dados já ficam pré-recarregados no servidor, então ao retirar os dados, você não está fazendo uma consulta completa no DB, pois ela já foi efetuada. Mão na massa...

Tenho as seguintes tabelas:


CREATE TABLE material (
  id SERIAL PRIMARY KEY,  -- auto_increment da ID
  nome varchar(200),      -- Nome
  modelo varchar(100),    -- Modelo
  tipo int,               -- Tipo (Pego em tabela tipo)
  marca int,              -- Marca (Pego em tabela marca)
);


CREATE TABLE tipo (
  id SERIAL PRIMARY KEY,  -- auto_increment da ID
  tipo varchar(100),      -- Tipo de produto
);

CREATE TABLE marca (
  id SERIAL PRIMARY KEY,  -- auto_increment da ID
  marca varchar(100),     -- Marca do produto
);

Vamos somente adicionar alguns valores para que tenhamos um pouco de consistência. Esse primeiro são as rows da tabela materiais

INSERT INTO materiais
  (nome,modelo,tipo,marca)
  VALUES ("Papel Higiênico","",1,1);
INSERT INTO materiais
  (nome,modelo,tipo,marca)
  VALUES ("Papel Toalha";"";1;1);
INSERT INTO materiais
  (nome,modelo,tipo,marca)
  VALUES ("Toner";"x56"; 2; 2);


Esses são da tabela marcas

INSERT INTO marca
  (marca) VALUES ("Carrefour");
INSERT INTO marca
  (marca) VALUES ("HP");

Esses do tipo

INSERT INTO tipo
  (tipo) VALUES ("Limpeza");
INSERT INTO tipo
  (tipo) VALUES ("Informática");
INSERT INTO tipo
  (tipo) VALUES ("Escritório");
INSERT INTO tipo
  (tipo) VALUES ("Cozinha");


Verifiquem que na tabela principal (material), temos dois campos que indicam ítens de outras tabelas (tipo,marca).
O que acontece na realidade é que ao adicionar um row na tabela material, eu colocarei a id de determinado tipo de produto e a id de determinada marca.

Até aí tudo tranquilo. O que parece ser um bicho de sete cabeças é juntar essas informações em uma única tabela. A algum tempo atrás eu usaria (MySQL/PHP) um mysql_fetch_array() dentro do while. Mas isso é algo que não é necessário, após descobrir como as views funcionam. Voltando...

SELECT material.id, material.nome,
       material.modelo,
       tipo.tipo, marca.marca
  FROM material
  JOIN tipo ON material.tipo = tipo.id
  JOIN marca ON material.marca = marca.id;

Explicando:
  • Dou um SELECT nas colunas que desejo que apareçam (lembrando que quando trabalhamos com mais de uma tabela, temos que indicar <tabela.campo>). O que eu desejo mostrar da tabela material é (id,nome,modelo), da tabela tipo (coluna tipo), marca (coluna marca).
  •  FROM material quer dizer que a tabela principal a se realizar a query é a "material".
  • Após, encontramos a grande mágica! JOIN, quer dizer juntar, ou seja, juntar a tabela seguinte à principal.
  • ON são os campos que se juntarão. No caso foi material.tipo = tipo.id, relembrando que os campos são referenciados como <tabela.campo>. Alguns podem se perguntar: "Por que não juntar material.tipo com tipo.tipo?", a resposta é que o valor de material.tipo é igual ao valor de tipo.id, mas o que será devolvido serão somente os campos que estão após o SELECT, ok?
 O resultado dessa query seria isso:

1; "Papel Higiênico"; "";     "Limpeza";     "Carrefour"
2; "Papel Toalha";    "";     "Limpeza";     "Carrefour"
3; "Toner";           "x56x"; "Informática"; "HP"


Perfeito, já sabemos como retirar os dados da tabela sem utilizar um mysql_fetch_array() dentro do while.
Agora vamos colocar esse resultado dentro de uma view:

CREATE VIEW material_view AS
  SELECT material.id, material.nome,
        material.modelo,
       tipo.tipo, marca.marca
   FROM material
   JOIN tipo ON material.tipo = tipo.id
   JOIN marca ON material.marca = marca.id;

Pronto, sua view foi criada. Para acessar seus valores, basta:

SELECT * FROM material_view

É por ser acessada dessa forma, que ela não pode ter nome igual ao nome da tabela.


Acredito que esse post possa ajudar alguém. Essa solução tão simples demorou determinado tempo para ser aprendida. Minha intenção é que em uma urgência, alguém possa utilizar dicas. Mas se você quer aprender mais afundo como utilizar o JOIN as VIEWS e suas variações, leia a documentação. Estou batalhando, porque o aprendizado por documentação é muito lento, mas estou aprendendo muito mais.

Abraço a todos.

Comentários

  1. Muito bem explicado, confesso que nao sabia muito bem como utilizar as views mas tenho uma duvida quando se cria a view ela tem um prazo de validade e após isso ela expira ou e algo que fica gravado do BD e se atualiza a cada alteração nas tabelas que as compoem?

    ResponderExcluir
  2. As views são atualizadas assim que as tabelas são alteradas.
    Não tenho informação sobre validade das views. Vou pesquisar sobre isso e criar um post se existir essa questão da validade.
    Espero seu post sobre as TRIGGER'S.
    Abraço.

    ResponderExcluir
  3. Burrisse minha, views não tem validade msm não são so configurações para definir formas diferentes de exibir dados.... quantos as TRIGGER's estou pela milesima vezes reorganizando meu dominio rneumann.me assim que achar um layout bom faço um post sobre ;)

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Recuperação de stash perdida

Bom pessoal, passei um sufoco bem grande esses dias, onde no frigir dos ovos, eu realizei modificações importantíssimas no meu código, fiz (stash), alterei algumas coisas e no fim, (stash clear). Por que? Falta de atenção, stress, loucura, demência, sei lá.
O fato é que percebi o acontecido somente no próximo dia útil (segunda-feira).
Daí, eu tive que por o cérebro para funcionar, lembrar o erro que havia cometido e escolher formas para chegar aos dois kilos de código alterados na sexta feira...

Uma vez que tudo no git possui um SHA-1 e os índices não são apagados automaticamente (git-gc), o que eu limpei do stash deveria estar em algum lugar do banco de dados do meu repositório GIT local.

Mãos a obra na pesquisa e encontramos um camadara muito útil na documentação do (fsck):
--no-reflog: Do not consider commits that are referenced only by an entry in a reflog to be reachable. This option is meant only to search for commits that used to be in a ref, but now aren’t, but are still in tha…

Problemas com o automount do VMWare Tools

Precisei compartilhar uma pasta de meu host linux com minha VM Fedora através do compartilhamento de pastas do vmware-tools e o problema que eu tive é que o vmware-tools simplesmente montava a pasta automaticamente no /mnt/hgfs. Pra mim isso foi um problema muito grande, porque eu não podia usar links simbólicos por particularidades do projeto mesmo.


Pra resolver o problema eu fui ao arquivo /etc/rc.d/init.d/vmware-tools e no trecho a seguir, que faz parte da funcao main(), eu comentei a linha como está a seguir:
vmware_exec 'Mounting HGFS shares:' vmware_mount_vmhgfsA partir disso ao iniciar o daemon, as unidades não serão montadas e você poderá fazer montagem através do fstab em diferentes locais.Faça suas modificações por sua conta em risco.