Pergunta

Esta questão já tem uma resposta aqui:

No contexto de uma aplicação web, meu antigo chefe sempre dizia colocar uma referência a uma imagem no banco de dados, e não a própria imagem. I tendem a concordar que armazenar um url vs. a própria imagem no DB é uma boa idéia, mas onde eu trabalho agora, nós armazenar uma grande quantidade de imagens no banco de dados.

A única razão que eu posso pensar é talvez seja mais seguro? Você não quer alguém que tem um link direto para um url? Mas se for esse o caso, você pode ter sempre as imagens do punho web site / servidor, como manipuladores em asp.net para que um usuário precisa autenticar para visualizar a imagem. Eu também estou pensando desempenho seria ferido puxando as imagens do banco de dados. Quaisquer outras razões pelas quais ele pode ser um bom / não tão boa idéia para armazenar imagens em um banco de dados?


Duplicar exata: imagens de usuário: banco de dados ou sistema de arquivos de armazenamento ?
Exact Duplicate: Armazenar imagens no banco de dados: sim ou não ?
Exact Duplicate: Devo armazenar minhas imagens no banco de dados ou pastas?
Exact Duplicate: você armazenar dados binários no banco de dados ou pastas?
Exact Duplicate: fotos de loja como arquivos ou ou o banco de dados para um aplicativo web?
Exact Duplicate: Armazenar um número pequeno de imagens: blob ou fs
Exact Duplicate: no sistema de arquivos ou banco de dados?

Foi útil?

Solução

Se você na ocasião necessidade de recuperar uma imagem e tem que estar disponível em vários servidores web diferentes. Mas eu acho que isso é muito bonito isso.

  • Se ele não tem que estar disponível em vários servidores, é sempre melhor para colocá-los no sistema de arquivos.
  • Se ele tem que estar disponível em vários servidores e não há realmente algum tipo de carga no sistema, você vai precisar de algum tipo de armazenamento distribuído.

Estamos falando de um caso extremo aqui, onde você pode evitar a adição de um nível adicional de complexidade ao sistema, aproveitando o banco de dados.

Além disso, não fazê-lo.

Outras dicas

Pros de colocar imagens em um banco de dados.

  1. transações. Quando você salvar o blob, você pode cometê-lo como qualquer outro pedaço de dados DB. Isso significa que você pode cometer o blob juntamente com qualquer um dos meta-dados associados e ter certeza de que os dois estão em sincronia. Se você ficar sem espaço em disco? Sem cometer. Arquivo não carregar completamente? Sem cometer. erro de aplicação bobo? Sem cometer. Se manter as imagens e seus metadados associados consistentes entre si é importante para a sua aplicação, então as transações que a DB podem fornecer pode ser uma benção.

  2. Um sistema para gerenciar. Necessidade de fazer backup dos dados de meta e bolhas? Fazer backup do banco de dados. Necessidade de replicá-las? Replicar o banco de dados. Precisa para se recuperar de uma falha do sistema parcial? Recarregar o DB e rolar os logs para a frente. Todas as vantagens que BDs trazem aos dados em geral (mapeamento de volume, controle de armazenamento, backups, replicação, recuperação, etc.) aplicam a suas gotas. Mais consistência, gerenciamento mais fácil.

  3. Segurança. Bases de dados têm muito fina granulação recursos de segurança que podem ser aproveitados. Esquemas, funções de usuário, até mesmo coisas como "pontos de vista ler apenas" para dar acesso seguro a um subconjunto de dados. Todos esses recursos funcionam com mesas segurando blobs também.

  4. gerenciamento centralizado. Relacionado a # 2, mas, basicamente, os DBAs (como se eles não têm poder suficiente) começa a gerenciar uma coisa: o banco de dados. bancos de dados modernos (especialmente os maiores) funcionam muito bem com grandes instalações através de várias máquinas. fonte única de procedimentos de gestão simplifica, simplifica a transferência de conhecimento.

  5. A maioria dos bancos de dados modernos lidar com bolhas muito bem. Com suporte de primeira classe de bolhas em sua camada de dados, você pode facilmente transmitir blobs do DB para o cliente. Embora existam operações que você pode fazer que vai "sugar" todo o blob tudo de uma vez, se você não precisa desse recurso, então não usá-lo. Estudar a interface SQL para seu banco de dados e alavancar suas características. Não há razão para tratá-los como "grandes cordas" que são tratados monoliticamente e transformar suas gotas para grande, memória devorando, de cache quebrando bombas.

  6. Assim como você pode configurar servidores de arquivos dedicados para imagens, você pode configurar servidores blob dedicados em seu banco de dados. Dê-lhes volumes dedicados de disco, esquemas dedicados, caches dedicados, etc. Todos os seus dados no banco de dados não é o mesmo, ou se comporta da mesma, não há razão para configurá-lo da mesma forma. Boas bases de dados têm o nível multa de controle.

