Ich füge meiner Website einige Funktionen hinzu, damit Benutzer ihre eigenen Profilbilder hochladen können, also fragte ich mich, ob ich sie als BLOB in der Datenbank speichern oder in das Dateisystem einfügen soll.
Ich habe eine ähnliche Frage hier gefunden: Speichern von Bildern in DB: Ja oder Nay , aber die Antworten waren eher auf Menschen ausgerichtet, die viele, viele tausend oder sogar Millionen von Bildern erwarten, während ich eher auf kleine Bilder (JPEGs bis zu 150x150 Pixel) und kleine Zahlen von ihnen bedacht bin: vielleicht bis zu ein oder zweitausend.
Was sind die Gefühle über DB BLOB vs Dateisystem für dieses Szenario? Wie gehen Clients mit Zwischenspeichern von Bildern aus der DB vs aus dem Dateisystem?
Wenn BLOBs, die in der Datenbank gespeichert sind, der richtige Weg sind - sollte ich etwas über wo wissen, um sie zu speichern? Da ich mir vorstelle, dass ein Großteil meiner Benutzer kein Bild hochladen wird, sollte ich eine user_pics
-Tabelle erstellen, um (extern) bei Bedarf zur normalen Tabelle users
zu gelangen?
Bearbeiten: Ich öffne diese Frage erneut, weil nicht ein Duplikat der beiden ist, mit denen Sie verknüpft sind. Diese Frage bezieht sich speziell auf die Vor- / Nachteile der Verwendung einer DB oder FS für eine kleine Anzahl von Bildern. Wie ich bereits sagte, richtet sich die andere Frage an Menschen, die Tausende und Abertausende großer Bilder speichern müssen.
Um Teile Ihrer Frage zu beantworten:
Wie gehen Clients mit dem Zwischenspeichern von Images von der DB vs von dem Dateisystem?
Für eine Datenbank: Haben Sie ein last_modified-Feld in Ihrer Datenbank. Verwenden Sie den Last-Modified HTTP-Header, damit der Browser des Clients ordnungsgemäß zwischenspeichern kann. Stellen Sie sicher, dass Sie die entsprechenden Antworten senden, wenn der Browser ein Bild "if neuere" anfordert (kann nicht aufgerufen werden, wie es heißt; ein HTTP-Anfrage-Header).
Für ein Dateisystem: Machen Sie dasselbe, aber mit der geänderten Zeit der Datei.
Wenn BLOBs, die in der Datenbank gespeichert sind, der richtige Weg sind - sollte ich irgendetwas darüber wissen, wo ich sie speichern kann? Da ich mir vorstelle, dass ein Großteil meiner Benutzer kein Bild hochladen wird, sollte ich eine user_pics-Tabelle erstellen, um bei Bedarf die (externe) Verknüpfung zur regulären Benutzertabelle zu erstellen?
Ich würde das BLOB und verwandte Metadaten in eine eigene Tabelle einfügen, mit einer Art Beziehung zwischen ihm und Ihrer Benutzertabelle. Dadurch wird es einfacher, die Tabellenspeichermethode für Ihre Daten zu optimieren, die Dinge übersichtlicher zu gestalten und Spielraum für Erweiterbarkeit zu lassen (z. B. eine allgemeine "Datei" -Tabelle).
Ich hatte einmal eine ähnliche Frage mit einem kleinen DMS für PDF-Dateien. Das Szenario war anders als bei Ihnen: Maximal 100 Dateien mit Größen von jeweils bis zu 10 MB - nicht das, was Sie für Profilbilder erwarten. Aber die Antwort, die mir ein Freund damals gegeben hat, gilt auch für Ihren Fall:
Verwenden Sie jedes Speichersystem für die Zwecke, für die es vorgesehen ist.
Speichern Sie Daten in einer Datenbank . Speichern Sie Dateien in einem Dateisystem .
Dies ist nicht die ultimative Antwort (*), aber es ist eine gute Faustregel für Anfänger.
Ich habe nie gehört, dass Windows FS langsam und manchmal unzuverlässig ist, wie Aaron Digulla in seiner Antwort feststellt. Wenn es solche Probleme gibt, muss dies sicherlich berücksichtigt werden. Aber für Avatarbilder fällt mir das nicht so wichtig auf.
(*) Ich weiß, ich weiß, 42 ...
Aus meiner Sicht sollte alles, was außerhalb der Datenbank bleibt, draußen bleiben. Es kann sich um Dateisystem oder separate Tabellen handeln, die Sie nicht täglich replizieren oder sichern. Es macht die Datenbank viel leichter, es wird langsamer und einfacher zu verstehen und zu pflegen.
Wenn Sie auf MSSQL sind, stellen Sie sicher, dass Blobs in einer separaten Datendatei gespeichert sind. Nicht in PRIMARY wie alles andere.
Tragen Sie unter Windows so viel wie möglich in die Datenbank ein. Das Dateisystem ist etwas langsam und manchmal sogar unzuverlässig.
Unter Linux haben Sie mehr Optionen. Hier sollten Sie überlegen, große Dateien in ein Dateisystem zu verschieben und den Namen in der Datenbank zu behalten. Wenn Sie ein modernes Dateisystem wie Ext3 oder ReiseFS verwenden, können Sie sogar viele kleine Dateien mit ziemlich guter Leistung erstellen.
Sie müssen auch berücksichtigen, wie Sie auf die Daten zugreifen können. Wenn Sie alles in der DB haben, haben Sie einen Zugriffspfad, brauchen sich keine Sorgen um einen anderen Satz von Berechtigungen zu machen, aber Sie müssen mit der zusätzlichen Komplexität des Lesens / Schreibens von BLOBs fertig werden. In vielen DBs können BLOBs nicht durchsucht werden.
Im Dateisystem können Sie andere Tools auf Ihren Daten ausführen, was nicht möglich ist, wenn die Dateien in einer Datenbank gespeichert sind.
Ich würde sie in der Datenbank speichern:
Da Sie über eine kleine Anzahl von Bildern sprechen, sollte die Benutzerfreundlichkeit / Verwaltung Vorrang vor Leistungsproblemen haben, die in den verknüpften Fragen diskutiert werden.
Ich denke, es gibt einen Managability-Vorteil, der sie in der Datenbank speichert; Sie können mit den anderen Daten konsistent gesichert und wiederhergestellt werden - Sie werden nicht vergessen, veraltete zu löschen (naja, Sie könnten es, aber es ist ein wenig weniger wahrscheinlich), und wenn Sie die Datenbank auf einen anderen Computer migrieren, gehen die Bilder mit es.