Armazenando arquivos no SQL Server

É uma questão antiga que eu conheço, mas com o SQL Server 2012 é finalmente ok para armazenar arquivos no database, ou eles devem ser mantidos no sistema de arquivos com apenas referências a eles no database?

Se armazená-los no database for considerado aceitável nos dias de hoje, qual é a maneira mais eficaz de fazer isso? Eu estou planejando aplicar criptografia, então eu aprecio o processamento não será muito rápido.

obrigado

Há um ótimo artigo da Microsoft Research chamado To Blob or Not To Blob .

Sua conclusão após um grande número de testes e análises de desempenho é esta:

  • Se as suas imagens ou documentos estiverem normalmente abaixo do tamanho de 256K, armazená-los em uma coluna VARBINARY do database é mais eficiente

  • Se suas imagens ou documentos tiverem tipicamente mais de 1 MB, armazená-los no sistema de arquivos será mais eficiente (e com o atributo FILESTREAM do SQL Server 2008, eles ainda estarão sob controle transacional e serão parte do database)

  • entre esses dois, é um pouco difícil dependendo do seu uso

Se você decidir colocar suas fotos em uma tabela do SQL Server, recomendo enfaticamente usar uma tabela separada para armazenar essas imagens – não armazene a foto do funcionário na tabela de funcionários – mantenha-as em uma tabela separada. Dessa forma, a tabela Employee pode permanecer enxuta, simples e muito eficiente, supondo que você nem sempre precise selecionar a foto do funcionário, como parte de suas consultas.

Para grupos de arquivos, confira Arquivos e Arquitetura de grupos de arquivos para uma introdução. Basicamente, você criaria seu database com um grupo de arquivos separado para grandes estruturas de dados desde o início ou adicionaria um grupo de arquivos adicional posteriormente. Vamos chamá-lo de “LARGE_DATA”.

Agora, sempre que você tiver uma nova tabela para criar que precisa armazenar colunas VARCHAR (MAX) ou VARBINARY (MAX), é possível especificar esse grupo de arquivos para os dados grandes:

CREATE TABLE dbo.YourTable (....... define the fields here ......) ON Data -- the basic "Data" filegroup for the regular data TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data 

Confira a introdução do MSDN nos grupos de arquivos e brinque com ela!

Ainda não há uma resposta simples. Depende do seu cenário. O MSDN tem documentação para ajudá-lo a decidir.

Existem outras opções cobertas aqui. Em vez de armazenar no sistema de arquivos diretamente ou em um BLOB, você pode usar o FileStream ou a Tabela de Arquivos no SQL Server 2012. As vantagens da Tabela de Arquivos parecem ser um não-brainier (mas eu não tenho nenhuma experiência em primeira mão com eles) .)

O artigo é definitivamente vale a pena ler.

Você pode ler em FILESTREAM . Aqui estão algumas informações dos documentos que devem ajudá-lo a decidir:

Se as seguintes condições forem verdadeiras, considere usar o FILESTREAM:

  • Objetos que estão sendo armazenados são, em média, maiores que 1 MB.
  • Acesso rápido de leitura é importante.
  • Você está desenvolvendo aplicativos que usam uma camada intermediária para a lógica do aplicativo.

Para objects menores, armazenar BLOBs varbinary (max) no database geralmente fornece melhor desempenho de streaming.