Armazenar imagens como arquivos ou no database para um aplicativo da web?

Minha pergunta é bastante genérica e sei que pode não haver uma resposta de 100%. Estou construindo uma solução Web ASP .NET que includeá muitas fotos e, esperamos, uma boa quantidade de tráfego. Eu realmente quero alcançar o desempenho.

Devo salvar as imagens no database ou no sistema de arquivos? E, independentemente da resposta, estou mais interessado em saber por que escolher um caminho específico.

Muito obrigado Stefan

DUPLICADO : Armazenando Imagens no DB – Sim ou Não? , Como armazenar imagens em seu sistema de arquivos , Armazenando um pequeno número de imagens: blob ou fs? e provavelmente alguns outros.


COMENTÁRIO: Obrigado por muitas boas respostas. Eu irei para uma solução baseada em arquivos mesmo que eu goste da idéia de ter uma solução 100% baseada em database. Parece que hoje existem boas soluções para fazer o que eu quero com bancos de dados, etc, mas tenho algumas razões para não fazê-lo.

  • Eu estarei em uma solução hospedada, eu tenho uma quantidade enorme de armazenamento (10GB), mas apenas 300MB para o database. Vai custar muito para armazenamento extra no database.

  • Eu não sou um especialista em database e também não no controle de configurações do database. Uma solução baseada em database pode precisar de configuração personalizada, como parece.

Se nos movermos para executar o site em nosso próprio servidor, talvez considere uma solução baseada em database. obrigado Stefan

Armazene as imagens no sistema de arquivos e nos locais das fotos no database.

Por quê? Porque…

  1. Você poderá veicular as imagens como arquivos estáticos.
  2. Nenhum access ao database ou código do aplicativo será necessário para buscar as imagens.
  3. As imagens podem ser exibidas em um servidor diferente para melhorar o desempenho.
  4. Isso reduzirá o gargalo do database.
  5. O database finalmente armazena seus dados no sistema de arquivos.
  6. As imagens podem ser facilmente armazenadas em cache quando armazenadas no sistema de arquivos.

Nos meus projetos recentemente desenvolvidos, armazenei imagens (e todos os tipos de documentos binários) como colunas de imagem em tabelas de database.

A vantagem de ter arquivos armazenados no database é obviamente que você não terá arquivos não referenciados no disco rígido se um registro for excluído, já que a synchronization entre o database (= metadados) e o disco rígido (= armazenamento de arquivos) não está integrada e tem que ser programado manualmente.

Usando a tecnologia de hoje, sugiro que você armazene imagens nas colunas FILESTREAM do SQL Server 2008 (pelo menos é o que farei com meu próximo projeto), pois elas combinam a vantagem de armazenar dados no database E ter binários grandes em arquivos separados menos de acordo com a publicidade;))

O provérbio sempre foi “Arquivos no sistema de arquivos, metadados de arquivos no database”

Melhor armazenar arquivos como arquivos. Bancos de dados diferentes lidam com dados de Blob de maneira diferente, portanto, se você tiver que migrar seu back-end, poderá ter problemas.

Ao servir os impages, um

Eu encontrei esta resposta de googling sua pergunta e ler os comentários em http://databases.aspfaq.com/database/should-i-store-images-in-the-database-ou-the-filesystem.html

Eu normalmente gosto de ter arquivos binários no database porque:

  • integridade de dados: nenhum arquivo não referenciado, nenhum caminho no database sem nenhum arquivo associado
  • consistência de dados: faça um despejo de database e isso é tudo. não “Oi esqueci de targz este diretório de dados.”

Armazenar imagens no database adiciona uma sobrecarga de database para servir imagens individuais e dificulta a transferência para armazenamento alternativo (S3, Akami) se você atingir esse nível. Armazená-los no database torna muito mais fácil mover seu aplicativo para um servidor diferente, já que é apenas o database que precisa ser movido agora.

O armazenamento de imagens no disco facilita o descarregamento para armazenamento alternativo, cria elementos estáticos de imagens para que você não precise mexer com headers HTTP em seu aplicativo da Web para tornar as imagens armazenáveis ​​em cache. A desvantagem é que, se você mover seu aplicativo para outro servidor, precisará se lembrar de mover as imagens também; algo que é facilmente esquecido.

Para aplicativos baseados na web, você obterá melhor desempenho ao usar o sistema de arquivos para armazenar suas imagens. Ao fazer isso, você poderá implementar facilmente o armazenamento em cache das imagens em vários níveis dentro de seu aplicativo. Há algumas vantagens em armazenar imagens em um database, mas na maioria das vezes essas vantagens vêm com aplicativos baseados no cliente.

Só para adicionar um pouco mais às já boas respostas até agora. Você ainda pode obter os benefícios do armazenamento em cache do nível da web, talvez, e do nível do database, se você seguir a rota mantendo as imagens no database.

Eu acho que para o database você pode conseguir isso pela forma como você armazena as imagens com relação aos dados textuais associados a elas e se você pode acessar as imagens em uma consulta específica para que o database possa armazenar a consulta em cache fique à vontade para me nuke nessa parte).

Com o lado da web, eu acho que desde que você está pergunta é marcado com asp.net que você iria a rota de usar um manipulador http para servir as imagens. Então você tem todos os benefícios da estrutura à sua disposição e pode manter sua lógica de domínio mais limpa, tendo apenas que passar a chave da sua imagem para o manipulador http.

Por que não escolher um database NoSql individual para armazenar seus arquivos.

Ele traz a integridade dos dados, consistência de dados como @chburd mencionado.

Enquanto você rdbms ainda continuam pequenos.

  1. Aqui está um exemplo passo a passo (abordagem geral, implementação Spring, Eclipse ) de armazenar imagens no sistema de arquivos e manter seus metadados no database – http://www.devmanuals.com/tutorials/java/spring/spring3/ mvc / Spring3MVCImageUpload.html
  2. Aqui está um exemplo também – http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. Além disso, você pode investigar uma base de código deste projeto – https://github.com/jdmr/fileUpload . Preste atenção a este controlador.