BLOB o riferimenti in PostgreSQL


11

Devo archiviare file di dati binari in un database PostgreSQL che gira su un server Ubuntu. Inizialmente ci saranno alcune dozzine di file di circa 250kb ciascuna. Tuttavia, il numero di file aumenterà nel tempo. A volte potrei aver bisogno di estrarre i dati dai file per altre analisi a valle.

Ho fatto alcune ricerche sulla secolare questione della memorizzazione di dati binari come BLOB o riferimenti. Entrambi ovviamente hanno i loro pro e contro. Ci sono problemi specifici relativi a PostgreSQL di cui dovrei essere a conoscenza? È preferibile un metodo o l'altro se desidero estrarre i dati dai file, tramite una funzione PostgreSQL o un programma Python esterno?

Se dovessi archiviare i file di dati direttamente nel database, sarebbe meglio archiviarli in una tabella separata con una chiave esterna che fa riferimento alla tabella "principale", piuttosto che nella tabella contenente tutti gli altri campi?

Ho letto la domanda e le risposte qui ; un commento suggerisce che è meglio archiviare i file binari per riferimento (nel filesystem) su Linux. Le mie domande qui riguardano specificamente PostgreSQL e l'estrazione di dati dai file per varie analisi.

Aggiornamento: domanda simile .


Con PostgreSQl è possibile impostare una regola che elimina automaticamente il file nel filesystem quando il record contenente il riferimento viene eliminato.
jp

Sono sicuro che ci fosse più di una risposta a questa domanda. Cosa gli è successo? C'è un modo per vederlo se il poster lo ha eliminato? E i commenti al riguardo?
SabreWolfy,

Sì, l'ho eliminato, poiché è possibile evitare i problemi di prestazioni con bytea di cui ho scritto. I commenti possono essere riassunti da "Tutto bene con bytea, devi solo assicurarti di non sfuggire ai caratteri non stampabili nel database e quindi di sfuggirli di nuovo nella tua applicazione. Come ha commentato araqnid, dovresti invece usare escape esadecimale supportato da libpq. "
jp,

Risposte:


9

Penso che dovresti archiviare i dati nel database come una byteacolonna normale . In questo modo ottieni tutti i vantaggi di un database e puoi elaborare i dati usando le funzioni del database (e anche PL / Python, se lo desideri). Gli elementi di dati più grandi verranno automaticamente archiviati fuori linea, quindi non ci sarebbe motivo per introdurre un'altra indiretta di riferimento.

Le ragioni principali per l'archiviazione di oggetti binari di grandi dimensioni all'esterno del database sono se sono troppo grandi per essere in grado di archiviarli e recuperarli in un tempo soddisfacente, se gonfiano il database oltre la praticità o se è necessario accedere ai file come file da un'applicazione separata. Nulla di tutto ciò vale qui, per quanto ne so.


Grazie per i dettagli Il tuo punto di accesso ai file da un'applicazione separata mi ha portato a rendermi conto che in futuro potrei voler consentire agli utenti di scaricare il file binario da utilizzare localmente sul loro computer. Ciò potrebbe essere fatto se il file è archiviato nel database?
SabreWolfy,

Sicuro. Dovrai scrivere un po 'di codice per organizzarlo (recuperare i dati del file dal database, organizzare il download HTTP, diciamo), ma questo non è un blocco.
Peter Eisentraut,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.