O nit preliminar sobre servindo-se uma bolha de um DB é garantir que sua camada HTTP realmente aproveita todo o protocolo HTTP para executar o serviço.

Muitas implementações ingênuas simplesmente pegar o blob, e despejá-los por atacado para baixo do soquete. Mas HTTP tem várias características importantes bem adequado para streaming de imagens, etc. Notavelmente cache cabeçalhos, ETags e transferência em partes para permitir que os clientes solicitem "pedaços" do blob.

Certifique-se de que o serviço HTTP está honrando adequadamente todos esses pedidos, e seu DB pode ser um muito bom Web cidadão. Armazenando em cache os arquivos em um sistema de arquivos para servir pelo servidor HTTP, você ganha algumas dessas vantagens "de graça" (uma vez que um servidor bom vai fazer isso de qualquer maneira para recursos "estáticos"), mas certifique-se se você fizer isso, que você coisas de honra, como datas de modificação etc. para imagens.

Por exemplo, alguém solicita spaceshuttle.jpg, uma imagem criada em 01 de janeiro de 2009., que acaba em cache no sistema de arquivos a partir da data do pedido, digamos, 01 de fevereiro de 2009. Mais tarde, a imagem é removida do cache (política FIFO, ou qualquer outro), e alguém, mais tarde, em 1 Mar 2009 pedidos de novo. Bem, agora ele tem um 01 de março de 2009 "data de criação", apesar de todo o tempo a sua criação data foi realmente Jan 1. Assim, você pode ver, especialmente se suas voltas de cache em torno de um monte, os clientes que podem estar usando Se- cabeçalhos modificados podem estar recebendo mais dados do que realmente precisa, uma vez que o server pensa que o recurso foi alterado, quando na verdade ele não tem.

Se você manter a data de criação de cache em sincronia com a data de criação real, isso pode ser um problema menor.

Mas o ponto é que é algo para se pensar sobre todo o problema, a fim ser um "bom cidadão web" e salvar você e seus clientes potencialmente alguma largura de banda etc.

Eu acabado de passar por tudo isso para um projeto Java que serve vídeos de um DB, e tudo funciona um tratamento.

Eu entendo que a maioria dos profissionais de banco de dados irá cruzar os dedos e assobiará por causa de você, se você armazenar imagens no banco de dados (ou mesmo mencioná-lo). Sim, há definitivamente implicações de desempenho e armazenamento ao usar o banco de dados como o repositório para grandes blocos de dados binários de qualquer tipo (imagens apenas tendem a ser os bits mais comuns de dados que não podem ser normalizado). No entanto, há certamente circunstâncias onde o armazenamento de banco de dados de imagens não só é permitido, mas aconselhável .

Por exemplo, no meu antigo emprego tivemos um aplicativo onde os usuários poderiam anexar imagens a vários pontos diferentes de um relatório que eles estavam escrevendo, e essas imagens tinham que ser impressos quando foi feito. Estes relatórios foram movidos sobre via replicação do SQL Server, e que teria introduzido uma dor de cabeça enorme para tentar gerir estas imagens e caminhos de arquivo em vários sistemas e servidores com qualquer tipo de confiabilidade. Armazená-los no banco de dados nos deu tudo isso "de graça", e a ferramenta de relatório não tem que sair para o sistema de arquivos para recuperar a imagem.

Meu conselho geral seria não limitar-se a uma ou outra abordagem - go com a técnica que se encaixa a situação. Os sistemas de arquivos são muito bons em armazenar arquivos e bancos de dados são muito bons no fornecimento de pequenas partes de dados a pedido. Por outro lado, um dos produtos da minha empresa tem um requisito para armazenar todo o estado do aplicativo no banco de dados, o que significa que arquivos anexos ir lá também. Com o nosso servidor DB (SQL Server 2005) que eu ainda tenho que correr em problemas de desempenho observáveis, mesmo com grandes clientes e bancos de dados.

SQL Server 2008 da Microsoft oferece o melhor dos dois mundos com o recurso de FileStream - pode valer a pena conferir. http://technet.microsoft.com/en-us/library/bb933993.aspx

