Bilder in DB speichern - Ja oder Nein?

415

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

Was denkst du sind die Vor- / Nachteile?

James Hall
quelle
Nun, Sie können beides mit einem Transaktions-Festplatten-Cache tun .
Lilith River

Antworten:

350

Ich bin verantwortlich für einige Anwendungen, die viele TB Bilder verwalten. Wir haben festgestellt, dass das Speichern von Dateipfaden in der Datenbank am besten ist.

Es gibt einige Probleme:

  • Datenbankspeicher ist normalerweise teurer als Dateisystemspeicher
  • Sie können den Zugriff auf das Dateisystem mit Standardprodukten von der Stange beschleunigen
    • Beispielsweise verwenden viele Webserver den Systemaufruf sendfile () des Betriebssystems, um eine Datei asynchron direkt vom Dateisystem an die Netzwerkschnittstelle zu senden. In einer Datenbank gespeicherte Bilder profitieren von dieser Optimierung nicht.
  • Dinge wie Webserver usw. benötigen keine spezielle Codierung oder Verarbeitung, um auf Bilder im Dateisystem zuzugreifen
  • Datenbanken gewinnen, wenn die Transaktionsintegrität zwischen dem Bild und den Metadaten wichtig ist.
    • Die Verwaltung der Integrität zwischen Datenbank-Metadaten und Dateisystemdaten ist komplexer
    • Es ist schwierig (im Kontext einer Webanwendung) sicherzustellen, dass Daten auf die Festplatte des Dateisystems übertragen wurden
Mark Harrison
quelle
33
Welche Standardprodukte sind verfügbar, um das Dateisystem zu "beschleunigen"?
Andrei Rînea
22
Obwohl ich nur 3 TB Dateien verwalte, stimme ich definitiv zu. Datenbanken sind für strukturierte Daten, nicht für Blobs.
Derobert
7
@derobert: Wenn Sie also niemals ein Datenelement in einer Abfrage, als Bedingung oder für einen Join verwenden, gehört es wahrscheinlich nicht in die Datenbank.
Andererseits
14
Welche Standardprodukte sind verfügbar, um das Dateisystem zu "beschleunigen"?
Ablmf
5
Betreff: "Super-Accelerating" -Produkte: Die meisten Webserver können jetzt den Systemaufruf sendfile () nutzen, um statische Dateien asynchron an den Client zu liefern. Die Aufgabe, die Datei von der Festplatte auf die Netzwerkschnittstelle zu verschieben, wird auf das Betriebssystem übertragen. Das Betriebssystem kann dies viel effizienter tun und im Kernelraum arbeiten. Dies scheint mir ein großer Gewinn für das Dateisystem im Vergleich zu db für das Speichern / Bereitstellen von Bildern zu sein.
Alan Donnelly
140

Wie bei den meisten Problemen ist es nicht so einfach, wie es sich anhört. Es gibt Fälle, in denen es sinnvoll wäre, die Bilder in der Datenbank zu speichern.

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

Andererseits sind Probleme damit verbunden

  • Benötigen Sie zusätzlichen Code, um die Bilder zu extrahieren und zu streamen
  • Die Latenz kann langsamer sein als der direkte Dateizugriff
  • Stärkere Belastung des Datenbankservers
Rad
quelle
2
Das Fehlen einer separaten Sicherungsstrategie kann eine große Sache sein, wenn Sie Anwendungen schreiben, die vor Ort installiert werden (wie SharePoint). Wenn Sie ein SharePoint-Backup erstellen, befindet sich alles in der Datenbank, was es sehr einfach macht.
Eric Schoonover
44
Sicherheit durch Dunkelheit ist eigentlich keine Zugangskontrollstrategie!
Jon Cage
5
Ich glaube nicht, dass er Sicherheit durch Dunkelheit befürwortet - er sagt, dass das Einfügen von Bildern in die Datenbank eine weitere Sicherheitsebene hinzufügt. (Ich denke ... @Conrad, ich möchte dir keine Worte in den Mund nehmen)
AJ.
Ich habe mich für das Speichern von Bildern in der Datenbank entschieden, weil ich einen einzigen Sicherungsvorteil habe (oder allgemeiner gesagt, alle Daten an einem Ort haben), aber die von Ihnen erwähnten Probleme sind auch wahr, weshalb ich die Bilder im Dateisystem zwischenspeichere. Es ist das Beste aus beiden Welten, und ich bin überrascht, dass keine der Top-Antworten hier es erwähnt.
Bart van Heukelom
Verwenden Sie zufällig die ImageResizing.Net- Bibliothek, um Ihr SQL-> Disk-Image-Caching zu verwalten? Es ist der fortschrittlichste, skalierbarste und robusteste Festplatten-Cache, den Sie bekommen können ...
Lilith River
56

