Speichern von Bildern in DB - ja oder nein?

  • Ich verwende also eine App, die Bilder stark in der Datenbank speichert. Wie sehen Sie dies aus? Ich bin eher ein Typ, um den Ort im Dateisystem zu speichern, als ihn direkt in der Datenbank zu speichern.

    Was glauben Sie, sind die Vor-und Nachteile?

    28 November 2008
    8 revs, 5 users 57%James Hall
56 answers
  • Ich bin für einige Anwendungen zuständig, die viele TB an Bildern verwalten. Das Speichern von Dateipfaden in der Datenbank hat sich als am besten herausgestellt.

    Es gibt einige Probleme:

    • Datenbankspeicherung ist normalerweise teurer als Dateisystemspeicher.
    • Sie können den Dateisystemzugriff mit Standardprodukten <| beschleunigen >
      • Beispielsweise verwenden viele Webserver den Systemaufruf sendfile () des Betriebssystems, um asynchron eine Datei direkt vom Dateisystem an die Netzwerkschnittstelle zu senden. In einer Datenbank gespeicherte Bilder profitieren nicht von dieser Optimierung.
    • Dinge wie Webserver usw. benötigen keine spezielle Codierung oder Verarbeitung, um auf Bilder zuzugreifen Im Dateisystem
    • gewinnen Datenbanken, wo die Transaktionsintegrität zwischen Image und Metadaten wichtig ist.
      • ist die Verwaltung der Integrität komplexer Zwischen db-Metadaten und Dateisystemdaten
      • ist es schwierig (im Kontext einer Webanwendung) zu gewährleisten, dass Daten im Dateisystem auf die Festplatte gespült werden
    20 November 2010
    6 revs, 4 users 64%Mark Harrison
  • Wie bei den meisten Problemen ist es nicht so einfach, wie es klingt. Es gibt Fälle, in denen es sinnvoll wäre, die Bilder in der Datenbank zu speichern.

    • Sie speichern Bilder, die sich dynamisch ändern, sagen Sie Rechnungen und Sie möchten, dass eine Rechnung so erhält, wie sie am 1. Januar 2007?
    • Die Regierung möchte, dass Sie 6 Jahre Geschichte pflegen.
    • In der Datenbank gespeicherte Bilder erfordern keine andere Sicherungsstrategie. Im Dateisystem gespeicherte Bilder do
    • Es ist einfacher, den Zugriff auf die Bilder zu steuern, wenn sie sich in einer Datenbank befinden. Leere Administratoren können auf jeden Ordner auf der Festplatte zugreifen. Es braucht einen wirklich entschlossenen Administrator, um in einer Datenbank zu suchen, um die Bilder zu extrahieren.

    Auf der anderen Seite gibt es Probleme im Zusammenhang mit

    • Zusätzlicher Code zum Extrahieren von und Streamen der Bilder
    • Die Latenz ist langsamer als der direkte Dateizugriff
    • Schwerere Belastung des Datenbankservers
    01 April 2011
    2 revs, 2 users 97%Rad
  • Dateispeicher. Facebook-Ingenieure hatten ein tolles Gespräch darüber. Ein Weg war, das praktische Limit von Dateien in einem Verzeichnis zu kennen.

    Nadel im Heuhaufen: Effiziente Speicherung von Milliarden von Fotos

    20 August 2008
    jason saldo
  • Dies ist vielleicht ein langer Weg, aber wenn Sie SQL Server 2008 verwenden (oder planen, dies zu tun), empfehle ich einen Blick auf die neue Datentyp FileStream .

    FileStream Behebt die meisten Probleme beim Speichern der Dateien in der Datenbank:

    1. Die Blobs werden tatsächlich als Dateien in einem Ordner gespeichert.
    2. Auf die Blobs kann über entweder eine Datenbankverbindung oder über das Dateisystem zugegriffen werden.
    3. Sicherungen sind integriert.
    4. Migration "funktioniert einfach".

    Allerdings verschlüsselt "Transparente Datenverschlüsselung" von SQL FileStream-Objekte nicht, wenn also ein Wenn Sie dies in Betracht ziehen, können Sie sie besser als varbinary speichern.

    Im MSDN-Artikel:

    Transact-SQL-Anweisungen können FILESTREAM-Daten einfügen, aktualisieren, abfragen, suchen und sichern. Win32-Dateisystemschnittstellen bieten Streaming-Zugriff auf die Daten. FILESTREAM verwendet den NT-Systemcache zum Zwischenspeichern von Dateidaten. Dies trägt dazu bei, die Auswirkungen, die FILESTREAM-Daten auf die Leistung von Database Engine haben können, zu reduzieren. Der SQL Server-Pufferpool wird nicht verwendet. Daher steht dieser Speicher für die Abfrageverarbeitung zur Verfügung.

    27 July 2011
    3 revs, 2 users 70%John Gietzen
  • Dateipfade in der Datenbank sind definitiv der Weg zu gehen - Ich habe von Kunden mit TB von Bildern Geschichte für Geschichte gehört, dass es ein Albtraum geworden ist, der versucht, eine beträchtliche Menge an Daten zu speichern Bilder in einer DB - allein die Leistung ist zu groß.

    06 August 2008
    2 revsGreg Hurlman
  • Meiner Erfahrung nach ist es manchmal die einfachste Lösung, die Bilder nach dem Primärschlüssel zu benennen. So ist es einfach, das Bild zu finden, das zu einem bestimmten Datensatz gehört, und umgekehrt. Gleichzeitig speichern Sie jedoch nichts über das Bild in der Datenbank.

    06 August 2008
    Patrick McElhaney
  • Der Trick hier ist, kein Eiferer zu werden.

    Hier ist zu beachten, dass niemand im Pro-Dateisystemlager ein bestimmtes Dateisystem aufgelistet hat. Bedeutet das, dass alles von FAT16 bis ZFS jede Datenbank einfach übertrifft?

    Nein.

    Die Wahrheit ist, dass viele Datenbanken viele Dateisysteme übertreffen, selbst wenn es nur um Geschwindigkeit geht.

    Das ist richtig Eine Vorgehensweise ist, die richtige Entscheidung für Ihr genaues Szenario zu treffen. Dazu benötigen Sie einige Zahlen und einige Anwendungsfallschätzungen.

    31 August 2008
    dicroce
  • An Orten, an denen Sie die referentielle Integrität und die ACID-Konformität garantieren MÜSSEN, ist es erforderlich, Bilder in der Datenbank zu speichern. Daten zu diesem Bild, die in der Datenbank gespeichert sind, beziehen sich auf dieselbe Datei. Mit anderen Worten, es kann nicht garantiert werden, dass die Datei im Dateisystem immer nur gleichzeitig und in derselben Transaktion wie die Metadaten geändert wird.

    03 September 2009
    2 revsmluebke
  • Wie bereits erwähnt, verfügt SQL 2008 über einen Filestream-Typ, mit dem Sie einen Dateinamen oder einen Bezeichner als Zeiger in der Datenbank speichern und das Abbild automatisch in Ihrem Dateisystem speichern können. Dies ist ein großartiges Szenario.

    Wenn Sie sich in einer älteren Datenbank befinden, würde ich sagen, wenn Sie sie als Blob-Daten speichern, werden Sie wirklich nichts aus der Datenbank in der Datenbank holen Es ist wahrscheinlich am besten, eine Adresse in einem Dateisystem zu speichern und das Bild auf diese Weise zu speichern.

    Auf diese Weise sparen Sie auch so viel Speicherplatz in Ihrem Dateisystem Dadurch wird nur der exakte Speicherplatz oder sogar der komprimierte Speicherplatz im Dateisystem eingespart.

    Sie können sich auch entscheiden, mit einigen Strukturen oder Elementen zu speichern, mit denen Sie das RAW durchsuchen können Bilder in Ihrem Dateisystem ohne Db-Treffer, oder übertragen Sie die Dateien in großen Mengen auf ein anderes System, eine Festplatte, S3 oder ein anderes Szenario - aktualisieren Sie den Speicherort in Ihrem Programm, behalten Sie jedoch die Struktur bei, ohne viel zu versuchen ng, um die Bilder aus Ihrer Datenbank zu holen, wenn Sie versuchen, den Speicherplatz zu erhöhen.

    Möglicherweise können Sie auch ein Zwischenspeicherelement auf der Grundlage häufig gebräuchlicher Bild-URLs in Ihr Web werfen Engine / Programm, so sparen Sie sich auch dort.

    30 August 2008
    crucible
  • Kleine statische Bilder (nicht mehr als ein paar Megabyte), die nicht häufig bearbeitet werden, sollten in der Datenbank gespeichert werden. Diese Methode hat mehrere Vorteile, darunter eine einfachere Portabilität (Bilder werden mit der Datenbank übertragen), ein einfacheres Backup / Wiederherstellen (Bilder werden mit der Datenbank gesichert) und eine bessere Skalierbarkeit (ein Dateisystemordner mit Tausenden von kleinen Miniaturbilddateien klingt wie ein Albtraum für Skalierbarkeit) me).

    Die Bereitstellung von Images aus einer Datenbank ist einfach. Sie müssen lediglich einen http-Handler implementieren, der das vom DB-Server zurückgegebene Byte-Array als binären Stream bereitstellt.

    06 August 2008
    urini