Sei sulla pagina 1di 2

Uso de imagens no PostgreSQL

Ol pessoal. Depois de algum tempo inativa, estou assumindo a coluna PostgreSQL iMasters, antigamente comandada por Juliano S. Incio, que por sinal representou muito bem a comunidade PostgreSql no tempo em que esteve a frente. Antes de iniciarmos o assunto que pretendo tratar hoje, quero explicar como ser a organizao dos meus artigos. O assunto principal, logicamente, ser o PostgreSql, mas ocorrero vezes em que trataremos junto alguns conceitos de banco de dados, que acredito que sejam essenciais para a melhor compreenso do que e como o PostgreSql trabalha. Tambm haver vezes em que irei montar algumas pequenas aplicaes baseadas em Java ou em PHP e que tenham como armazenamento de informaes o PostgreSql. O porque de usar Java e PHP o fato de possuir mais conhecimentos nestas linguagens do que em outras. Um assunto que sempre gera muita polmica o de armazenar imagens no banco de dados. Existem as pessoas que defendem que o melhor armazenar a imagem em diretrios do sistema operacional e registrar no banco de dados o local em que est armazenada a imagem. Tambm existem aqueles que defendem que o melhor mesmo armazenar a imagem dentro do banco de dados, sem necessidade do caminho da imagem. O ponto de viso que ser apresentada por mim, com certeza ter muitas crticas, pois h muitas particularidades em relao a isto. Para alguns mais conveniente a primeira opo e para outros a segunda opo tende a melhor adequar-se. As imagens vem sendo alvo de vrios estudos relacionados a sua captura dentro de um banco de dados. Por exemplo, encontrar num banco com 100.000 imagens aquelas que possuam um crculo vermelho, ou encontrar as que possuam alguma pessoa com o olho azul. Tambm vendo sendo muito estudado os possveis melhores algoritmos para se indexar imagens. Vantagens de se armazenar em banco as imagens: . Organizao: as imagens ficam armazenadas dentro do banco, no ficam espalhadas por diretrios. . Excluindo um registro voc exclui a imagem tambm, no precisando encontrar a imagem nos diretrios e exclu-la manualmente. Essa vantagem relativa, pois tambm se pode criar um trigger em C, pl/Python, pl/Perl ou outra linguagem que exclua a imagem ao deletar um registro. . O backup fica mais fcil de ser feito, no precisa ficar procurando nos diretrios as imagens para serem includas no backup. Muitos argumentam que imagens no banco tornam o backup gigantesco, mas de qualquer forma tero que ser feitas cpias das imagens. Dentro ou fora do banco, o backup ficar grande. . Rapidez: o desempenho melhor com imagens dentro do banco. . Segurana: armazenar imagens nos diretrios do sistema operacional pode trazer insegurana e inconsistncias, principalmente se vrias pessoas tenham acesso ao servidor. Com as imagens guardadas no banco mais fcil restringir a um determinado usurio o acesso s imagens. Vantagens de se armazenar em diretrios as imagens: . Em alguns casos que as imagens so poucas, mais fcil trabalhar com elas fora do banco. . O vacuum pode tornar-se um pouco mais rpido. . No so todas as linguagens que tem funes prontas para capturar e mostrar a imagem que est no banco de dados. Linguagens como PHP, por exemplo, voc tem que extrair a imagem, jogar numa pasta temporria e depois mostra-la.

Imagens no PostgreSql No PostgreSql existem dois tipos usados para se armazenar imagens: o oid e o bytea. O tipo oid cria um objeto, que a imagem nesse caso, e coloca na tabela um identificador para tal objeto. Comumente encontrado em sites pela internet o tipo lo (large object) para uso de imagens, mas na realidade o mesmo oid, apenas criado um domnio (tipo derivado) com o seguinte comando: create domain lo as oid; * Vamos criar uma tabela em que h um campo para o nome da figura e outro para a figura propriamente dita: CREATE TABLE imagem ( nome varchar(30) NOT NULL, figura lo, PRIMARY KEY (nome) ) Para inserir a imagem utilizamos a funo lo_import() para capturarmos a figura: INSERT INTO imagem (nome, figura) VALUES (figura1.jpg', lo_import(c:/figuras/figura.jpg')); Para extrair a figura, voc ter que criar uma cpia desta figura em alguma pasta temporria utilizando a funo lo_export(): SELECT lo_export(figura, c:/temp/figura1.jpg') FROM imagem WHERE nome = figura1.jpg'; O tipo bytea o tipo para armazenar cadeias binrias. A cadeia binria uma seqncia de octetos (ou bytes). As cadeias binrias se diferenciam das cadeias de caracteres por duas caractersticas: Em primeiro lugar as cadeias binrias permitem o armazenamento de octetos com o valor zero, alm de outros octetos "no imprimveis". Em segundo lugar, as operaes nas cadeias binrias processam os bytes armazenados, enquanto o processo de codificao das cadeias de caracteres depende das configuraes regionais. Dependendo do programa cliente do PostgreSQL utilizado, pode haver trabalho adicional a ser realizado em relao aos escapes das cadeias de caracteres bytea . Por exemplo, pode ser necessrio colocar escapes para os caracteres de nova-linha e retorno-de-carro se a interface realizar a traduo automtica destes caracteres. Do mesmo modo pode ser necessrio duplicar as contrabarras se o analisador utilizado tambm trata a contrabarra como caractere de escape. Para o tipo bytea no pode-se usar as funes lo_import() e lo_export().

Potrebbero piacerti anche