Dies mag etwas langwierig sein, aber wenn Sie SQL Server 2008 verwenden (oder planen), würde ich empfehlen, einen Blick auf den neuen FileStream- Datentyp zu werfen .

FileStream löst 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 entweder über eine Datenbankverbindung oder über das Dateisystem zugegriffen werden .
  3. Backups sind integriert.
  4. Migration "funktioniert einfach".

Die "Transparente Datenverschlüsselung" von SQL verschlüsselt jedoch keine FileStream-Objekte. Wenn dies in Betracht gezogen wird, ist es möglicherweise besser, sie nur als varbinary zu speichern.

Aus dem 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 hilft, die Auswirkungen von FILESTREAM-Daten auf die Leistung des Datenbankmoduls zu verringern. Der SQL Server-Pufferpool wird nicht verwendet. Daher steht dieser Speicher für die Abfrageverarbeitung zur Verfügung.

John Gietzen
quelle
+1 für FileStream. Es speichert die Blobs tatsächlich als Dateien auf der Festplatte, verwaltet sie jedoch transaktional.
John Gietzen
Außerdem ermöglicht SQL Server den Zugriff auf FileStream-Blobs direkt von der Festplatte, sodass Sie die DB-Verbindung nicht binden müssen
John Gietzen
Trotzdem wurde die Latenz zwischen der Datenbank und dem Webserver erhöht ... Und der Webserver muss sie in den Speicher laden, um sie auf den Client zu streamen, anstatt sie von der Festplatte streamen zu können, es sei denn, Sie verwenden Festplatten-Caching.
Lilith River
39

Dateipfade in der Datenbank sind definitiv der richtige Weg - ich habe Geschichte für Geschichte von Kunden mit TB an Bildern gehört, dass es ein Albtraum wurde, eine signifikante Anzahl von Bildern in einer Datenbank zu speichern - der Leistungseinbruch allein ist zu groß.

Greg Hurlman
quelle
35

Nach meiner Erfahrung besteht die einfachste Lösung manchmal darin, 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.

Patrick McElhaney
quelle
Wirklich sehr nett. Ihre Benutzer können jetzt einfach Ihren Dateinamen
erhöhen,
6
@Marijn: Das ist nur, wenn Sie die Bilder der Welt aussetzen.
Seun Osewa
Wir haben mit unseren abgebildeten Dokumenten etwas sehr Ähnliches gemacht (unser Primärschlüssel ist ein zusammengesetzter Schlüssel aus drei Elementen), aber wir haben Datum und Uhrzeit des Scannens des Dokuments hinzugefügt, damit wir mehrere Versionen im selben Verzeichnis haben können.
Andrew Neely
@Osewa, wie ist das? Ja, um direkt auf die Datei zugreifen zu können, muss der Endbenutzer auf den Ordner zugreifen. Sie könnten einen Prozess haben, um die Datei auf Anfrage per FTP bereitzustellen, und die Sicherheit wäre auf dem Niveau von SQL Server.
Andrew Neely
31

Der Trick dabei ist, kein Eiferer zu werden.

Hierbei ist zu beachten, dass niemand im Pro-Dateisystem-Camp ein bestimmtes Dateisystem aufgelistet hat. Bedeutet dies, dass alles von FAT16 bis ZFS jede Datenbank handlich übertrifft?

Nein.

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

Die richtige Vorgehensweise besteht darin, die richtige Entscheidung für Ihr genaues Szenario zu treffen. Dazu benötigen Sie einige Zahlen und einige Schätzungen für Anwendungsfälle.

Dicroce
quelle
6
Ich sehe niemanden, der behauptet, ein Dateisystem sei 100% schneller als eine DB (siehe Mark Harrisons Antwort). Das ist ein bisschen ein Strohmann. Es gibt wahrscheinlich Situationen, in denen es vorzuziehen ist, nicht angeschnallt zu sein, aber im Allgemeinen ist das Anschnallen eine gute Idee.
Calvin
30

