none
Imagens RRS feed

  • Pergunta

  •  

    Olá Pessoal,

    Acredito que na lista tenha algum colega que ja utiliza das mesmas necessidades que vou expor, então, caso seja possivel, gostaria que opinasse sobre o assunto.

    Cenário:
    Preciso armazenar imagens de um sistema médico. Estas imagens não são descartaveis, ou seja, elas terão que permancer intactas durante um período longo (quase que eterna), por vários motivos que me apresentaram.
    Outro detalhe, são geradas mais de 250 imagens por dia.

    Pergunto:
    1) Se eu criar uma tabela onde terão os campos Id e Imagem, e nesta tabela só ocorrer a inclusão e eventualmente uma deleção, o banco de dados irá ficar lento ? Isto irá prejudicar a performance do banco ? É seguro ?
    2) Agora se eu gravar em uma pasta, é seguro ? É uma boa prática ?


    obrigado,

    sexta-feira, 26 de setembro de 2008 19:15

Respostas

  • Olá Pedro,

     

    Esse assunto já foi extensamente debatido aqui no fórum. Acredito que se você realizar uma pesquisa pelo termo imagem no fórum de SQL Server irá achar muito informação sobre o assunto (certamente bem mais do que o que poderemos colocar na Thread).

     

    Em todo caso, adianto que se existe essa quantidade de imagens por dia e as imagens forem muito grandes considere utilizar um SGBD mais apropriado se possível (existem bancos especialistas em imagens).

     

    [ ]s,

     

    Gustavo

     

    sexta-feira, 26 de setembro de 2008 19:29

Todas as Respostas

  • Olá Pedro,

     

    Esse assunto já foi extensamente debatido aqui no fórum. Acredito que se você realizar uma pesquisa pelo termo imagem no fórum de SQL Server irá achar muito informação sobre o assunto (certamente bem mais do que o que poderemos colocar na Thread).

     

    Em todo caso, adianto que se existe essa quantidade de imagens por dia e as imagens forem muito grandes considere utilizar um SGBD mais apropriado se possível (existem bancos especialistas em imagens).

     

    [ ]s,

     

    Gustavo

     

    sexta-feira, 26 de setembro de 2008 19:29
  • Pedro,

     

    Existem varias vantagens de ter a imagem dentro do banco de dados, entre elas backup, consistencia transacional e recovery sao as mais importantes pra mim (alem de File Stream que eh novo no SQL Server 2008).

     

    Backups: imagens sao gravadas junto com backups do banco de dados. Nao eh necessario nenhum outro processo externo ou aplicacao pra fazer backup das imagens. Vc tira proveito das funcionalidades que existem com backup, por exemplo compresao e consistencia transacional. Se vc tiver os arquivos fora do banco de dados e precisar recuperar um backup, nao tem como vc sincronizar a restauracao dos arquivos e do backup exatamente no mesmo horario. Vai acabar com imagens no passado ou no futuro comparado com o banco de dados.

     

    Consistencia transacional: Se vc inserir uma imagem e decidir que alguma outra coisa nao estah certa, pode fazer rollback a hora que quiser sem se preocupar com apaguar o arquivo. O mesmo quando vc faz alteracoes. Imagine ter que gerenciar copia do arquivo antigo caso vc precise fazer rollback e voltar a imagem que vc acabou de modificar.

     

    Recovery: Imagine o caso em que vc cria a imagem e antes de comitar a transacao acaba a luz. Agora vc vai ficar com uma imagem orfa. Pra priorar, vc pode estar modificando uma imagem, que agora nao tem o novo registro mas tem a nova imagem. Se nao for suficiente, vc pode criar a imagem, inserir o arquivo, comitar a transacao, mas a imagem fica salva apenas no cache do disco e a luz apaga. Agora vc tem o registro mas nao tem a imagem. O SQL Server garante que os seus dados nao ficam salvo apenas no cache do disco por exemplo.

     

    SQL Server nao fica mais devagar com a quantidade de imagens que vc insere. Nao eh nada diferente do que adicionar varios registros com o mesmo tamanho da imagem. A diferenca eh que como a imagem eh relativamente grande, uma imagem eh equivalente a centenas de registros dependendo do tamanho.

     

    Outro ponto importante eh um nova funcionalidade nova no SQL Server 2008 que serve perfeito para o seu caso, chama File Stream. Eh como se vc  tivesse arquivos dentro do banco de dados, mas eles sao gravados em disco como arquivos normais. Como pode-se esperar de um registro, as imagens mantem transacoes, sao incluidas em backups, etc. Vc pode acessar os arquivos usando os metodos tradicionais (TSQL), ou usando arquivos como se eles existissem num diretorio qualquer com praticamente nenhum overhead de leitura e escrita. Mais informacoes em:

     

    http://msdn.microsoft.com/en-us/library/bb895234.aspx

     

    quinta-feira, 2 de outubro de 2008 06:38
  • Fabricio,

     

    Muito obrigado.
    Por não ter experiência com tratamento de imagens é que fiz este questionamento, mas a sua explicação me conveceu definitivamente a usar o Banco de Dados para armazenar imagens.

    Já estava testando a gravação das imagens em BD usando a linguagem C# para programação, então aproveitando a oportunidade, gostaria de saber o seguinte:

    A minha aplicação é para ser usada idependente do BD. Em virtude desta arquitetura, estou gravando um array de byte num campo do tipo VarBinary(Max) no SQLServer. Esta modalidade seria uma boa prática ?

     

    abs,

    quinta-feira, 2 de outubro de 2008 11:27
  • Fabricio,

     

    Gostaria de destacar como você mesmo já disse o File Stream, presente no SQL Server 2008, com certeza trata-se uma grande novidade para trabalhar com binários, ainda mais, que ele permiti utilizar os recursos do NTFS para fazer o armazenamento dos dados fisicamente e utilizar um ponteiro(ID) para informar ao SQL Server a origem do arquivo.

     

    Pedro,

     

    No dia 24/09 o Luciano Moreira fez um webcast no MSDN Brasil, especificamente sobre o File Stream, foi muito bom, recomendo o acesso e download do webcast.

    quinta-feira, 2 de outubro de 2008 12:42
  • Sim vc pode fazer isso se quiser tem algo que funciona em qualquer banco de dados. A desvantagem eh o que chamam de minimo divisor comum, vc tem que usar algo generico que existem em todos os banco de dados e acaba perdendo a oportunidade de usar funcionalidades especificas de cada um que pode faciltar imensamente a sua vida e melhorar a performance.

     

    No caso do SQL, File Stream eh muito mais rapido do que VarBinary. Existe um pequeno overhead quando vc abre e fecha o arquivo, mas a leitura eh tao rapido quanto ler um arquivo do disco, ou seja, nao tem como ser mais rapido que isso. Eu recomendaria vc criar uma abstracao para imagens na sua aplicacao de modo que vc possa usar File Stream no SQL Server e VarBinary em outros banco de dados. Assim a sua aplicacao nao fica presa ao SQL Server e ao mesmo tempo usa funcionalidades que nao existem em outros banco de dados.

    sexta-feira, 3 de outubro de 2008 20:06
  • Olá pessoal,

     

    Quero agradecer a todos que participaram deste post.

    Foram definições e comentários de grande valia e qualidade, pois acredito que este post servirá para outros colegas que estejam em dificuldade para definir qual o caminho a seguir quando o assunto for armazenamento de imagens.

    Obrigado a todos,

     

    Abs,

     

    segunda-feira, 6 de outubro de 2008 13:56