Bilder in SQL Server speichern?


191

Ich habe eine kleine Demo-Site erstellt und speichere darauf Bilder in einer Bildspalte auf dem SQL Server. Ein paar Fragen, die ich habe, sind ...

  • Ist das eine schlechte Idee?

  • Beeinträchtigt es die Leistung meiner Website, wenn sie wächst?

Die Alternative wäre, das Bild auf einer Disc zu speichern und nur den Verweis auf das Bild in der Datenbank zu speichern. Dies muss ein allgemeines Dilemma sein, das viele Menschen hatten. Ich würde einige Ratschläge begrüßen und würde mich freuen, wenn ich einen Fehler machen könnte.


5
Gibt es 2017 einen Neuzugang für diese Ausgabe? Gilt das noch heute?
Haikal Nashuha

Antworten:


270

Es gibt ein wirklich gutes Papier von Microsoft Research mit dem Titel To Blob oder Not To Blob .

Ihre Schlussfolgerung nach einer Vielzahl von Leistungstests und Analysen lautet:

  • Wenn Ihre Bilder oder Dokumente in der Regel weniger als 256 KB groß sind, ist das Speichern in einer VARBINARY-Datenbankspalte effizienter

  • Wenn Ihre Bilder oder Dokumente in der Regel größer als 1 MB sind, ist das Speichern im Dateisystem effizienter (und mit dem FILESTREAM-Attribut von SQL Server 2008 stehen sie weiterhin unter Transaktionskontrolle und sind Teil der Datenbank).

  • Dazwischen ist es je nach Verwendung ein bisschen durcheinander

Wenn Sie Ihre Bilder in eine SQL Server-Tabelle einfügen möchten, würde ich dringend empfehlen, eine separate Tabelle zum Speichern dieser Bilder zu verwenden. Speichern Sie das Mitarbeiterfoto nicht in der Mitarbeitertabelle. Bewahren Sie sie in einer separaten Tabelle auf. Auf diese Weise kann die Mitarbeitertabelle schlank und gemein und sehr effizient bleiben, vorausgesetzt, Sie müssen nicht immer auch das Mitarbeiterfoto als Teil Ihrer Abfragen auswählen.

Informationen zu Dateigruppen finden Sie unter Dateien und Dateigruppenarchitektur . Grundsätzlich würden Sie Ihre Datenbank entweder von Anfang an mit einer separaten Dateigruppe für große Datenstrukturen erstellen oder später eine zusätzliche Dateigruppe hinzufügen. Nennen wir es "LARGE_DATA".

Wenn Sie jetzt eine neue Tabelle erstellen müssen, in der VARCHAR- (MAX) oder VARBINARY- (MAX) Spalten gespeichert werden müssen, können Sie diese Dateigruppe für die großen Datenmengen angeben:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

Schauen Sie sich das MSDN-Intro für Dateigruppen an und spielen Sie damit herum!


Ist dies eine gute oder eine schlechte Sache? • Wenn Ihre Bilder oder Dokumente in der Regel größer als 1 MB sind, ist das Speichern im Dateisystem effizienter (und mit dem FILESTREAM-Attribut von SQL Server 2008 stehen sie weiterhin unter Transaktionskontrolle und Teil der Datenbank)
htm11h

Gute Antwort. Wenn Sie ausführlich erklären möchten, warum Sie die Verwendung einer dedizierten Tabelle für Bilddaten empfehlen, habe ich auf dba.SE eine separate Frage dazu erstellt .
Heinzi

15

Ich bin einmal in dieses Dilemma geraten und habe bei Google ziemlich viel nach Meinungen gesucht. Was ich fand, war, dass tatsächlich viele das Speichern von Bildern auf der Festplatte für größere Bilder besser sehen, während mySQL einen einfacheren Zugriff ermöglicht, insbesondere aus Sprachen wie PHP.

Ich habe eine ähnliche Frage gefunden

MySQL BLOB vs Datei zum Speichern kleiner PNG-Bilder?

Mein endgültiges Urteil war, dass für Dinge wie ein Profilbild, nur ein kleines quadratisches Bild, das pro Benutzer vorhanden sein muss, mySQL besser wäre, als ein paar Daumen auf der Festplatte zu speichern, während für Fotoalben und ähnliches Ordner / Bilddateien sind besser.

Ich hoffe es hilft


14

Ich würde es vorziehen, das Bild in einem Verzeichnis zu speichern und dann einen Verweis auf die Bilddatei in der Datenbank zu speichern.

Wenn Sie das Bild jedoch in der Datenbank speichern, sollten Sie Ihre Datenbank partitionieren, damit sich die Bildspalte in einer separaten Datei befindet.

Weitere Informationen zur Verwendung von Dateigruppen finden Sie hier http://msdn.microsoft.com/en-us/library/ms179316.aspx .


11

Warum es sinnvoll sein kann, Bilder in der Datenbank und nicht in einem Katalog auf dem Webserver zu speichern.

Sie haben eine Anwendung mit vielen Bildern erstellt, die in einem Ordner auf dem Server gespeichert sind, den der Client seit Jahren verwendet.

Jetzt kommen sie zu dir. Der Server wurde zerstört und muss auf einem neuen Server wiederhergestellt werden. Sie haben keinen Zugriff mehr auf den alten Server. Die einzige Sicherung, die sie haben, ist die Datenbanksicherung.

Sie haben natürlich die Quelle und können sie einfach auf dem neuen Server bereitstellen, SqlServer installieren und die Datenbank wiederherstellen. Aber jetzt sind alle Bilder weg.

Wenn Sie die Bilder in SqlServer gespeichert haben, funktioniert alles wie zuvor.

Nur meine 2 Cent.


3
Guter Punkt. Backups der Images sind genauso wichtig wie Datenbanksicherungen ... manchmal sogar noch wichtiger.
Chris Catignani

Auch Bilder im Dateisystem benötigen Netzwerkberechtigungen.
Chris Catignani

2
Netzwerkberechtigungen sind ein guter Punkt. Ich sehe jedoch keinen Fall, in dem Sie nur eine Sicherungskopie der Datenbank haben würden. Sie hätten sicherlich eine Sicherungskopie der Anwendung und der Dateien. Sie könnten genauso gut die Datenbank verlieren, aber die Dateien haben.
Norbert Norbertson



7

Während Leistungsprobleme gültig sind, liegen die wahren Gründe in der Praxis, die Sie vermeiden sollten, Bilder in einer Datenbank zu speichern, in Gründen der Datenbankverwaltung. Ihre Datenbank wächst sehr schnell und Datenbanken kosten viel mehr als einfache Dateispeicherung. Datenbanksicherungen und -wiederherstellungen sind viel teurer und zeitaufwändiger als Dateisicherungswiederherstellungen. Zur Not können Sie eine kleinere Datenbank viel schneller wiederherstellen als eine mit Bildern aufgeblähte. Wenn Sie 1 TB Dateispeicher in Azure mit einer 1 TB-Datenbank vergleichen, werden Sie den enormen Kostenunterschied feststellen.


0

Nach meiner Erfahrung ist das Speichern der an einem anderen Ort gespeicherten Bilder in der URL der beste Weg für ein einfaches Projekt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.