An Orten, an denen Sie die referenzielle Integrität und ACID-Konformität gewährleisten MÜSSEN, ist das Speichern von Bildern in der Datenbank erforderlich.

Sie können nicht transaktional garantieren, dass das Bild und die Metadaten zu diesem in der Datenbank gespeicherten Bild auf dieselbe Datei verweisen. Mit anderen Worten, es kann nicht garantiert werden, dass die Datei im Dateisystem immer nur zur gleichen Zeit und in derselben Transaktion wie die Metadaten geändert wird.

mluebke
quelle
7
Nein, das kannst du. Solange Bilddateien nach dem Erstellen niemals gelöscht, geändert oder überschrieben werden, werden alle Bilddateien synchronisiert, bevor versucht wird, Transaktionen festzuschreiben. Es liegt keine Beschädigung des Dateisystems vor. Sie können sicher sein, dass Bilddateien und Metadaten synchron sind. Für einige Anwendungen sind das wohl zu viele Wenns.
Seun Osewa
Ich würde noch weiter gehen und sagen, dass mit einem Journaling-Dateisystem und einer zusätzlichen Programmlogik die ACID-Konformität erreicht werden kann. Die Schritte wären, den DB-Datensatz zu schreiben, die Datei zu schreiben. Wenn die Datei festgeschrieben wird, schreiben Sie die DB-Transaktion fest.
Andrew Neely
28

Wie bereits erwähnt, enthält SQL 2008 einen Dateistream-Typ, mit dem Sie einen Dateinamen oder eine Kennung als Zeiger in der Datenbank speichern und das Image 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 diese als Blob-Daten speichern, werden Sie bei der Suche nach Funktionen wirklich nichts aus der Datenbank herausholen. Daher ist es wahrscheinlich am besten um eine Adresse in einem Dateisystem zu speichern und das Bild auf diese Weise zu speichern.

Auf diese Weise sparen Sie auch Speicherplatz in Ihrem Dateisystem, da Sie nur die genaue Menge an Speicherplatz oder sogar komprimierten Speicherplatz im Dateisystem sparen.

Sie können sich auch dafür entscheiden, mit einigen Strukturen oder Elementen zu speichern, mit denen Sie die Rohbilder in Ihrem Dateisystem ohne DB-Treffer durchsuchen oder die Dateien in großen Mengen auf ein anderes System, eine Festplatte, S3 oder ein anderes Szenario übertragen können - indem Sie den Speicherort in aktualisieren Ihr Programm, aber behalten Sie die Struktur, auch ohne großen Erfolg, wenn Sie versuchen, die Bilder aus Ihrer Datenbank zu entfernen, wenn Sie versuchen, den Speicherplatz zu erhöhen.

Wahrscheinlich können Sie damit auch ein Caching-Element, das auf häufig getroffenen Bild-URLs basiert, in Ihre Web-Engine / Ihr Web-Programm einfügen, sodass Sie sich auch dort sparen.

Tiegel
quelle
27

Kleine statische Bilder (nicht mehr als ein paar Megabyte), die nicht häufig bearbeitet werden, sollten in der Datenbank gespeichert werden. Diese Methode bietet mehrere Vorteile, darunter eine einfachere Portabilität (Bilder werden mit der Datenbank übertragen), eine einfachere Sicherung / Wiederherstellung (Bilder werden mit der Datenbank gesichert) und eine bessere Skalierbarkeit (ein Dateisystemordner mit Tausenden kleiner Miniaturbilddateien klingt nach einem Albtraum der Skalierbarkeit mir).

Das Bereitstellen von Bildern aus einer Datenbank ist einfach. Implementieren Sie einfach einen http-Handler, der das vom DB-Server zurückgegebene Byte-Array als Binärdatenstrom bereitstellt.

Urini
quelle
Ich würde argumentieren, dass die Datenbank besser für Dateien ist, die häufig bearbeitet werden, da die Konsistenz in diesem Fall ein Problem sein kann.
Seun Osewa
26

Hier ist ein interessantes Whitepaper zum Thema.

Zu BLOB oder nicht zu BLOB: Großer Objektspeicher in einer Datenbank oder einem Dateisystem

