none
Armazenando imagens no SQL server RRS feed

  • Pergunta

  • Olá pessoal,

    Estou criando um banco de dados para uma livraria (para fins acadêmicos) e gostaria qual a melhor forma de armazenar uma imagem no banco de dados (na tabela de livros haverá um campo para armazenar a imagem da capa do livro) a fim de oferecer melhor performance de leitura e escrita. 

    Armazenando apenas o caminho do arquivo e deixando o arquivo no local indicado

    ou

    Armazenando o arquivo diretamente no banco de dados.

    Na verdade terei de armazenar duas imagens para cada livro sendo uma pequena que será exibida em uma espécie de grid view (ainda não sei qual ferramenta específica irei usar) e outra imagem grande que será exibir os detalhes do livro. Calculo que a imagem pequena terá cerca de 5 KB e a imagem grande cerca de 50 KB.

    Se alguém puder ajudar ai vlw.


    Rodrigo Rocha

    sábado, 18 de fevereiro de 2012 14:33

Respostas

  • Diogo,

        O tipo de dados image não deve mais ser utilizado no SQL Server. 

    Veja o link

    http://msdn.microsoft.com/en-us/library/ms187993.aspx para maiores informações.

    Você tem razão no momento que cita que pode correr o risco de apagarem a imagem do diretório. Eu ainda citaria no mínimo outros dois problemas associados à essa estratégia:

         1. Maior manutenção desses diretórios nas tabelas, no caso de mudar a localização dos arquivos.

         2. Falha de segurança. Imagine que as imagens fossem de um desenvolvimento importante da empresa, com algum segredo industrial. No diretório não haveria muito como proteger esses arquivos e talvez pessoas que não devessem ver essas imagens teriam acesso à elas.


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008


    segunda-feira, 20 de fevereiro de 2012 02:20
    Moderador
  • Boas,

    Apartida a melhor solução passa por gravar mesmo a imagem na base de dados.

    Podes gravar o tipo de dados comoimage. Assim estás a garantir que tens sempre a imagem guardada e não fica muito lento a sua leitura, dependendo da ligação à base de dados, se a aplicação for uma aplicação cliente/servidor etc.

    Pois se guardares o caminho podes correr o risco de apagarem a imagem e nunca mais a tens.

    • Marcado como Resposta Rodrigo HS Rocha segunda-feira, 20 de fevereiro de 2012 17:07
    sábado, 18 de fevereiro de 2012 16:43
  • Olá Rodrigo,

    Dependendo do volume e tamanho das imagens, sugiro utilizar o FILESTREAM caso esteja utilizando o SQL Server 2008.  Você pode pesquisar sobre BLOB e o FILESTREAM e ver qual lhe servirá mais.

    O FILESTREAM eu imagino ser interessante por oferecer maior desempenho pro seu banco.

    Abraços,

    Marcos Rosa


    Marcos Leandro Rosa

    • Marcado como Resposta Rodrigo HS Rocha segunda-feira, 20 de fevereiro de 2012 17:25
    sábado, 18 de fevereiro de 2012 17:23
  • Rodrigo,

       A melhor alternativa se estivermos falando de SQL Server 2008 (ou 2005) no seu caso que as imagens serão pequenas, gravar diretamente na base de dados. Para isso, utilize o tipo de dado VARBINARY(MAX). Não utilize o tipo de dado image pois ele será descontinuado em versões futuras do SQL Server. Ainda não há informação de qual versão ele será descontinuado, mas é recomendado para novos desenvolvimentos que seja utilizado o novo tipo de dados VARBINARY.

       Se as imagens forem maiores do que 2Mb, o recomendado é que você utilize a sugestão do Marcos, de gravar utilizando o FILESTREAM.

       Espero ter ajudado.


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008


    segunda-feira, 20 de fevereiro de 2012 02:15
    Moderador

Todas as Respostas

  • Boas,

    Apartida a melhor solução passa por gravar mesmo a imagem na base de dados.

    Podes gravar o tipo de dados comoimage. Assim estás a garantir que tens sempre a imagem guardada e não fica muito lento a sua leitura, dependendo da ligação à base de dados, se a aplicação for uma aplicação cliente/servidor etc.

    Pois se guardares o caminho podes correr o risco de apagarem a imagem e nunca mais a tens.

    • Marcado como Resposta Rodrigo HS Rocha segunda-feira, 20 de fevereiro de 2012 17:07
    sábado, 18 de fevereiro de 2012 16:43
  • Olá Rodrigo,

    Dependendo do volume e tamanho das imagens, sugiro utilizar o FILESTREAM caso esteja utilizando o SQL Server 2008.  Você pode pesquisar sobre BLOB e o FILESTREAM e ver qual lhe servirá mais.

    O FILESTREAM eu imagino ser interessante por oferecer maior desempenho pro seu banco.

    Abraços,

    Marcos Rosa


    Marcos Leandro Rosa

    • Marcado como Resposta Rodrigo HS Rocha segunda-feira, 20 de fevereiro de 2012 17:25
    sábado, 18 de fevereiro de 2012 17:23
  • Rodrigo,

       A melhor alternativa se estivermos falando de SQL Server 2008 (ou 2005) no seu caso que as imagens serão pequenas, gravar diretamente na base de dados. Para isso, utilize o tipo de dado VARBINARY(MAX). Não utilize o tipo de dado image pois ele será descontinuado em versões futuras do SQL Server. Ainda não há informação de qual versão ele será descontinuado, mas é recomendado para novos desenvolvimentos que seja utilizado o novo tipo de dados VARBINARY.

       Se as imagens forem maiores do que 2Mb, o recomendado é que você utilize a sugestão do Marcos, de gravar utilizando o FILESTREAM.

       Espero ter ajudado.


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008


    segunda-feira, 20 de fevereiro de 2012 02:15
    Moderador
  • Diogo,

        O tipo de dados image não deve mais ser utilizado no SQL Server. 

    Veja o link

    http://msdn.microsoft.com/en-us/library/ms187993.aspx para maiores informações.

    Você tem razão no momento que cita que pode correr o risco de apagarem a imagem do diretório. Eu ainda citaria no mínimo outros dois problemas associados à essa estratégia:

         1. Maior manutenção desses diretórios nas tabelas, no caso de mudar a localização dos arquivos.

         2. Falha de segurança. Imagine que as imagens fossem de um desenvolvimento importante da empresa, com algum segredo industrial. No diretório não haveria muito como proteger esses arquivos e talvez pessoas que não devessem ver essas imagens teriam acesso à elas.


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008


    segunda-feira, 20 de fevereiro de 2012 02:20
    Moderador
  • Hum, desconhecia que o image não irá ser utilizado em futuras versões, obrigada!

    Sim, concordo plenamento com os seus dois pontos, principalmente com o número 2.

    segunda-feira, 20 de fevereiro de 2012 11:57
  • Valeu Diogo.

    Obrigado pelas informações precisosas.


    Rodrigo Rocha

    segunda-feira, 20 de fevereiro de 2012 17:07
  • Valeu pela ajuda Roberto.

    Vou usar o VARBINARY(MAX).


    Rodrigo Rocha

    segunda-feira, 20 de fevereiro de 2012 17:25