Armazenar imagens em DB-Sim ou não?

Estou a usar uma aplicação que armazena imagens no DB. Qual é a sua opinião sobre isto? Eu sou mais de um tipo para armazenar a localização no sistema de arquivos, do que armazená-lo diretamente no DB.

Quais são os prós e contras?

Author: James Hall, 2008-08-06

30 answers

Estou encarregue de algumas aplicações que gerem muitas imagens TB. Descobrimos que armazenar arquivos na base de dados é o melhor.

Há um par de questões:

  • O armazenamento de bases de dados é normalmente mais caro do que o armazenamento de sistemas de ficheiros
  • Pode acelerar o acesso ao sistema de ficheiros com os produtos padrão fora das prateleiras.
    • por exemplo, muitos servidores Web usam o ficheiro de sendfile ()
do sistema para enviar assíncronamente um ficheiro directamente do sistema de ficheiros para a interface de rede. Imagens armazenadas em um banco de dados não se beneficiam desta otimização.
  • coisas como servidores web, etc, não precisam de codificação ou processamento especial para aceder a imagens no sistema de ficheiros
  • as bases de dados ganham onde a integridade da transacção entre a imagem e os metadados são importantes.
    • é mais complexo gerir a integridade entre os metadados db e os dados do sistema de ficheiros
    • é difícil (no contexto de uma aplicação web) para garantir que os dados foram lançados em disco no sistema de ficheiros
  •  350
    Author: Mark Harrison, 2010-11-20 17:25:42
    Como na maioria das questões, não é tão simples como parece. Há casos em que faria sentido armazenar as imagens na base de dados.
    • está a armazenar imagens que são mudar dinamicamente, dizer facturas e você queria para obter uma fatura como era em 1 de Janeiro 2007?
    • O Governo quer que mantenhas 6 anos de história.
    • As imagens armazenadas na base de dados não requerem uma estratégia de backup diferente. Imagens armazenadas no sistema de ficheiros do
    • é mais fácil controle o acesso às imagens se elas estiverem em um banco de dados. Admins Idle podem acessar qualquer pasta no disco. É preciso um administrador muito determinado para ir bisbilhotar numa base de dados para extrair as imagens

    Por outro lado, Existem problemas associados

    • exigir um código adicional para extrair e transmitir as imagens
    • a latência pode ser mais lento que o acesso directo aos ficheiros
    • carga Mais Pesada no servidor de base de dados
     140
    Author: Rad, 2011-03-31 22:43:38
    Armazém de Ficheiros. Engenheiros do Facebook tiveram uma ótima conversa sobre isso. Um take away era saber o limite prático de arquivos em um diretório.

    Agulha num palheiro: armazenamento eficiente de milhares de milhões de fotos

     99
    Author: jason saldo, 2008-08-20 18:35:15

    Isto pode ser um pouco improvável, mas se estiver a usar (ou a planear usar) o servidor SQL 2008, recomendaria dar uma vista de olhos ao novo FileStream tipo de dados.

    O FileStream resolve a maioria dos problemas em torno do armazenamento dos ficheiros no DB:

    1. As bolhas são armazenadas como ficheiros numa pasta.
    2. as bolhas podem ser acedidas usando ou uma ligação à base de Dados ou sobre o sistema de ficheiros.
    3. As cópias de segurança são inserir.
    4. A migração"apenas funciona".

    No entanto, a "encriptação transparente de dados" do SQL não cifra os objectos do FileStream, por isso, se isso for uma consideração, talvez seja melhor guardá-los como varbinary.

    Do artigo MSDN:

    As declarações Transact-SQL podem inserir, actualizar, consultar, procurar e fazer backup dos dados do FILESTREAM. As interfaces do sistema de arquivos Win32 fornecem acesso em streaming aos dados.
    O FILESTREAM usa a 'cache' do sistema NT para o ficheiro de 'cache' dado. Isso ajuda a reduzir qualquer efeito que os dados do FILESTREAM podem ter no desempenho do motor de banco de dados. O buffer pool do servidor SQL não é usado; portanto, esta memória está disponível para processamento de consultas.

     56
    Author: John Gietzen, 2011-07-26 21:47:17

    Os caminhos de arquivo no DB é definitivamenteo caminho a seguir - eu ouvi história após história de clientes com TB de imagens que se tornou um pesadelo tentando armazenar qualquer quantidade significativa de imagens em um DB - o desempenho atingido por si só é demais.

     39
    Author: Greg Hurlman, 2008-08-06 18:17:52

    Na minha experiência, às vezes a solução mais simples é nomear as imagens de acordo com a chave primária. Então é fácil encontrar a imagem que pertence a um registro particular, e vice-versa. Mas ao mesmo tempo você não está armazenando nada sobre a imagem na base de dados.

     35
    Author: Patrick McElhaney, 2008-08-06 17:59:59
    O truque aqui é não se tornar um fanático.

    Uma coisa a notar aqui é que ninguém no campo do sistema de ficheiros pro listou um sistema de ficheiros em particular. Isto significa que tudo, desde o FAT16 ao ZFS, bate facilmente em todas as bases de dados?

    Não. A verdade é que muitas bases de dados batem em muitos sistemas de Ficheiros, mesmo quando estamos a falar apenas de velocidade bruta. O curso correcto de acção é tomar a decisão certa para o teu cenário EXACTO. preciso de alguns números e algumas estimativas de casos de uso.
     31
    Author: dicroce, 2008-08-31 17:54:01

    Em locais onde você deve garantir a integridade referencial e a ACID compliance, é necessário armazenar imagens na base de dados.

    Você não pode transactionaly garantir que a imagem e os meta-dados sobre essa imagem armazenados na base de dados se referem ao mesmo arquivo. Em outras palavras, é impossível garantir que o arquivo no sistema de arquivos só é alterado ao mesmo tempo e na mesma transação que os metadados.

     30
    Author: mluebke, 2009-09-03 00:48:15

    Como outros disseram SQL 2008 vem com um tipo de Filestream que lhe permite armazenar um nome de arquivo ou identificador como um ponteiro no db e armazena automaticamente a imagem no seu sistema de arquivos, que é um grande cenário.

    Se você está em uma base de dados mais antiga, então eu diria que se você está armazenando como dados blob, então você realmente não vai conseguir nada fora da base de dados no modo de pesquisar recursos, então é provavelmente melhor armazenar um endereço em um sistema de arquivos, e armazenar a imagem caminho.

    Dessa forma, você também economiza espaço no seu sistema de arquivos, como você só vai salvar a quantidade exata de espaço, ou mesmo compactado espaço no sistema de arquivos.

    Além disso, você pode optar por salvar com alguma estrutura ou de elementos que permitem que você navegue as imagens raw no seu sistema de ficheiros sem qualquer db hits, ou transferir os arquivos em massa para outro sistema, unidade de disco rígido, S3 ou outro cenário - atualização da localização em seu programa, mas manter a estrutura, novamente sem muito de um hit tentando trazer as imagens de seu db ao tentar aumentar o armazenamento.

    Provavelmente, também lhe permitiria lançar algum elemento de cache, com base em urls de imagem de sucesso comum no seu motor/programa web, por isso também está a poupar-se lá.

     28
    Author: crucible, 2008-08-30 09:50:23

    As pequenas imagens estáticas (não mais do que um par de megs) que não são frequentemente editadas, devem ser armazenadas na base de dados. Este método tem vários benefícios, incluindo portabilidade mais fácil (as imagens são transferidas com a base de dados), backup/restauração mais fácil (as imagens são suportadas com a base de dados) e melhor escalabilidade (uma pasta do sistema de arquivos com milhares de pequenos arquivos de miniaturas soa como um pesadelo de escalabilidade para mim).

    Servir imagens de uma base de dados é fácil, basta implementar um manipulador http que serve a matriz de bytes retornada do servidor DB como uma transmissão binária.
     27
    Author: urini, 2008-08-06 18:46:49
    Eis um interessante Livro Branco sobre o tema.

    Para BLOB ou não para BLOB: armazenamento de grandes objetos em uma base de dados ou um sistema de arquivos

    A resposta é " depende."Certamente dependeria do servidor de banco de dados e sua abordagem ao armazenamento blob. Ele também depende do tipo de dados sendo armazenados em blobs, bem como como como esses dados devem ser acessados.

    Arquivos de tamanho menor podem ser armazenados e entregues de forma eficiente usando a base de dados como o armazenamento mecanismo. Arquivos maiores provavelmente seriam melhor armazenados usando o sistema de arquivos, especialmente se eles serão modificados/atualizados frequentemente. (Blob fragmentation becomes an issue in regards to performance.)

    Eis um ponto adicional a ter em mente. Uma das razões que sustentam o uso de uma base de dados para armazenar as bolhas é a conformidade ácida. No entanto, a abordagem que os testadores usados no white paper, (opção Registrada em massa do SQL Server,) que dobrou o débito do servidor SQL, efetivamente mudou o' D 'em ácido para um' d', como os dados blob não foram registrados com as escritas iniciais para a transação. Portanto, se a conformidade ACID completa é um requisito importante para o seu sistema, reduza para metade os valores de rendimento do servidor SQL para a escrita de banco de dados ao comparar o ficheiro i/O com o banco de dados blob I/O.
     26
    Author: user13550, 2011-07-26 21:27:51

    Uma coisa que eu não vi ninguém mencionar ainda, mas é definitivamente vale a pena notar é que existem problemas associados com o armazenamento de grandes quantidades de imagens na maioria dos sistemas de arquivos também. Por exemplo, se você usar a abordagem mencionada acima e o nome de cada arquivo de imagem depois que a chave primária, na maioria dos sistemas de arquivos que você vai correr em problemas se você tentar colocar todas as imagens em um grande diretório, uma vez que você chegar a um número muito grande de imagens (e.g. em centenas de milhares ou milhao).

    Uma vez que a solução comum para isto é atacá-los em uma árvore balanceada de subdiretórios.

     25
    Author: John, 2008-08-20 18:25:12
    Algo que ninguém mencionou é que o DB garante ações atômicas, integridade transacional e lida com concorrência. Mesmo a integridade referencial está fora da janela com um sistema de arquivos - então como você sabe que seus nomes de arquivos ainda estão corretos?

    Se você tem suas imagens em um sistema de arquivos e alguém está lendo o arquivo como você está escrevendo uma nova versão ou mesmo apagando o arquivo - o que acontece?

    Usamos blobs porque eles são mais fáceis de gerir (backup, replicação, transferência) também. Eles trabalham bem para nós.

     22
    Author: Draemon, 2008-11-28 06:33:53

    O problema de armazenar apenas filepaths para imagens em uma base de dados é que a integridade da base de dados não pode mais ser forçada.

    Se a imagem real apontada pelo filepath ficar indisponível, a base de dados, sem querer, tem um erro de integridade.

    Dado que as imagens são os dados reais que estão sendo procurados, e que eles podem ser gerenciados mais facilmente (as imagens não vão desaparecer de repente) em um banco de dados integrado, em vez de ter que interface com algum tipo de Sistema de arquivos (se o sistema de arquivos é acessado de forma independente, as imagens podem subitamente "desaparecer"), eu iria para armazená-los diretamente como um BLOB ou tal.

     20
    Author: wiseguy, 2009-04-08 16:35:09
    Numa empresa onde trabalhava, armazenámos 155 milhões de imagens numa base de Dados Oracle 8i (então 9i). Vale 7,5 TB.
     17
    Author: graham.reeds, 2008-08-06 18:37:17
    Normalmente, sou contra tomar a parte mais cara e mais difícil de escalar da sua infra-estrutura (a base de dados) e colocar toda a carga nela. Por outro lado: simplifica muito a estratégia de backup, especialmente quando você tem vários servidores web e precisa de alguma forma manter os dados sincronizados. Como a maioria das outras coisas, depende do tamanho e do orçamento esperados.
     14
    Author: Michael Stum, 2008-08-06 17:42:21
    Implementámos um sistema de imagem de documentos que armazena todas as imagens nos campos blob SQL2005. Existem várias centenas de GB no momento e estamos vendo excelentes tempos de resposta e pouca ou nenhuma degradação de desempenho. Além disso, a conformidade regulamentar fr, temos uma camada de middleware que arquiva documentos recém-postados para um sistema de jukebox óptico que os expõe como um sistema de arquivos NTFS padrão. Temos estado muito satisfeitos com os resultados, particularmente com o respeito a:
      Facilidade de replicação e Backup
    1. Capacidade para implementar facilmente um sistema de versionamento de documentos
     13
    Author: dan90266, 2008-10-26 17:55:01

    Se isto é uma aplicação baseada na web, então pode haver vantagens em armazenar as imagens numa rede de distribuição de armazenamento de terceiros, como a Amazon's s S3 ou a plataforma Nirvanix.

     11
    Author: David, 2008-08-06 17:52:51

    Assunção: a aplicação está activa na web / baseada na web

    Surpreende-me que ninguém tenha mencionado isto ... delega-o a outros especialistas - > utilize um fornecedor de hospedagem de imagens/ficheiros de terceiros.

    Guardem os vossos ficheiros num serviço online pago como

    Outro tópico de StackOverflow falando sobre isso aqui .

    Este fio explica por que você deve usar um provedor de hospedagem de terceiros.

    Vale a pena. Armazenam-no de forma eficiente. Nenhum bandwith a ser carregado dos seus servidores para pedidos de clientes, etc.
     11
    Author: Pure.Krome, 2017-05-23 11:47:22

    Se não estiver no SQL Server 2008 e tiver algumas razões sólidas para colocar ficheiros de imagem específicos na base de dados, então poderá usar a abordagem "ambos" e usar o sistema de ficheiros como uma 'cache' temporária e usar a base de dados como repositório-mestre.

    Por exemplo, a sua lógica de negócio pode verificar se existe um ficheiro de imagem no disco antes de o servir, recuperando da base de dados quando necessário. Isso lhe compra a capacidade de vários servidores web e menos problemas de sincronização.

     10
    Author: a7drew, 2008-09-02 14:01:36

    Não tenho a certeza de quanto de um exemplo do "mundo real" isto é, mas tenho actualmente uma aplicação lá fora que guarda detalhes para um jogo de cartas de negociação, incluindo as imagens para as cartas. Dado que a contagem de registros para o banco de dados é de apenas 2851 registros até à data, mas dado o fato de que certas cartas foram lançadas várias vezes e têm obras de arte alternativas, foi realmente mais eficiente em termos de tamanho para digitalizar o "quadrado primário" da arte e, em seguida, dinamicamente gerar a fronteira e efeitos diversos para o cartão quando solicitado.

    O criador original desta biblioteca de imagens criou uma classe de acesso de dados que torna a imagem baseada no pedido, e fá-lo muito rapidamente para visualização e cartão individual.

    Isto também facilita a Implementação / Actualizações quando são lançados novos cartões, em vez de fechar uma pasta inteira de imagens e enviá-los para o cano e garantir que a estrutura de pastas adequada é criada, eu simplesmente actualizo a base de dados e tenho o utilizador faz o download outra vez. Isso atualmente tem um tamanho de até 56MB, o que não é ótimo, mas eu estou trabalhando em um recurso de atualização incremental para futuros lançamentos. Além disso, há uma versão "no images" da aplicação que permite que aqueles over dial-up para obter a aplicação sem o atraso de download.

    Esta solução tem funcionado muito bem até à data, uma vez que a aplicação em si é orientada como uma única instância no ambiente de trabalho. Há um site onde todos estes dados são arquivados para acesso on-line, mas eu não utilizaria, de modo algum, a mesma solução para este problema. Concordo que o acesso aos ficheiros seria preferível, porque melhoraria a frequência e o volume dos pedidos que estão a ser feitos para as imagens.

    Espero que isto não seja muito tagarelar, mas eu vi o tópico e queria fornecer alguns meus insights de uma aplicação de pequena e média escala relativamente bem sucedida.

     7
    Author: Dillie-O, 2008-08-20 18:42:14

    O SQL Server 2008 oferece uma solução que tem o melhor dos dois mundos: o tipo de dados filestream .

    Geri - lo como uma tabela regular e ter o desempenho do sistema de arquivos.

     7
    Author: Andrei Rînea, 2008-08-28 21:37:10

    Depende do número de imagens que vai armazenar e também dos seus tamanhos. Eu usei bancos de dados para armazenar imagens no passado e minha experiência tem sido bastante boa.

    [[1]}IMO, vantagens de usar a base de dados para armazenar imagens são, Não é preciso estrutura FS para manter as imagens. B. Os índices de Base de dados funcionam melhor do que as árvores FS quando se pretende armazenar mais itens
    C. base de dados sinteticamente sintonizada executar um bom trabalho em cache os resultados da consulta
    D. As cópias de segurança são simples. Ele também funciona bem se você tem a replicação configurada e o conteúdo é entregue a partir de um servidor perto do Usuário. Em tais casos, a sincronização explícita não é necessária.

    Se as suas imagens forem pequenas (digamos Armazenar imagens pode ser uma má ideia quando se está a lidar com um pequeno número de imagem. Outro problema com o armazenamento de imagens em db é que, metadados como a criação, datas de modificação deve ser tratado por sua aplicação.

     7
    Author: nikhilbelsare, 2008-09-05 10:54:06

    Criei recentemente uma aplicação PHP/MySQL que armazena ficheiros PDFs/Word numa tabela MySQL (do tamanho de 40MB por Ficheiro até agora).

    Prós:

    • os arquivos carregados são replicados para o servidor de backup, juntamente com tudo o resto, nenhuma estratégia de backup separada é necessária (paz de espírito).
    • configurar o servidor web é um pouco mais simples porque não preciso de ter um uploads/ pasta e dizer a todas as minhas aplicações onde está.
    • posso usar as transacções para as edições para melhorar a integridade dos dados-eu não tenho que me preocupar com arquivos órfãos e desaparecidos

    Cons:

      O mysqldump demora muito tempo porque há 500MB de dados de ficheiros numa das tabelas.
    • globalmente não é muito eficiente em termos de memória / cpu quando comparado com o sistema de ficheiros
    Eu diria que a minha implementação é um sucesso, trata dos Requisitos de backup e simplifica o layout do projeto. O desempenho é bom para as 20-30 pessoas que usam o aplicacao.
     7
    Author: too much php, 2008-12-08 04:31:54

    Pela minha experiência, tive de gerir ambas as situações: imagens armazenadas na base de dados e imagens no sistema de ficheiros com localização armazenada em db.

    A primeira solução, imagens na base de dados, é um pouco "mais limpa", uma vez que a sua camada de acesso aos Dados terá de lidar apenas com objectos da base de dados; mas isto só é bom quando se tem de lidar com números baixos.

    Obviamente, o desempenho de acesso à base de dados quando se lida com objectos binários grandes é degradante, e as dimensões da base de dados irão crescer muito., causando novamente perda de desempenho... e normalmente o espaço de banco de dados é muito mais caro do que o espaço de Sistema de arquivos.

    Por outro lado, ter grandes objectos binários armazenados no sistema de ficheiros fará com que tenha planos de salvaguarda que tenham de considerar tanto o sistema de bases de dados como o sistema de ficheiros, e isto pode ser um problema para alguns sistemas.

    Outra razão para ir para o sistema de arquivos é quando você tem que compartilhar seus dados de imagens (ou sons, vídeo, o que quer que) com o acesso de terceiros: neste momento eu estou desenvolvendo um aplicativo web que usa imagens que têm de ser acessadas de "fora" da minha fazenda web de tal forma que um acesso de banco de dados para recuperar dados binários é simplesmente impossível. Por isso, às vezes, há também considerações de design que irão levá-lo a uma escolha.

    Considere também, ao fazer esta escolha, se tiver de lidar com a permissão e autenticação ao aceder a objectos binários: estes requisitos normalmente podem ser resolvidos de uma forma mais fácil quando os dados são armazenados em db.

     6
    Author: ila, 2011-12-14 10:36:43
    Uma vez trabalhei numa aplicação de processamento de imagens. Nós armazenamos as imagens carregadas em um diretório que era algo como /images/[data de hoje]/[número de id]. Mas também extraímos os metadados (dados exif) das imagens e armazenamos isso no banco de dados, juntamente com uma data e tal.
     4
    Author: Thomas Owens, 2008-08-20 18:51:56

    Em um projeto anterior eu armazenei imagens no sistema de arquivos, e isso causou muitas dores de cabeça com backups, replicação, e o sistema de arquivos ficando fora de sincronia com o banco de dados.

    No meu último projecto, estou a armazenar imagens na base de dados, e a cache-las no sistema de ficheiros, e funciona muito bem. Não tive problemas até agora.

     4
    Author: Christoffer Hammarström, 2009-12-16 14:29:05

    Em segundo lugar, a recomendação sobre os caminhos dos ficheiros. Eu trabalhei em alguns projetos que precisavam gerenciar coleções de ativos de grande porte, e qualquer tentativa de armazenar coisas diretamente no DB resultou em dor e frustração a longo prazo.

    O único "pro" real que eu posso pensar sobre armazená-los no DB é o potencial para fácil de ativos de imagem individual. Se não houver caminhos de arquivos para usar, e todas as imagens são transmitidas diretamente para fora do DB, não há perigo de um usuário encontrar arquivos não deviam ter acesso.

    Isso parece ser melhor resolvido com um script intermediário puxando dados de uma loja de arquivos inacessível na web. Então o armazenamento do DB não é realmente necessário.
     3
    Author: Jeff, 2008-08-06 17:51:00

    A palavra na rua é que a menos que você seja um vendedor de banco de dados tentando provar que seu banco de dados pode fazê-lo (como, digamos que a Microsoft vangloriando-se sobre a Terraserver armazenando um bajillion de imagens no servidor SQL) não é uma boa idéia. Quando as imagens alternativas de armazenamento em servidores de arquivos e caminhos no banco de dados é muito mais fácil, por que incomodar? Blob fields são como as capacidades off-road de SUVs-a maioria das pessoas não usá-los, aqueles que geralmente se metem em problemas, e então há quem o faça, mas só por Diversão.

     3
    Author: deadprogrammer, 2008-08-06 21:19:16

    Armazenar uma imagem na base de dados ainda significa que os dados da imagem acabam em algum lugar no sistema de arquivos, mas obscurecidos de modo que você não pode acessá-la diretamente.

    +ses:

    • integridade da base de dados
    • é fácil de gerir, uma vez que não tem de se preocupar em manter o sistema de ficheiros sincronizado quando uma imagem é adicionada ou apagada

    - ves:

    • penalidade de desempenho -- uma pesquisa na base de dados é normalmente mais lenta que uma pesquisa no sistema de ficheiros
    • Não podes. editar a imagem directamente (recorte, dimensionamento)

    Ambos os métodos são comuns e praticados. Dê uma olhada nas vantagens e desvantagens. De qualquer forma, você terá que pensar em como superar as desvantagens. Armazenar na base de dados normalmente significa ajustar os parâmetros da base de dados e implementar algum tipo de cache. A utilização do sistema de ficheiros requer que encontre alguma forma de manter o sistema de ficheiros+base de dados em sincronia.

     3
    Author: Salman A, 2009-05-18 06:43:25