Die Antwort lautet "Es kommt darauf an." Sicherlich würde es vom Datenbankserver und seiner Herangehensweise an die Blob-Speicherung abhängen. Dies hängt auch von der Art der Daten ab, die in Blobs gespeichert werden, sowie davon, wie auf diese Daten zugegriffen werden soll.

Kleinere Dateien können mithilfe der Datenbank als Speichermechanismus effizient gespeichert und bereitgestellt werden. Größere Dateien werden wahrscheinlich am besten mit dem Dateisystem gespeichert, insbesondere wenn sie häufig geändert / aktualisiert werden. (Die Blob-Fragmentierung wird zu einem Problem in Bezug auf die Leistung.)

Hier ist ein zusätzlicher Punkt, den Sie beachten sollten. Einer der Gründe für die Verwendung einer Datenbank zum Speichern der Blobs ist die ACID-Konformität. Der Ansatz, den die Tester im Whitepaper (Option "Massenprotokolliert von SQL Server") verwendeten, der den SQL Server-Durchsatz verdoppelte, änderte jedoch effektiv das "D" in ACID in ein "d", da die Blob-Daten nicht protokolliert wurden Die ersten Schreibvorgänge für die Transaktion. Wenn die vollständige ACID-Konformität eine wichtige Voraussetzung für Ihr System ist, halbieren Sie daher die SQL Server-Durchsatzzahlen für Datenbankschreibvorgänge, wenn Sie Datei-E / A mit Datenbank-Blob-E / A vergleichen.

Benutzer13550
quelle
25

Eine Sache, die ich noch nicht erwähnt habe, die aber definitiv erwähnenswert ist, ist, dass es Probleme gibt, große Mengen von Bildern in den meisten Dateisystemen zu speichern. Wenn Sie beispielsweise den oben genannten Ansatz wählen und jede Bilddatei nach dem Primärschlüssel benennen, treten bei den meisten Dateisystemen Probleme auf, wenn Sie versuchen, alle Bilder in einem großen Verzeichnis abzulegen, sobald Sie eine sehr große Anzahl von Bildern erreicht haben ( zB in den Hunderttausenden oder Millionen).

Eine übliche Lösung besteht darin, sie in einen ausgeglichenen Baum von Unterverzeichnissen zu zerlegen.

John
quelle
Sie würden so denken, aber die Probleme sind tatsächlich geringfügig; Ich habe eine App mit Millionen von Dateien in einem Verzeichnis, auf die Hunderte von Benutzern problemlos zugreifen können. Es ist nicht klug, aber es funktioniert. Das größte Problem ist, wenn Sie den Explorer zum Durchsuchen des Verzeichnisses verwenden, sehen Sie eine Taschenlampe für immer.
SqlACID
1
Es ist besser, ein Dateisystem zu verwenden, das kein Problem mit großen Verzeichnissen hat
Seun Osewa
8
Ich hatte eine App mit Millionen von Dateien in einem Verzeichnis (Server mit RHEL 4) - das Auflisten des Verzeichnisinhalts (Weiterleiten an eine Datei) dauerte Tage und erstellte eine Ausgabedatei mit einer Größe von 100 MB. Jetzt befinden sie sich in einer Datenbank. Ich habe eine einzelne Datei, die ich ganz einfach verschieben oder sichern kann.
Richard
1
@Seun Osewa: Jedes Dateisystem hat Einschränkungen ... und wenn Sie eines kennen, das keine Probleme beim Speichern von Millionen von Einträgen im selben Verzeichnis hat, lassen Sie es mich bitte wissen!
Guillaume
1
@Seun Osewa: Die Datenbank ist jetzt bis zu 28 GB groß und enthält 5,4 Millionen Datensätze. Am Ende musste ich die Datenbanktabelle partitionieren, damit ich mehrere Dateien mit einer Größe von ca. 5 GB sichern kann. Verschieben Sie die einzelnen Bilder jetzt auf Amazon S3, damit ich nur den Dateinamen in der Datenbank speichern muss (und Amazon kann die Sicherungen durchführen )
Richard
22

Niemand hat erwähnt, dass die DB atomare Aktionen, Transaktionsintegrität und Parallelität garantiert. Selbst die referenzielle Integrität ist bei einem Dateisystem nicht möglich. Woher wissen Sie also, dass Ihre Dateinamen wirklich noch korrekt sind?

