BLOBs oder Referenzen in PostgreSQL

11

Ich muss Binärdatendateien in einer PostgreSQL-Datenbank speichern, die auf einem Ubuntu-Server ausgeführt wird. Zunächst werden einige Dutzend Dateien mit einer Größe von jeweils ca. 250 KB vorhanden sein. Die Anzahl der Dateien nimmt jedoch mit der Zeit zu. Manchmal muss ich möglicherweise Daten aus den Dateien für andere nachgelagerte Analysen extrahieren.

Ich habe einige Nachforschungen über die uralte Frage der Speicherung von Binärdaten als BLOBs oder Referenzen angestellt. Beide haben offensichtlich ihre Vor- und Nachteile. Gibt es spezielle Probleme im Zusammenhang mit PostgreSQL, die ich beachten sollte? Ist die eine oder andere Methode vorzuziehen, wenn ich Daten aus den Dateien extrahieren möchte, entweder über eine PostgreSQL-Funktion oder über ein externes Python-Programm?

Wenn ich die Datendateien direkt in der Datenbank speichern würde, wäre es besser, sie in einer separaten Tabelle mit einem Fremdschlüssel zu speichern, der auf die "Haupt" -Tabelle verweist, als in der Tabelle, die alle anderen Felder enthält?

Ich habe die Frage und die Antworten hier gelesen . Ein Kommentar dort deutet darauf hin, dass das Speichern von Binärdateien als Referenz (im Dateisystem) unter Linux besser ist. Meine Fragen hier beziehen sich speziell auf PostgreSQL und auf das Extrahieren von Daten aus den Dateien für verschiedene Analysen.

Update: Ähnliche Frage .

SabreWolfy
quelle
Mit PostgreSQl ist es möglich, eine Regel einzurichten, die die Datei im Dateisystem automatisch löscht, wenn der Datensatz mit der Referenz gelöscht wird.
JP
Ich bin sicher, es gab mehr als eine Antwort auf diese Frage. Was ist damit passiert? Gibt es eine Möglichkeit, es zu sehen, wenn das Poster es gelöscht hat? Was ist mit den Kommentaren dazu?
SabreWolfy
Ja, ich habe es gelöscht, da die Leistungsprobleme mit bytea, über die ich geschrieben habe, vermieden werden können. Die Kommentare können wie folgt zusammengefasst werden: "Mit bytea ist alles in Ordnung. Sie sollten nur sicherstellen, dass Sie nicht druckbare Zeichen in der Datenbank nicht maskieren und sie dann in Ihrer Anwendung wieder entfernen. Wie araqnid kommentierte, sollten Sie stattdessen verwenden Hex-Escape, das von libpq unterstützt wird. "
JP

Antworten:

9

Ich denke, Sie sollten die Daten in der Datenbank als normale byteaSpalte speichern . Auf diese Weise erhalten Sie alle Vorteile einer Datenbank und können die Daten mithilfe von Datenbankfunktionen (und sogar PL / Python, wenn Sie dies wünschen) verarbeiten. Größere Datenelemente werden automatisch außerhalb der Zeile gespeichert, sodass Sie keinen Grund haben, eine weitere Referenz-Indirektion einzuführen.

Die Hauptgründe für das Speichern großer binärer Objekte außerhalb der Datenbank sind, wenn sie zu groß sind, um sie in einer zufriedenstellenden Zeit speichern und abrufen zu können, wenn sie die Datenbank über die Praktikabilität hinaus aufblähen oder wenn Sie als Dateien auf die Dateien zugreifen müssen eine separate Anwendung. Nichts davon trifft dort zu, soweit ich das beurteilen kann.

Peter Eisentraut
quelle
Danke für die Details. Ihr Punkt über den Zugriff auf die Dateien von einer separaten Anwendung aus hat mich zu der Erkenntnis geführt, dass ich Benutzern in Zukunft möglicherweise erlauben möchte, die Binärdatei herunterzuladen, um sie lokal auf ihrem Computer zu verwenden. Könnte das gemacht werden, wenn die Datei in der Datenbank gespeichert ist?
SabreWolfy
Sicher. Sie müssen ein kleines Stück Code schreiben, um dies zu arrangieren (z. B. Abrufen der Dateidaten aus der Datenbank, Arrangieren des HTTP-Downloads), aber das ist kein Blocker.
Peter Eisentraut