de.comp.lang.php.* FAQ

16.3. Ist es sinnvoll, Bilder in einer Datenbank abzulegen?

Keywords: SQL | Datenbank | Bild | Download | Performance | BLOB

Antwort von Kristian Köhntopp

Aus irgendeinem Grund scheinen viele Leute zu glauben, dass es Bilddaten adeln würde, wenn man sie in eine Datenbank stopft.

Wenn man die Bilddaten selbst in der Datenbank ablegt, hat dies den Vorteil, dass keine broken links auftreten können, weil ja die Bilder selbst genauso wie die Links auf die Bilder aus der Datenbank erzeugt werden. Liegen die Bilddaten dagegen im Dateisystem und die Datenbank enthält nur Pfadnamen, dann ist es problemlos möglich, dass jemand die Dateien umbenennt, ohne diese Änderung in der Datenbank nachzuführen und umgekehrt. Leider ist es speziell bei MySQL so, dass keinerlei Mechanismen vorhanden sind, die die referentielle Integrität der Datenbank sicherstellen, sodass diese Sicherheit nicht wirklich gegeben ist.

Dazu kommen noch eine Reihe von weiteren Nachteilen:

  • Wenn man die Bilddaten selbst in der Datenbank speichert, dann muss man für jedes Bild in einer Webseite ein Script starten. Das bedeutet, für eine Seite wie

    index.php:
    
    <html>
    <body>
    <h1>Bla</h1>
    <img src="sendimage.php?img=geniales_logo.gif" />
    </body>
    </html>
    

    muss nicht nur das Script index.php gestartet werden, um das HTML zu generieren, sondern für jedem Image-Tag auf der Seite muss ein Script sendimage.php gestartet werden, das eine Datenbankverbindung aufmacht und das Bild aus der Datenbank fischt. Wenn CGI PHP verwendet wird, ist der Overhead noch viel größer, denn hier muss für jedes Bild ein 800 kB großer PHP-Prozess erzeugt und gestartet werden.

    Legt man dagegen die Bilder als Dateien im Dateisystem ab, kann man mit der Static Page Engine des Webservers oder gar einem spezialisierten Bilder-Webserver arbeiten und ist um ca. den Faktor 10 effizienter.

  • MySQL kann BLOBs (binary large objects) nicht fragmentarisch bearbeiten, d.h. es ist nicht möglich, ein BLOB in kleinen Teilstücken aus der Datenbank zu holen oder den hinteren Teil eines BLOBs zu holen, ohne die Bytes davor zu lesen. Obendrein ist der Sendepuffer von MySQL für BLOBs begrenzt groß, sodass nicht beliebig große BLOBs in der Datenbank abgelegt werden können.

  • Viele Datenbanken werden sehr ineffizient, wenn vergleichsweise große BLOBs zusammen mit anderen, sehr kleinen Objekten in derselben Tabelle gespeichert werden oder wenn eine Tabellenzeile mehr als ein BLOB enthält.

Wie man Bilder in einer MySQL-Datenbank speichert, wird im Artikel Wie kann ich Bilder in einer MySQL-Datenbank speichern? beschrieben.

Valid HTML 4.01! Valid CSS!

16.3. Ist es sinnvoll, Bilder in einer Datenbank abzulegen?
http://www.php-faq.de/q/q-db-blob.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team