Wenn Sie Ihre Bilder in einem Dateisystem haben und jemand die Datei liest, während Sie eine neue Version schreiben oder sogar die Datei löschen - was passiert?

Wir verwenden Blobs, weil sie auch einfacher zu verwalten sind (Backup, Replikation, Übertragung). Sie arbeiten gut für uns.

Draemon
quelle
Wie hoch ist die Wahrscheinlichkeit, dass ein bestimmtes Bild zwei Mal gleichzeitig aktualisiert wird?
Arafangion
1
Sie benötigen keine gleichzeitigen Updates, um Probleme zu haben - es kann ein Lesen und ein Schreiben sein. In unserem Fall ist dies fast garantiert.
Draemon
20

Das Problem beim Speichern nur von Dateipfaden zu Bildern in einer Datenbank besteht darin, dass die Integrität der Datenbank nicht mehr erzwungen werden kann.

Wenn das tatsächliche Bild, auf das der Dateipfad zeigt, nicht mehr verfügbar ist, weist die Datenbank unabsichtlich einen Integritätsfehler auf.

Angesichts der Tatsache, dass es sich bei den Bildern um die tatsächlich gesuchten Daten handelt und dass sie einfacher in einer integrierten Datenbank verwaltet werden können (die Bilder verschwinden nicht plötzlich), anstatt mit einer Art Dateisystem verbunden zu sein (wenn auf das Dateisystem unabhängig zugegriffen wird), Die Bilder könnten plötzlich "verschwinden". Ich würde sie direkt als BLOB oder so speichern.

Klugscheißer
quelle
17

In einer Firma, in der ich früher gearbeitet habe, haben wir 155 Millionen Bilder in einer Oracle 8i (damals 9i) Datenbank gespeichert. 7,5 TB wert.

graham.reeds
quelle
5
Absolut. Anscheinend ist die Datenbank jetzt viel größer. Wenn sich die Daten in einer Datenbank befinden, ist das Replizieren der Datenbank an verschiedenen Standorten ebenfalls viel einfacher.
graham.reeds
Ich habe eine Demonstration von Oracle gesehen, bei der tatsächlich ein Dateisystem in die Datenbank eingebunden werden könnte, oder so ähnlich. Wissen Sie, ob Sie das getan haben? (Entschuldigung, ich habe keine Ahnung von Oracle, also spreche ich vielleicht über Müll.)
Stu Thompson
Ich glaube nicht - es wurden Bilder in der Datenbank als Datenbank gespeichert. Die Datenbank wurde aggressiv optimiert - ich erinnere mich an mehrere Diskussionen bezüglich der Größe der Bilder, die sich beim Hinzufügen und Entfernen von Feldern geändert haben. Alles war grenzwertig ausgerichtet.
graham.reeds
14

Normalerweise bin ich hartnäckig dagegen, den teuersten und am schwierigsten zu skalierenden Teil Ihrer Infrastruktur (die Datenbank) zu übernehmen und die gesamte Last in sie zu stecken. Auf der anderen Seite: Dies vereinfacht die Sicherungsstrategie erheblich, insbesondere wenn Sie mehrere Webserver haben und die Daten irgendwie synchronisieren müssen.

Wie die meisten anderen Dinge hängt es von der erwarteten Größe und dem Budget ab.

Michael Stum
quelle
13

Wir haben ein Dokumentabbildungssystem implementiert, das alle Bilder in SQL2005-Blobfeldern speichert. Derzeit gibt es mehrere hundert GB, und wir sehen hervorragende Reaktionszeiten und geringe oder keine Leistungseinbußen. Darüber hinaus verfügen wir aus Gründen der Einhaltung gesetzlicher Vorschriften über eine Middleware-Schicht, die neu veröffentlichte Dokumente in einem optischen Jukebox-System archiviert, das sie als Standard-NTFS-Dateisystem verfügbar macht.

Wir waren sehr zufrieden mit den Ergebnissen, insbesondere in Bezug auf:

  1. Einfache Replikation und Sicherung
  2. Möglichkeit zur einfachen Implementierung eines Dokumentversionierungssystems
dan90266
quelle
11

Wenn es sich um eine webbasierte Anwendung handelt, kann das Speichern der Bilder in einem Speicherlieferungsnetzwerk eines Drittanbieters wie Amazon S3 oder der Nirvanix-Plattform Vorteile bringen.

David
quelle
11

