Bilder als Dateien oder in der Datenbank für eine Web-App speichern?

124

Meine Frage ist ziemlich allgemein gehalten und ich weiß, dass es möglicherweise keine 100% ige Antwort darauf gibt. Ich baue eine ASP .NET-Weblösung, die viele Bilder und hoffentlich ziemlich viel Verkehr enthält. Ich möchte wirklich Leistung erzielen.

Soll ich die Bilder in der Datenbank oder im Dateisystem speichern? Und unabhängig von der Antwort interessiert mich mehr, warum ich einen bestimmten Weg wähle.

Vielen Dank, Stefan

DUPLIKAT : Bilder in DB speichern - Ja oder Nein? , Speichern von Bildern in Ihrem Dateisystem , Speichern einer kleinen Anzahl von Bildern: Blob oder Fs? und wahrscheinlich einige andere.


KOMMENTAR: Danke für viele gute Antworten. Ich werde mich für eine dateibasierte Lösung entscheiden, auch wenn mir die Idee einer 100% datenbankgesteuerten Lösung gefällt. Es scheint, dass es heute gute Lösungen gibt, um mit Datenbanken usw. das zu tun, was ich will, aber ich habe ein paar Gründe, es nicht zu tun.

  • Ich werde auf einer gehosteten Lösung sein, ich habe eine riesige Menge an Speicher (10 GB), aber nur 300 MB für die Datenbank. Es kostet viel für zusätzlichen Speicher in der DB.

  • Ich bin kein DB-Experte und habe auch keine Kontrolle über die Einstellungen der DB. Eine DB-basierte Lösung muss möglicherweise benutzerdefiniert konfiguriert werden.

Wenn wir die Site auf unserem eigenen Server ausführen, könnte ich eine DB-basierte Lösung in Betracht ziehen. Danke, Stefan

StefanE
quelle
1
Bitte geben Sie die Datenbank an, die Sie verwenden.
Gerrie Schenck
1
Ich beabsichtige, MSSQL der späteren Version zu verwenden.
StefanE
1
@StefanE, Das Dateisystem ist in jeder Hinsicht eine spezialisierte Datenbank, die für die Dateispeicherung optimiert ist.
LukeH

Antworten:

175

Speichern Sie die Bilder im Dateisystem und die Bildspeicherorte in der Datenbank.

Warum? Weil...

  1. Sie können die Bilder als statische Dateien bereitstellen.
  2. Zum Abrufen der Bilder ist kein Datenbankzugriff oder Anwendungscode erforderlich.
  3. Die Bilder können von einem anderen Server bereitgestellt werden, um die Leistung zu verbessern.
  4. Dadurch wird der Datenbankengpass verringert.
  5. Die Datenbank speichert letztendlich ihre Daten im Dateisystem.
  6. Bilder können einfach zwischengespeichert werden, wenn sie im Dateisystem gespeichert sind.
Akbar ibrahim
quelle
1
Wenn Sie in SQL Server das Image als "Image" -Feld speichern, ist dies genau das, was SQL tut - indem Sie irgendwo einen Zeiger auf die Datei auf der Festplatte speichern. Auf diese Weise wird das Seitenlimit von 8 KB umgangen.
Zhaph - Ben Duguid
9
Dies wurde tatsächlich in SQL Server 2008 behoben. Es wurde ein neuer Typ FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx eingeführt, mit dem die Leistung des Dateisystems genutzt und gleichzeitig beibehalten werden kann Transaktionskonsistenz zwischen den unstrukturierten Daten und den entsprechenden strukturierten Daten "
kristof
Ja, du hast richtig geschrieben. Meine Frage ist, wie groß der Blob ist. oder wie viel Speicher kann es speichern?
Ameer
11

In meinen kürzlich entwickelten Projekten habe ich Bilder (und alle Arten von Binärdokumenten) als Bildspalten in Datenbanktabellen gespeichert.

Der Vorteil der Speicherung von Dateien in der Datenbank besteht offensichtlich darin, dass beim Löschen eines Datensatzes keine nicht referenzierten Dateien auf der Festplatte gespeichert werden, da die Synchronisierung zwischen Datenbank (= Metadaten) und Festplatte (= Dateispeicherung) nicht integriert ist und muss manuell programmiert werden.

Mit der heutigen Technologie schlage ich vor, dass Sie Bilder in SQL Server 2008 FILESTREAM-Spalten speichern (zumindest werde ich das mit meinem nächsten Projekt tun), da sie den Vorteil kombinieren, Daten in einer Datenbank zu speichern UND große Binärdateien in separaten Dateien zu haben (at am wenigsten laut werbung;))

