Armazenar um arquivo em um banco de dados em oposição ao sistema de arquivos?

83

Geralmente, quão ruim é o impacto no desempenho armazenar um arquivo em um banco de dados (especificamente mssql) em oposição ao sistema de arquivos? Não consigo pensar em um motivo fora da portabilidade do aplicativo que queira armazenar meus arquivos como varbinaries no SQL Server.

Cade
fonte

Respostas:

77

Dê uma olhada nesta resposta:

Armazenando imagens no banco de dados - sim ou não?

Essencialmente, o impacto no espaço e no desempenho pode ser bastante grande, dependendo do número de usuários. Além disso, lembre-se de que os servidores da Web são baratos e você pode facilmente adicionar mais para equilibrar a carga, enquanto o banco de dados é a parte mais cara e mais difícil de escalar de uma arquitetura da Web normalmente.

Existem alguns exemplos opostos (por exemplo, Microsoft Sharepoint), mas geralmente, armazenar arquivos no banco de dados não é uma boa ideia.

A menos que você crie aplicativos de desktop e / ou saiba aproximadamente quantos usuários você terá, mas em algo tão aleatório e inesperado como um site público, você pode pagar um preço alto por armazenar arquivos no banco de dados.

Michael Stum
fonte
36

Se você puder mudar para o SQL Server 2008, poderá aproveitar as vantagens do suporte FILESTREAM, que oferece o melhor de ambos - os arquivos são armazenados no sistema de arquivos, mas a integração do banco de dados é muito melhor do que apenas armazenar um caminho de arquivo em um campo varchar. Sua consulta pode retornar um fluxo de arquivo .NET padrão, o que torna a integração muito mais simples.

Primeiros passos com o armazenamento FILESTREAM

Jon Galloway
fonte
1
Estou tendo algumas reservas aqui. Especificamente, o lado da escalabilidade e disponibilidade das coisas: como você controla onde esses "blobs" são armazenados?
Dave Van den Eynde
3
A escalabilidade e a disponibilidade parecem ter sido muito bem pensadas - consulte este white paper: msdn.microsoft.com/en-us/library/cc949109.aspx
Jon Galloway
2
Uma advertência para isso é que você deve usar segurança integrada (ou seja, autenticação do Windows) ao se conectar ao banco de dados: blogs.msdn.com/b/psssql/archive/2008/04/10/…
Sven Grosen
22

Eu diria que depende da sua situação. Por exemplo, eu trabalho no governo local e temos muitas imagens como fotos, etc. Não temos um grande número de usuários, mas precisamos ter uma boa segurança e auditoria em torno dos dados. O banco de dados é uma solução melhor para nós, pois torna isso mais fácil e não vamos ter problemas de dimensionamento.

Lance Fisher
fonte
3

Em minha própria experiência, é sempre melhor armazenar arquivos como arquivos. O motivo é que o sistema de arquivos é otimizado para armazenamento de arquivos, enquanto um banco de dados não é. Claro, existem algumas exceções (por exemplo, o muito proclamado sistema de arquivos MS da próxima geração deve ser construído sobre o servidor SQL), mas em geral essa é a minha regra.

ZombieSheep
fonte
3

Embora o desempenho seja um problema, acho que os designs modernos de banco de dados o tornaram um problema muito menor para arquivos pequenos.

Deixando de lado o desempenho, isso também depende de quão fortemente acoplados os dados estão. Se o arquivo contiver dados intimamente relacionados aos campos do banco de dados, conceitualmente ele pertence a ele e pode ser armazenado em um blob. Se ele contiver informações que podem estar relacionadas a vários registros ou ter algum uso fora do contexto do banco de dados, ele pertence a fora. Por exemplo, uma imagem em uma página da web é obtida em uma solicitação separada da página que o vincula a ela, portanto, pode pertencer a fora (dependendo do design específico e das considerações de segurança).

Nosso compromisso, e não prometo que seja o melhor, foi armazenar arquivos XML pequenos no banco de dados, mas imagens e outros arquivos fora dele.

Marcus Downing
fonte
O que você considera um arquivo pequeno ou grande?
ubiquibacon
1

Eu concordo com @ZombieSheep. Só mais uma coisa - geralmente não acho que os bancos de dados realmente precisem ser portáteis porque você perde todos os recursos que seu fornecedor de DBMS oferece. Acho que migrar para outro banco de dados seria a última coisa que se consideraria. Só meus $ 0,02

martinsb
fonte
1

A sobrecarga de ter que analisar um blob (imagem) em uma matriz de bytes e, em seguida, gravá-la no disco com o nome de arquivo adequado e, em seguida, lê-la é uma sobrecarga suficiente para desencorajá-lo de fazer isso com muita frequência, especialmente se os arquivos forem bastante grande.

Jon Limjap
fonte
1
Não vejo nenhuma menção de que este "arquivo" precise ser gravado no disco e lido novamente.
Dave Van den Eynde
Esta é uma tarefa implícita quando as imagens precisam ser exibidas posteriormente, especialmente quando armazenadas em formatos diferentes ou em cenários onde não podem ser mantidas na memória por longos períodos de tempo, em virtude do tamanho.
Jon Limjap
0

Para não ser vago nem nada, mas acho que o tipo de 'arquivo' que você vai armazenar é um dos maiores fatores determinantes. Se você está falando essencialmente sobre um grande campo de texto que poderia ser armazenado como arquivo, minha preferência seria para armazenamento db.

N8g
fonte