Annahme: Die Anwendung ist webfähig / webbasiert

Ich bin überrascht, dass niemand dies wirklich erwähnt hat ... delegieren Sie es an andere Spezialisten -> verwenden Sie einen Drittanbieter für Bild- / Datei-Hosting .

Speichern Sie Ihre Dateien auf einem kostenpflichtigen Onlinedienst wie

Ein weiterer StackOverflow-Thread spricht hier darüber .

In diesem Thread wird erklärt, warum Sie einen Hosting-Anbieter eines Drittanbieters verwenden sollten.

Es ist es so wert. Sie speichern es effizient. Keine Bandbreite, die von Ihren Servern auf Clientanforderungen usw. hochgeladen wird.

Pure.Krome
quelle
10

Wenn Sie nicht mit SQL Server 2008 arbeiten und gute Gründe für das Einfügen bestimmter Bilddateien in die Datenbank haben, können Sie den Ansatz "beides" verwenden und das Dateisystem als temporären Cache verwenden und die Datenbank als Master-Repository verwenden .

Beispielsweise kann Ihre Geschäftslogik vor dem Bereitstellen überprüfen, ob eine Image-Datei auf der Disc vorhanden ist, und diese bei Bedarf aus der Datenbank abrufen. Dies bietet Ihnen die Möglichkeit mehrerer Webserver und weniger Synchronisierungsprobleme.

a7 zog
quelle
+1 Dies ermöglicht es Ihnen auch, das Originalbild zu speichern und die zwischengespeicherte / optimierte Version zu liefern, während die Größe / Komprimierung später geändert werden kann
Deebster
7

Ich bin mir nicht sicher, wie sehr dies ein Beispiel aus der "realen Welt" ist, aber ich habe derzeit eine Anwendung, die Details für ein Sammelkartenspiel speichert, einschließlich der Bilder für die Karten. Zugegeben, die Anzahl der Datensätze für die Datenbank beträgt derzeit nur 2851 Datensätze. Angesichts der Tatsache, dass bestimmte Karten mehrfach freigegeben wurden und alternative Grafiken haben, war es tatsächlich effizienter, das "primäre Quadrat" der Grafiken und dann dynamisch zu scannen Generieren Sie auf Anfrage den Rand und verschiedene Effekte für die Karte.

Der ursprüngliche Ersteller dieser Bildbibliothek hat eine Datenzugriffsklasse erstellt, die das Bild basierend auf der Anforderung rendert und dies zum Anzeigen und für einzelne Karten recht schnell erledigt.

Dies erleichtert auch die Bereitstellung / Aktualisierung, wenn neue Karten freigegeben werden. Anstatt einen ganzen Ordner mit Bildern zu komprimieren und diese über die Pipe zu senden und sicherzustellen, dass die richtige Ordnerstruktur erstellt wird, aktualisiere ich einfach die Datenbank und lasse den Benutzer sie erneut herunterladen. Diese Größe beträgt derzeit bis zu 56 MB, was nicht besonders gut ist, aber ich arbeite an einer inkrementellen Update-Funktion für zukünftige Versionen. Darüber hinaus gibt es eine "No Images" -Version der Anwendung, mit der Benutzer über Einwahl die Anwendung ohne Verzögerung des Downloads abrufen können.

Diese Lösung hat bisher hervorragend funktioniert, da die Anwendung selbst als einzelne Instanz auf dem Desktop ausgerichtet ist. Es gibt eine Website, auf der alle diese Daten für den Online-Zugriff archiviert werden, aber ich würde in keiner Weise dieselbe Lösung dafür verwenden. Ich bin damit einverstanden, dass der Dateizugriff vorzuziehen ist, da er sich besser an die Häufigkeit und das Volumen der Anfragen an die Bilder anpassen lässt.

Hoffentlich ist das nicht zu viel Geschwätz, aber ich habe das Thema gesehen und wollte einige meiner Erkenntnisse aus einer relativ erfolgreichen kleinen / mittleren Anwendung liefern.

Dillie-O
quelle
Beim Umgang mit der Replikation ist das Speichern der Bilder in der Datenbank IMO weit überlegen.
Beep Beep
7

SQL Server 2008 bietet eine Lösung, die das Beste aus beiden Welten bietet: den Datentyp filestream .

Verwalten Sie es wie eine normale Tabelle und nutzen Sie die Leistung des Dateisystems.