devio
quelle
Haben Sie die Filestream-Funktionalität schon getestet?
StefanE
1
Tatsächlich kann beim Löschen eines DB-Datensatzes auch das Löschen aus dem Dateisystem codiert werden. Daher finde ich es gut, in FS statt in DB zu speichern
kailash19
9

Das Sprichwort war immer "Dateien im Dateisystem, Dateimetadaten in der Datenbank".

Matt Darby
quelle
6

Besser Dateien als Dateien speichern. Verschiedene Datenbanken behandeln Blob-Daten unterschiedlich. Wenn Sie also Ihr Back-End migrieren müssen, können Probleme auftreten.

Beim Bereitstellen der Impages ist ein <img src = für eine Datei, die bereits auf dem Server vorhanden ist, wahrscheinlich schneller als das Erstellen einer temporären Datei aus dem Datenbankfeld und das Zeigen des <img-Tags darauf.

Ich fand diese Antwort, indem ich Ihre Frage googelte und die Kommentare unter http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html las

funkelnde Schnurrhaare
quelle
1
verwiesener Beitrag scheint etwas veraltet zu sein.
Devio
6

Normalerweise möchte ich Binärdateien in der Datenbank haben, weil:

  • Datenintegrität: Keine nicht referenzierte Datei, kein Pfad in der Datenbank ohne zugeordnete Datei
  • Datenkonsistenz: Nehmen Sie einen Datenbank-Dump und das ist alles. nein "O ich habe vergessen, dieses Datenverzeichnis zu targz."
chburd
quelle
4

Das Speichern von Bildern in der Datenbank erhöht den DB-Overhead für die Bereitstellung einzelner Bilder und erschwert das Auslagern in einen alternativen Speicher (S3, Akami), wenn Sie auf diese Ebene wachsen. Das Speichern in der Datenbank erleichtert das Verschieben Ihrer App auf einen anderen Server erheblich, da nur die Datenbank jetzt verschoben werden muss.

Das Speichern von Bildern auf der Festplatte erleichtert das Auslagern in einen alternativen Speicher und macht Bilder zu statischen Elementen, sodass Sie nicht mit HTTP-Headern in Ihrer Web-App herumspielen müssen, um die Bilder zwischenspeicherbar zu machen. Der Nachteil ist, dass Sie beim Verschieben Ihrer App auf einen anderen Server daran denken müssen, auch die Bilder zu verschieben. etwas, das leicht vergessen wird.

Adam Hawes
quelle
3

Bei webbasierten Anwendungen erzielen Sie eine bessere Leistung, wenn Sie das Dateisystem zum Speichern Ihrer Bilder verwenden. Auf diese Weise können Sie das Zwischenspeichern der Bilder auf mehreren Ebenen in Ihrer Anwendung problemlos implementieren. Das Speichern von Bildern in einer Datenbank bietet einige Vorteile, die jedoch meistens mit clientbasierten Anwendungen verbunden sind.

Dillie-O
quelle
0

Nur um den bisher guten Antworten noch etwas hinzuzufügen. Sie können weiterhin die Vorteile des Caching von sowohl der Web - Ebene erhalten vielleicht und der Datenbank - Ebene , wenn Sie die Route halten Sie Bilder in der Datenbank gehen.

Ich denke, für die Datenbank können Sie dies erreichen, indem Sie die Bilder in Bezug auf die damit verbundenen Textdaten speichern und wenn Sie auf die Bilder in einer bestimmten Abfrage zugreifen können, damit die Datenbank die Abfrage zwischenspeichern kann (allerdings nur theoretisch) Fühlen Sie sich frei, mich in diesem Teil zu nuklearisieren).

Mit der Webseite würde ich vermuten, dass Sie, da Ihre Frage mit asp.net markiert ist, einen http-Handler verwenden würden, um die Bilder bereitzustellen. Dann stehen Ihnen alle Vorteile des Frameworks zur Verfügung, und Sie können Ihre Domänenlogik sauberer halten, indem Sie nur den Schlüssel für Ihr Image an den http-Handler übergeben müssen.

MotoWilliams
quelle
-1

Wählen Sie eine einzelne NoSql-Datenbank zum Speichern Ihrer Dateien.

Es bringt Ihnen Datenintegrität und Datenkonsistenz, wie @chburd erwähnt.

Während Sie rdbms noch klein halten.

Will Wu
quelle
-1
  1. Hier finden Sie ein schrittweises Beispiel (allgemeiner Ansatz, Spring-Implementierung Eclipse) zum Speichern von Bildern im Dateisystem und zum Speichern ihrer Metadaten in der Datenbank - http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. Hier ist auch ein Beispiel - http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. Sie können auch eine Codebasis dieses Projekts untersuchen - https://github.com/jdmr/fileUpload . Achten Sie auf diesen Controller.
Lord Nighton
quelle