Bilder auf Webspace oder in Datenbank speichern?

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

in einer PHP-Webapplikation haben wir ca. 12.000 Datensätze. Zu jedem Datensatz gibt es meist
(in 70% der Fälle) ein entsprechendes Foto, welches wir im Webspace ablegen und mit der ID des
Datensatzes in der Datenbank identifizieren. Ist dies eine sinnvolle Vorgehensweise, oder macht
es eher Sinn, das Foto im Base64-Format in der Datenbank zu hinterlegen?

VG,
 
Nein, macht alles nur komplizierter.

Beispiel: Caching, CDN, ...

Eine Ausnahme wäre mmn. wenn man zu jedem Eintrag ein sehr kleines Bild hat, dann könnte man das auch in der Datenbank speichern, weil man sich zusätzliche Requests spart.

Lg
 
  • Gefällt mir
Reaktionen: kim88, _RM_ und SaxnPaule
Dsimon24 schrieb:
Hallo zusammen,

in einer PHP-Webapplikation haben wir ca. 12.000 Datensätze. Zu jedem Datensatz gibt es meist
(in 70% der Fälle) ein entsprechendes Foto, welches wir im Webspace ablegen und mit der ID des
Datensatzes in der Datenbank identifizieren. Ist dies eine sinnvolle Vorgehensweise, oder macht
es eher Sinn, das Foto im Base64-Format in der Datenbank zu hinterlegen?

VG,

Wie ihr es macht ist es sinnvoller. A) kannste so das Bild direkt verlinken (vs Webserver holt das Bild erst von der DB und liefert es dann aus) b) weniger Last auf der DB c) kleinere Datenbank. Vorteil wäre höchstens dass du beim Backup der DB automatisch die Bilder wegsichern könntest aber dafür ist das Backup halt auch größer(und base64 machts ja nochmal größer)....
 
Macht fast nur Sinn wenn du Zugriffsrechte kontrollieren willst, oder Schutz gegen Hotlinking etc.

Aber auch da gibts mit X-Sendfile & Co verschiedene Möglichkeiten, diese Arbeit an den Webserver auszulagern und nicht im PHP damit rumkrebsen zu müssen.
 
12'000 ist jetzt kein Problem, und Datenbanken können durchaus "binary large objects" aka BLOBs speichern.

Sinnvoll ist das aber nur, wenn man wirklich spezifische Ansprüche daran hat. Wenn wir jetzt solche Bilddaten analysieren wollen würden zum Beispiel, dann wollen wir nicht hergehen müssen und ständig das Dateisystem fragen.

Oder wenn auf Basis der Bilddaten irgendwas entschieden werden soll. Kurz, wenn die Bilder nicht einfach nur simple Attributwerte sind, die man halt anzeigen will.


Genau da kommt das mit dem "je mehr Minigrafiken wir brauchen, desto eher in die DB" ins Spiel.

Wenn das jetzt Abertausende Requests pro Sekunde sind und alle wollen eine (Ergebnis-)Liste von Personen, die jeweils eine 50x50 Grafik als Konterfei haben, dann kann man sich das anschauen und kann gucken, inwieweit man A die kleinen Bildchen auf SSD umzieht --- oder halt B in die Datenbank schreibt.

Für etwa 12000 records ist das aber IMO nicht relevant und die Angelegenheit ist aus bereits benannten Gründen besser im Dateisystem aufgehoben.
 
Base64 ist nicht nötig oder sinvoll, wie schon erwähnt, wenn man sowas in der DB speichert einfach als BLOB column.

Generell würde ich das Dateisystem oder Object Storage wie S3 für Dateien empfehlen. Die wesentliche Ausnahme ist der Fall in dem die Konsistenz zwischen Datenbank und Datei wichtig ist. Relationale Datenbanken bieten gewisse Konsistenzgarantien an, und wenn man jetzt eine Datei die zu einem Datensatz gehört im Dateisystem speichert gelten diese Garantien dann natürlich nicht mehr für diese Daten. Da gibt es natürlich auch immer Lösungen, aber das kann einiges an Komplexität mit reinbringen und die Datenbank kann das schon out of the box.

Problem mit Dateien in der Datenbank ist das es die Datenbank größer macht, was Backups aufwändiger macht und generell viele Sachen schwieriger macht wenn die Datenbank so richtig groß wird (12 000 rows sind noch trivial). Generell ist es auch einfacher mehr Server hinzustellen auf denen nur Dateien liegen sollen (oder einfach sowas einkaufen wie AWS S3) als eine relationale Datenbank auf sehr, sehr große Datenmengen zu skalieren. Dein Fall ist aber weit von diesen Problemen entfernt.

Dateigröße spielt auch eine sehr große Rolle, wenn die Dateien jetzt ein paar Megabyte oder größer sind würde ich sehr stark abraten sie in einer relationalen Datenbank zu speichern. Wenn es um 10-100 kB geht wäre es für mich eine Option in bestimmten Fällen. Meine Präferenz ist aber trotzdem das Dateisystem.
 
Zurück
Oben