Andrei Rînea
quelle
7

Dies hängt von der Anzahl der zu speichernden Bilder und deren Größe ab. Ich habe in der Vergangenheit Datenbanken zum Speichern von Bildern verwendet und meine Erfahrungen waren ziemlich gut.

IMO, Vorteile der Verwendung der Datenbank zum Speichern von Bildern sind,

A. Sie benötigen keine FS-Struktur, um Ihre Bilder
zu speichern
. B. Datenbankindizes weisen eine bessere Leistung als FS-Bäume auf, wenn mehr Elemente gespeichert werden sollen. C. Intelligent abgestimmte Datenbanken leisten gute Arbeit beim Zwischenspeichern der Abfrageergebnisse.
D. Sicherungen sind einfach. Es funktioniert auch gut, wenn Sie die Replikation eingerichtet haben und Inhalte von einem Server in der Nähe des Benutzers bereitgestellt werden. In solchen Fällen ist keine explizite Synchronisation erforderlich.

Wenn Ihre Bilder klein werden (z. B. <64 KB) und die Speicher-Engine Ihrer Datenbank Inline-BLOBs (im Datensatz) unterstützt, wird die Leistung weiter verbessert, da keine Indirektion erforderlich ist (Referenzort wird erreicht).

Das Speichern von Bildern kann eine schlechte Idee sein, wenn Sie mit einer kleinen Anzahl großer Bilder arbeiten. Ein weiteres Problem beim Speichern von Bildern in der Datenbank besteht darin, dass Metadaten wie die Erstellung und Änderungsdaten von Ihrer Anwendung verarbeitet werden müssen.

nikhilbelsare
quelle
7

Ich habe kürzlich eine PHP / MySQL-App erstellt, die PDFs / Word-Dateien in einer MySQL-Tabelle speichert (bis zu 40 MB pro Datei).

Vorteile:

  • Hochgeladene Dateien werden zusammen mit allem anderen auf den Sicherungsserver repliziert. Es ist keine separate Sicherungsstrategie erforderlich (beruhigend).
  • Das Einrichten des Webservers ist etwas einfacher, da ich keinen Upload / Ordner benötigen und allen meinen Anwendungen mitteilen muss, wo er sich befindet.
  • Ich kann Transaktionen für Bearbeitungen verwenden, um die Datenintegrität zu verbessern - ich muss mich nicht um verwaiste und fehlende Dateien kümmern

Nachteile:

  • mysqldump dauert jetzt ziemlich lange, da sich in einer der Tabellen 500 MB Dateidaten befinden.
  • Insgesamt nicht sehr speicher- / CPU-effizient im Vergleich zum Dateisystem

Ich würde meine Implementierung als Erfolg bezeichnen, sie kümmert sich um die Backup-Anforderungen und vereinfacht das Layout des Projekts. Die Leistung ist gut für die 20-30 Personen, die die App verwenden.

zu viel php
quelle
6

Nach meiner Erfahrung musste ich beide Situationen bewältigen: in der Datenbank gespeicherte Bilder und Bilder im Dateisystem mit in db gespeichertem Pfad.

Die erste Lösung, Bilder in der Datenbank, ist etwas "sauberer", da Ihre Datenzugriffsschicht nur mit Datenbankobjekten arbeiten muss. Dies ist jedoch nur dann gut, wenn Sie mit niedrigen Zahlen umgehen müssen.

Offensichtlich verschlechtert sich die Datenbankzugriffsleistung, wenn Sie mit großen binären Objekten arbeiten, und die Datenbankdimensionen werden stark zunehmen, was wiederum zu Leistungseinbußen führt ... und normalerweise ist der Datenbankspeicher viel teurer als der Dateisystemspeicher.

Wenn Sie jedoch große Binärobjekte im Dateisystem speichern, erhalten Sie Sicherungspläne, die sowohl die Datenbank als auch das Dateisystem berücksichtigen müssen. Dies kann für einige Systeme ein Problem sein.

Ein weiterer Grund für das Dateisystem ist, wenn Sie Ihre Bilddaten (oder Sounds, Videos usw.) für den Zugriff durch Dritte freigeben müssen: In diesen Tagen entwickle ich eine Web-App, die Bilder verwendet, auf die von "außen" zugegriffen werden muss "Meine Webfarm so, dass ein Datenbankzugriff zum Abrufen von Binärdaten einfach unmöglich ist. Manchmal gibt es auch Designüberlegungen, die Sie zu einer Wahl führen.

