BLOBs ou referências no PostgreSQL

11

Preciso armazenar arquivos de dados binários em um banco de dados PostgreSQL que roda em um servidor Ubuntu. Inicialmente, haverá algumas dezenas de arquivos com aproximadamente 250kb de tamanho cada. No entanto, o número de arquivos aumentará com o tempo. Às vezes, talvez eu precise extrair dados dos arquivos para outras análises posteriores.

Eu fiz algumas pesquisas sobre a antiga questão de armazenar dados binários como BLOBs ou referências. Ambos obviamente têm seus prós e contras. Existem problemas específicos relacionados ao PostgreSQL dos quais devo estar ciente? Um método ou outro é preferível se eu quiser extrair dados dos arquivos, por meio da função PostgreSQL ou de um programa externo do Python?

Se eu armazenasse os arquivos de dados diretamente no banco de dados, seria melhor armazená-los em uma tabela separada com uma chave estrangeira referenciando a tabela "principal", em vez de na tabela que contém todos os outros campos?

Eu li a pergunta e as respostas aqui ; um comentário sugere que armazenar arquivos binários por referência (no sistema de arquivos) no Linux é melhor. Minhas perguntas aqui se referem especificamente ao PostgreSQL e à extração de dados dos arquivos para várias análises.

Atualização: pergunta semelhante .

SabreWolfy
fonte
Com o PostgreSQl, é possível configurar uma regra que exclui automaticamente o arquivo no sistema de arquivos quando o registro que contém a referência é excluído.
jp
Tenho certeza de que havia mais de uma resposta para esta pergunta. O que aconteceu com isso? Existe uma maneira de ver se o cartaz a excluiu? E os comentários sobre isso?
SabreWolfy
Sim, excluí-o, pois os problemas de desempenho com o bytea sobre o qual escrevi podem ser evitados. Os comentários podem ser resumidos em "Está tudo bem com o bytea, você deve apenas garantir que não escapa caracteres não imprimíveis no banco de dados e desassociá-los novamente em seu aplicativo. Como o araqnid comentou, você deve usar escape hexadecimal que é suportado pela libpq. "
JP

Respostas:

9

Eu acho que você deve armazenar os dados no banco de dados como uma byteacoluna normal . Dessa forma, você obtém todas as vantagens de um banco de dados e pode processar os dados usando as funções do banco de dados (e até o PL / Python, se desejar). Itens de dados maiores serão automaticamente armazenados fora da linha, portanto não haveria motivo para você introduzir outro indireto de referência.

Os principais motivos para armazenar objetos binários grandes fora do banco de dados seriam se eles fossem muito grandes para poder armazená-los e recuperá-los em um tempo satisfatório, se inchar o banco de dados além da praticidade ou se você precisar acessar os arquivos como arquivos de um aplicativo separado. Nada disso se aplica lá, até onde eu sei.

Peter Eisentraut
fonte
Obrigado pelos detalhes. Seu argumento sobre o acesso aos arquivos de um aplicativo separado me levou a perceber que, no futuro, desejo permitir que os usuários baixem o arquivo binário para uso local em suas máquinas. Isso poderia ser feito se o arquivo estiver armazenado no banco de dados?
precisa saber é o seguinte
Certo. Você precisará escrever um pequeno pedaço de código para organizar isso (buscar os dados do arquivo no banco de dados, organizar o download HTTP, por exemplo), mas isso não é um bloqueador.
Peter Eisentraut