Uma das vantagens de armazenar imagens no banco de dados é que é portátil através dos sistemas e independente sobre sistema de arquivos (s) layout.

O mais / solução mais simples / performance mais escalável é armazenar suas imagens no sistema de arquivos. Se a segurança é uma preocupação, colocá-los em um local que não é acessível pelo servidor web e escrever um script que a segurança alças e serve-se dos arquivos.

Assumindo seus / servidor de aplicações e servidor DB são máquinas web diferentes, você terá alguns hits, colocando imagens no DB: (1) a latência de rede entre as duas máquinas, (2) conexão DB sobrecarga, (3) a consumir uma conexão DB adicional para cada imagem servido. Eu estaria mais preocupado com o último ponto:. Se o seu site serve um monte de imagens, seus servidores web vão ser consumir muitas conexões DB e poderia esgotar seus pools de conexão

Se o seu aplicativo é executado em vários servidores, eu armazenar a cópia de referência de suas imagens no banco de dados e, em seguida, cache-los sob demanda sobre os sistemas de arquivos. Fazer isso é apenas uma maneira menos de uma dor propenso erro na bunda do que tentar sistemas de arquivos de sincronização lateralmente.

Se o seu aplicativo estiver em um único servidor, então sim, vara ao sistema de arquivos e ter o banco de dados manter um caminho para os dados.

A maioria bancos de dados SQL são, naturalmente, não projetado com servindo-se imagens em mente, mas há uma certa quantidade de conveniência associada a tê-los no banco de dados.

Por exemplo, se você já tem um banco de dados em execução e têm replicação configurados. Você instantaneamente tem uma loja imagem HA ao invés de tentar trabalhar alguma replicação sistema de arquivos rsync ou NFS base. Além disso, ter um monte de processos web (ou projetar um novo serviço) para arquivos de gravação para o disco aumenta a sua complexidade um pouco. Realmente é apenas mais peças móveis.

No mínimo, eu recomendo manter 'meta' dados sobre a imagem (como quaisquer permissões, quem é o dono, etc) e os dados reais separados em diferentes tabelas por isso vai ser bastante fácil de mudar para um diferente Data Store para baixo da linha. Que juntamente com algum tipo de CDN ou cache deve dar-lhe desempenho muito bom até certo ponto, então eu suponho que isso depende de como escalável este aplicativo precisa ser e como você equilibrar isso com a facilidade de implementação.

Você não tem que armazenar o URL (se achar que isto não é seguro). Você pode apenas armazenar uma identificação única que referências a imagem em outros lugares.

armazenamento de banco de dados tende a ser mais caro e dispendioso de manter do que um sistema de arquivos -., Portanto, eu não iria armazenar muitas imagens em um banco de dados

recuperação de desastres é absolutamente nenhum divertido quando você tem terabytes de dados de imagem armazenados no banco de dados. Você é melhor fora de encontrar uma melhor maneira de distribuir os seus dados para torná-lo mais confiável etc ... Claro que todos a sobrecarga (mencionados acima) é multiplicado ao replicar e assim por diante ...

Apenas não fazê-lo!

Isso realmente parece ser uma KISS (mantê-lo estúpido simples) problema. Os sistemas de arquivos são feitas para lidar facilmente com o armazenamento de arquivos de imagem, mas não é fácil de fazer em um banco de dados e fácil de estragar os dados. Por que tomar uma batida desempenho e toda a dificuldade no sql e renderização quando você pode apenas se preocupar com a segurança de arquivos? Você também pode lidar com sistemas mistos ewith NFS ou CIFS. Os sistemas de arquivos são tecnologias maduras. Muito mais simples, mais robusto.

I imagens armazenadas em um banco de dados para um aplicativo de demonstração. A razão pela qual eu fiz isso foi a segurança - a exclusão de um registro que eu não deveria ter não era um grande problema, mas a exclusão de um arquivo que não deveria ter poderia ter sido um problema

Se o desempenho se tornou um problema, eu teria investigado se a exclusão do arquivo desonestos era uma possibilidade real ou não.

Se são imagens que são puxados para fora do banco de dados em uma base regular, eu sempre tentar usar o sistema de arquivos.

Se fosse imagens que precisam puxado para fora de vez em quando, e salvá-las no banco de dados facilita a vida, eu não tenho problema com isso.

  • banco de dados para dados
  • sistema de arquivos para arquivos
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top