Berücksichtigen Sie bei dieser Auswahl auch, ob Sie beim Zugriff auf Binärobjekte mit Berechtigungen und Authentifizierung umgehen müssen: Diese Anforderungen können normalerweise einfacher gelöst werden, wenn Daten in db gespeichert werden.

ila
quelle
4

Ich habe einmal an einer Bildverarbeitungsanwendung gearbeitet. Wir haben die hochgeladenen Bilder in einem Verzeichnis gespeichert, das ungefähr / images / [heutiges Datum] / [ID-Nummer] war. Wir haben aber auch die Metadaten (Exif-Daten) aus den Bildern extrahiert und diese zusammen mit einem Zeitstempel und dergleichen in der Datenbank gespeichert.

Thomas Owens
quelle
4

In einem früheren Projekt habe ich Bilder im Dateisystem gespeichert, und das verursachte viele Kopfschmerzen, da Backups, Replikationen und das Dateisystem nicht mehr mit der Datenbank synchronisiert waren.

In meinem neuesten Projekt speichere ich Bilder in der Datenbank und speichere sie im Dateisystem zwischen, und es funktioniert wirklich gut. Ich hatte bisher keine Probleme.

Christoffer Hammarström
quelle
3

Zweitens die Empfehlung zu Dateipfaden. Ich habe an einigen Projekten gearbeitet, die für die Verwaltung umfangreicher Asset-Sammlungen erforderlich waren, und alle Versuche, Dinge direkt in der Datenbank zu speichern, führten langfristig zu Schmerzen und Frustrationen.

Der einzige echte "Profi", den ich mir vorstellen kann, um sie in der DB zu speichern, ist das Potenzial für einfache Einzelbild-Assets. Wenn keine zu verwendenden Dateipfade vorhanden sind und alle Bilder direkt aus der Datenbank gestreamt werden, besteht keine Gefahr, dass ein Benutzer Dateien findet, auf die er keinen Zugriff haben sollte.

Dies scheint jedoch besser mit einem Zwischenskript gelöst zu werden, das Daten aus einem über das Internet nicht zugänglichen Dateispeicher abruft. Der DB-Speicher ist also nicht WIRKLICH notwendig.

Jeff
quelle
3

Das Wort auf der Straße ist, dass es keine sehr gute Idee ist, wenn Sie kein Datenbankanbieter sind, der zu beweisen versucht, dass Ihre Datenbank dies kann (sagen wir, Microsoft rühmt sich, dass Terraserver eine Milliarde Bilder in SQL Server speichert). Wenn die Alternative - Speichern von Bildern auf Dateiservern und Pfaden in der Datenbank - so viel einfacher ist, warum dann? Blob-Felder ähneln den Offroad-Fähigkeiten von SUVs - die meisten Leute nutzen sie nicht, diejenigen, die normalerweise in Schwierigkeiten geraten, und dann gibt es diejenigen, die dies tun, aber nur zum Spaß.

Deadprogrammer
quelle
3

Das Speichern eines Bildes in der Datenbank bedeutet weiterhin, dass die Bilddaten irgendwo im Dateisystem landen, aber verdeckt sind, sodass Sie nicht direkt darauf zugreifen können.

+ ves:

  • Datenbankintegrität
  • Es ist einfach zu verwalten, da Sie sich nicht darum kümmern müssen, das Dateisystem synchron zu halten, wenn ein Bild hinzugefügt oder gelöscht wird

-ves:

  • Leistungseinbußen - Eine Datenbanksuche ist normalerweise langsamer als eine Dateisystemsuche
  • Sie können das Bild nicht direkt bearbeiten (Zuschneiden, Größenänderung)

Beide Methoden sind üblich und werden praktiziert. Schauen Sie sich die Vor- und Nachteile an. In jedem Fall müssen Sie darüber nachdenken, wie Sie die Nachteile überwinden können. Das Speichern in einer Datenbank bedeutet normalerweise, die Datenbankparameter zu optimieren und eine Art Caching zu implementieren. Für die Verwendung des Dateisystems müssen Sie eine Möglichkeit finden, das Dateisystem + die Datenbank synchron zu halten.

Salman A.
quelle