Qual é a melhor maneira de salvar e recuperar arquivos binários com o Oracle 10g?

StackOverflow https://stackoverflow.com/questions/62876

  •  09-06-2019
  •  | 
  •  

Pergunta

Estou prestes a implementar um recurso em nosso aplicativo que permite ao usuário 'carregar' um documento PDF ou Microsoft PowerPoint, que o aplicativo disponibilizará para outros usuários em um visualizador (para que eles não consigam 'baixar' no sentido 'Salvar como..').

Eu já sei como salvar e recuperar informações binárias arbitrárias em colunas de banco de dados, mas como esse será um recurso comumente usado em nosso aplicativo, temo que essa solução levaria a tabelas de banco de dados enormemente grandes (como sabemos, um de nossos clientes desejará colocar vídeo em documentos do PowerPoint).

Eu sei que existe uma maneira de criar um objeto 'diretório' no Oracle, mas existe uma maneira de usar esse recurso para armazenar e recuperar arquivos binários salvos em outro lugar no servidor de banco de dados?

Ou estou sendo excessivamente paranóico com o tamanho do banco de dados?

(para completar, nosso aplicativo é .Net WinForms usando Drivers CoreLab / DevArt OraDirect.Net para Oracle 10g)

Foi útil?

Solução

Algumas opções:Você poderia colocar a coluna BLOB em seu próprio tablespace, com características próprias de armazenamento;você poderia armazenar os BLOBs em sua própria tabela, vinculada à outra tabela por uma coluna de ID.Em ambos os casos, como você sugeriu, você pode definir a coluna como BFILE, o que significa que o arquivo real é armazenado externamente do banco de dados em um diretório.O que pode ser uma preocupação é que os LOBs BFILE não participam de transações e não são recuperáveis ​​com o restante do banco de dados.

Tudo isso é discutido na referência SQL do Oracle 10gR2, capítulo 2, começando na página 23.

Outras dicas

Acho que depende do que você considera enormemente grande.

Realmente depende do caso de uso.Se os documentos são acessados ​​raramente, então colocá-los no banco de dados seria bom (com a vantagem de obter backups "gratuitos", por exemplo, com o banco de dados).

Se esses arquivos forem atingidos repetidamente, talvez seja melhor colocá-los diretamente no disco e apenas armazenar a localização ou até mesmo (se a largura de banda for realmente alta) procurar algo como MogileFS

Ninguém será capaz de lhe dar uma resposta sim ou não para isso.

Você poderia usar um tipo de coluna LOB normal e definir os parâmetros de armazenamento para esse campo para que fique em um espaço de tabela separado.Crie o espaço de tabela em algum lugar que possa lidar com grandes quantidades de dados jogados nele e você minimizará o impacto.

Para ficar seriamente paranóico com o uso do disco, você também pode compactar o espaço de tabela marcando-o como tal.Algo como:

Crie tablespace binary_data1 DataFile Some_san_location Storage de compactação padrão (...)

Na minha experiência, um campo VARCHAR2 simples contendo o nome do arquivo dos anexos é uma solução melhor e mais fácil.O tamanho do sistema de arquivos é muito mais fácil de gerenciar do que o tamanho do banco de dados.

Os dados precisam estar em algum lugar, seja interno ao banco de dados ou se você apenas armazena um link para um caminho de arquivo acessível (servidor), você ainda está mastigando espaço.

Acabei de usar campos LOB simples no passado e pareceu funcionar bem.Se você mantiver os dados dentro do banco de dados, pelo menos manterá os problemas de backup baixos - você pode ter muitos dados para fazer backup, mas quando restaurá-los, todos estarão lá.Dividir o binário significa que você pode quebrar o banco de dados ou perder dados se não tomar cuidado com o backup.

Um motivo para armazenar apenas o link ou um ID que pode ser usado para construir o link é que o armazenamento que você normalmente usa para bancos de dados Oracle é bastante caro.Se você tiver muitos arquivos grandes, geralmente é muito mais econômico colocá-los em um conjunto de discos mais barato.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top