Ich habe eine kleine Demoseite erstellt, auf der ich Bilder in einer Bildspalte auf dem Sql-Server speichere. Ein paar Fragen, die ich habe, sind...
Ist das eine schlechte Idee?
Wird es die Leistung meiner Website beeinträchtigen, wenn sie wächst?
Die Alternative wäre, das Bild auf der Festplatte zu speichern und nur den Verweis auf das Bild in der Datenbank zu speichern. Dies muss ein häufiges Dilemma sein, das viele Leute hatten. Ich würde mich über Ratschläge freuen und wäre sogar froh, wenn ich weniger Fehler machen würde, wenn ich könnte.
Es gibt ein wirklich gutes Papier von Microsoft Research mit dem Titel To Blob or Not To Blob.
Die Schlussfolgerung nach einer großen Anzahl von Leistungstests und Analysen ist folgende:
Wenn Ihre Bilder oder Dokumente in der Regel weniger als 256 KB groß sind, ist es effizienter, sie in einer VARBINARY-Spalte der Datenbank zu speichern.
wenn Ihre Bilder oder Dokumente typischerweise über 1 MB groß sind, ist es effizienter, sie im Dateisystem zu speichern (und mit dem FILESTREAM-Attribut von SQL Server 2008 sind sie immer noch unter Transaktionskontrolle und Teil der Datenbank)
zwischen diesen beiden ist es ein bisschen wie eine Entscheidung, abhängig von Ihrer Verwendung
Wenn Sie sich entscheiden, Ihre Bilder in einer SQL Server-Tabelle zu speichern, würde ich dringend empfehlen, eine separate Tabelle für die Speicherung dieser Bilder zu verwenden - speichern Sie das Mitarbeiterfoto nicht in der Mitarbeitertabelle, sondern in einer separaten Tabelle. Auf diese Weise kann die Tabelle Employee schlank und effizient bleiben, vorausgesetzt, Sie müssen nicht immer auch das Mitarbeiterfoto als Teil Ihrer Abfragen auswählen.
Eine Einführung in 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 sie "LARGE_DATA".
Wenn Sie nun eine neue Tabelle erstellen wollen, die VARCHAR(MAX)- oder VARBINARY(MAX)-Spalten speichern muss, können Sie diese Dateigruppe für die großen Daten 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
Sehen Sie sich die MSDN-Einführung zu Dateigruppen an und spielen Sie damit herum!
Ich bin einmal in dieses Dilemma geraten und habe bei Google nach Meinungen recherchiert. Ich fand heraus, dass in der Tat viele das Speichern von Bildern auf der Festplatte für größere Bilder für besser halten, während mySQL einen einfacheren Zugriff ermöglicht, insbesondere von Sprachen wie PHP.
Ich habe eine ähnliche Frage gefunden
https://stackoverflow.com/questions/4659441/mysql-blob-vs-file-for-storing-small-png-images
Mein abschließendes 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 das Speichern eines Haufens von Thumbs auf der Festplatte, während für Fotoalben und ähnliche Dinge Ordner/Bilddateien besser sind.
Hoffentlich hilft das
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 so partitionieren, dass sich die Bildspalte in einer separaten Datei befindet.
Mehr über die Verwendung von Dateigruppen erfahren Sie hier http://msdn.microsoft.com/en-us/library/ms179316.aspx.