it-swarm-eu.dev

Ist es besser, Bilder in einem BLOB oder nur in der URL zu speichern?

Mögliches Duplikat:
Dateien - in der Datenbank oder nicht?

Ich habe mich gefragt, ob es einen guten Grund gibt, weiterhin Blob-Felder in einer Datenbank zu verwenden. Vor ein paar Jahren habe ich mit einer Datenbank mit einer Reihe von Bildern gearbeitet. Die Datenbank war sehr langsam und ich konnte keinen guten Grund erkennen, die Bilder in der Datenbank zu belassen. Deshalb habe ich die Bilder herausgeholt und die Dateinamen gespeichert stattdessen.

War das ein kluger Schachzug? Was würdest du an meiner Stelle tun?

38
eiefai

Wie Sie den anderen Antworten entnehmen können, ist dies ein großes "Es hängt davon ab". Einige andere Faktoren können sein, wenn Sie für das Hosting bezahlen, dass sie mehr für die Speicherung von Dateien oder Datenbanken verlangen. Die Speicherung von Dateien ist in der Regel günstiger, insbesondere für Cloud-Dienste.

Wenn Sie selbst gehostet sind und SQL Server verwenden, wird die kommende Version mit dem Codenamen Denali FILESTREAM erweitern , um den Zugriff sowohl über TSQL als auch über das Dateisystem zu ermöglichen. Außerdem wird sichergestellt, dass diese synchron bleiben. Sie können von beiden Seiten zugreifen, aktualisieren, löschen und alles wird organisiert.

Machen Sie Ihre Recherchen und finden Sie heraus, was für Sie wichtig ist, und wählen Sie die Richtung basierend auf dieser Wahl.

Der Grund für die Verwendung von BLOBs ist ganz einfach die Verwaltbarkeit: Sie haben genau eine Methode zum Sichern und Wiederherstellen der Datenbank, Sie können problemlos inkrementelle Sicherungen durchführen, es besteht kein Risiko, dass das Image und die in DB-Tabellen gespeicherten Metadaten jemals nicht mehr synchron sind Sie haben auch eine Programmierschnittstelle zum Ausführen von Abfragen oder zum Laden/Speichern von Bildern, sodass Sie keinen Zugriff auf das Dateisystem von Remoteclients gewähren müssen und wissen, dass dieselben GRANTs für Bilder und die zugehörigen Daten gelten. Außerdem haben Sie eine Methode zur Speicherverwaltung (z. B. können Sie in Oracle alles auf ASM stellen und Oracle als LVM für alles verwenden).

Eine andere Anwendung besteht darin, relationale Daten mit serialisierten Objekten zu mischen (ein BLOB kann eine beliebige Binärdatei sein, es müssen keine Bilder sein). Oder Sie können eine Abfrage für Beziehungsdaten und Bytes x-y im BLOB ausführen, bei denen es sich beispielsweise um einen Dateikopf handeln kann. Die Anwendungen sind in der Tat endlos.

Wenn der Zugriff auf ein BLOB langsamer war als der Zugriff auf Ihr Dateisystem, ist es sehr wahrscheinlich, dass Ihre Datenbank falsch konfiguriert wurde.

17
Gaius

Ich verwende keine Blobs - hauptsächlich aus der Perspektive der Sicherung und Wiederherstellung, da ich nicht möchte, dass die Blob-Daten meine Sicherungen verlangsamen.

Ich speichere jedoch keine vollständige URL ... Ich speichere den Dateipfad nur unter einem bestimmten Punkt und erstelle den Pfad, da ich mehr als eine Möglichkeit habe, wie Personen und Programme auf meine Dateien zugreifen (FTP, HTTP, lokales Verzeichnis, NFS-gemountete Verzeichnisse).

... natürlich beschäftige ich mich wahrscheinlich mit mehr und größeren Bildern als die meisten Menschen ... einer meiner Datensätze enthält ungefähr 700 GB Bilder (komprimiert) pro Tag. Aber auch die Thumbnails für diese Bilder speichere ich noch extern.

13
Joe

Ich bin ein großer Fan davon, die "Referenz" -Kopie des Bildes in der Datenbank zu speichern - vom Standpunkt der Verwaltbarkeit/Notfallwiederherstellung aus ist dies wirklich der richtige Weg.

Jetzt können Sie für die meisten Anwendungen noch viele Dinge tun, um das Image aus dem Dateisystem heraus bereitzustellen, sodass Sie nicht so viel Druck auf den Datenbankserver selbst ausüben, um Dinge zu tun, die er nicht wirklich tun möchte.

8
Wyatt Barnett

Wenn Sie mit Linux arbeiten und die Bilder im Dateisystem und nicht in der Datenbank speichern, ist die Leistung erheblich besser (siehe dieser Auszug von Brad Edigers Buch Advanced Rails .

8
j.p.

Ich bin kein großer Fan von Bildern in der Datenbank. In einer kleinen App mit wenigen Benutzern scheint dies eine einfache Lösung zu sein, aber wenn Sie mit der Skalierung beginnen, wird dies schwieriger.

Ich bevorzuge es, Bilder in einem Ordner auf dem Webserver zu speichern, aber den Pfad in einer leicht zugänglichen Konfiguration zu halten, damit ich sie bei Bedarf schnell auf ihren eigenen dedizierten, optimierten Bildserver verschieben kann. Später möchte ich sie vielleicht auf die gleiche Weise an einen anderen Ort verschieben (denken Sie an S3 oder Akamai). All das ist viel komplizierter, wenn ich Code ändern muss, der erwartet hat, dass er sie aus der Datenbank liest.

5
phred

War das ein kluger Schachzug?

Ob es ein kluger Schachzug war oder nicht, hängt von Ihrem speziellen Fall ab:

Wenn sich der Speicherort der Datei direkt auf eine URL-Struktur auswirkt oder wenn Sie vollständige Dateiadressen in der Datenbank speichern (fehlerhaft), kann ich sagen, dass dies ein fehlerhafter Umzug war, da Sie Probleme haben werden, falls jemand ein Verzeichnis verschiebt oder umbenennt.

Aber wenn Ihre Anwendung so aufgebaut ist, dass Sie nur auf das Dateiverzeichnis verweisen müssen und die Dateizugriffslogik dynamisch ist, haben Sie aus folgenden Gründen einen klugen Schritt gemacht:

  • Wenn beim Speichern von Datenbanken pro Anforderung viele Bilder bereitgestellt werden müssen, erhöhen Sie die Antwortzeit Ihrer Anwendung, da die Dateien synchron an das Netzwerk gesendet werden. Außerdem werden Sie Ihrem Server etwas mehr Verarbeitung hinzufügen.

  • Das Speichern von Dateien ist normalerweise billiger als das Speichern von Datenbanken.

  • Beim Speichern von Dateien (es sei denn, der Bildzugriff unterliegt Einschränkungen: Nur ein bestimmter Benutzer kann auf eine bestimmte Gruppe von Bildern zugreifen) ist keine Verarbeitung erforderlich, um auf Bilder oder andere Arten von Dateien zuzugreifen.

  • Mit Datenbankspeicher ist es nicht möglich, über FTP auf Ihre Dateien zuzugreifen (ziemlich offensichtlich, aber es ist gut, sich daran zu erinnern).

  • Die Speicherung von Datenbankdateien verlangsamt und/oder überfüllt die regelmäßigen Sicherungen Ihrer Datenbank.

Was würdest du an meiner Stelle tun?

Ich würde diese Entscheidung behalten, wenn nicht ein gegenteiliger dominanter Faktor auftritt.

Ich hoffe, das hilft.

4
marcio