PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Diskussion] Bilder in einer Msql Datenbank



Jorval
05-05-2006, 11:39
Hallo zusammen,

Ich suche nach meinungen zum thema "pro/contra bilder in einer datenbank speichern"

hintergrund:
ich habe hier einen server auf dem ein in PHP programmiertes portal einer partnerfirma läuft. mitte april wurde das portal (das staendiger anpassung nach unseren vorgaben unterliegt!) geaendert und bilder werden nun in der datenbank gespeichert.

in den naechsten tagen wird es eine diskussion auch zu diesem thema geben und ich wuerde gerne mehrere meinungen zu diesem thema sammeln um gut vorbereitet (und evtl. ja auch mit einem besseren verstaendnis) in diese besprechung gehen zu koennen.

ich bin auch fuer die datensicherung dieser datenbank verantwortlich. derzeit mache ich alle 30min. einen mysqldump der in unter 30sek. fertig ist und ca. ein volumen von 100MB erreicht. vor den bildern in der datenbank waren es 13MB und die zeit war kaum messbar :)
frueher galt auch die these das bilder in der datenbank anfragen verlangsamen da beim durchsuchen des tables ja auch die bild(blob) felder durchsucht werden und diese (aufgrund ihrer groesse) die anfrage verlangsamen. gilt diese these noch ?

ich selber bin der meinung das es einfacher ist die bilder im dateisystem abzulegen und die pfade in der datenbank. zur bildmanipulation koenen auch weiterhin sowohl php-scripte wie auch shellskripte heran gezogen werden.
ich habe mal versucht meine argumente in pro und contra zu trennen viele sind es aber leider noch nicht (da ich auch nur die genommen habe bei denen ich mir technisch halbwegs sicher bin!) :)

pro Bilder in der Datenbank:
-> das löschen eines bildes erledigt sich schnell und einfach durch das loeschen des datensatzes.

contra Bilder in der Datenbank:
-> die datenbank wird durch die bilder groesser
-> zum auslesen bzw. anzeigen ist zusaetzlicher codingaufwand nötig (auslesen als stream!)
-> bildmanipulationen sind durch den zusaetzlichen codingaufwand umstaendlicher [inner.glow]
-> im dateisystem abgelegte bilder können extern verlinkt werden. [inner.glow]
-> die erhöhte datenmenge führt zu erhöhtem netztraffic da mysql TCP als kommunikationsbasis verwendet. [Turbohummel]

ich lasse mich auch gern davon ueberzeugen das bilder in einer datenbank sinn machen. ich habe lange gegoogelt um eine diskussion pro/contra zu finden habe aber nur einzelne threads gefunden die mal das eine mal das andere befuewortet haben. ich moechte diesen thread mal zum generellen vergleich der beiden lager nutzen :)

ich hoffe auf rege beteiligung :)

danke
j:

inner.glow
05-05-2006, 13:56
Hallo Jorval!

Ich hatte natürlich das gleiche Problem. An der Seite http://kulturundspielraum.org arbeiten sehr viele Redakteure. Ein Bild-Upload zu den einzelnen Artikeln ist möglich.

Ich habe die hochgeladenen Bilder in verschiedenen Größen im Dateisystem abgelegt. Meine Gründe:

* Die hochgeladenen Bilder werden per Imagemagick verkleinert und in verschiedenen Größen gespeichert. Wenn ich die Bilder in der Datenbank ablegen würde, müsste ich die gespeicherten Bilder nach der Manipulation wieder löschen und in der Datenbank ablegen -> Aufwändig!
Das Löschen der Bilder ist auch recht einfach meine Bilder werden alle so gespeichert, dass ich alle zu einem Datensatz gehörenden Bilder mit einem Komando löschen kann!

* Wenn sich irgendwann die Bildgrössen, die für die Webseite benötigt werden, ändern sollten, kann ich mit einigen wenigen Shell-Kommandos die bereits hochgeladenen Bilder auf die richtigen Grössen bringen.

* Ich lasse mir einmal wöchentlich ein Bachup der daten per Mail schicken... Wenn die Bilder in der datenbank wären, wäre das nicht möglich.

* Wenn ich die Bilder in der Datenbank ablegen würde, müsste ein Programm bild.php zusätzlich die Bilddaten aus der datenbank lesen, oder? Also eine zusätzliche, unnötige SQL-Abfrage mehr, oder?

* Wenn ich in z.B. aus einem Newsletter die Bilder verlinke, gibt es keine unnötigen SQL-Abfragen beim Abrufen der Bilder.

Ich sehe keinen Grundm, die Bilder in der Datenbank zu speichern... Ausser, dass beim DB-Backup ALLE daten gesichert werden...

sg, Fabian

Turbohummel
05-05-2006, 19:21
Sehe ich im Prinzip genauso.

Zumal man damit recht viel Traffic auf dem lokalen TCP produziert, die Daten müssen ja auch erst mal geschoben werden. Direkter Dateisystemzugriff ist da natürlich fixer. Wenn man Datenbankserver und Applikationsserver trennt, kann man die Bilder auf den Applikationsserver legen, und muss die Datenmenge nicht über das Netzwerk verschieben.

Vielleicht noch als Tipp: Zur Sicherheit die MD5-Hashes der Bilder mit in die Datenbank schreiben.

Jorval
08-05-2006, 08:47
Danke euch beiden schonmal :)

das mit den MD5sums ist uebrigens eine hervorragende idee :)

gibt es evtl. jemanden der die meinung vertritt das bilder in der datenbank sehrwohl sinn machen und ein paar argumente dafuer posten kann ?

vielen dank nochmals an alle fuer die hilfe :)
j:

elrond
08-05-2006, 09:38
ich arbeite auch schon seit einigen jahren mit datenbanken und bin bisher nie auf die idee gekommen bilder in die db zu packen. Gründe s.o.

ich betreibe eine Anwendung bei der wir einen regen schriftverkehr mit den kunden unterhalten. dazu bekomme ich für jedenbrief der rausgeht ein pdf in die hand. das auf dem dateisystem abzulegen hat wie schon erwähnt bei der datensicherung erhebliche vorteile. ich habe in einem tgz die datenbank und im anderen, wesentlich grösseren die pdf's, die ich zur entwicklung einfach nicht brauche. damit erledige ich die aktion mit dem holen der aktuellen daten auf mein testsystem in ca. 3 min... :)

Jasper
08-05-2006, 20:21
gibt es evtl. jemanden der die meinung vertritt das bilder in der datenbank sehrwohl sinn machen und ein paar argumente dafuer posten kann ?


aber gern:

- einheitliches interface für die anwendung
- bilddaten können durch die datenbank verarbeitet werden
- bilddaten und beschreibende daten sind direkt miteinander verbunden

richtig implementiert sind bilder in blobs gespeichert eine hervorragende sache.
mal als beispiel medizinische aufnahmen in einer oracle datenbank:

- client-server-anwendung kann über ein einziges interface (OCI) sowohl auf die patientendaten als auch deren röntgen/tomographenbilder zugreifen
- alle daten werden durch die datenbank selbst verschlüsselt
- beim schreiben eines röntgenbildes scannt ein selbstgeschriebener indextyp direkt in der datenbank die bilddaten mittels ocr und ordnet das bild dem korrekten patienten zu
- wird der patient gelöscht, werden alle seine daten konsistent und sicher aus dem system entfernt

und richtig implementiert ist das sauschnell (unter oracle).


-j

elrond
09-05-2006, 07:09
allerdings ist das was du da beschreibst abhängig von der eingesetzten anwendung. für eine client-server app ist es gut und sinnvoll nur eine connection bzw. einen conn-typ) zu den daten verwalten zu müssen. Lägen in diesem Fall die daten im filesystem, müsste der client die verbindung zur db und zun fs haben, was gerade in heterogenen umgebungen nicht immer einfach und auch sicherheitstechnisch oft bedenklich ist.
Setzt man aber auf eine middleware-lösung, ist es aus og. gründen schon sinnvoll, die bilddaten im fs, beim app-server zu speichern. Hauptgrund: die DB muss die Bilddaten nicht verarbeiten ;) zzgl. datensicherung usw...

Turbohummel
09-05-2006, 17:38
Den einzigen Vorteil den ich sehe, wäre das Backup. Mit nem DB-Dump hast du alle nötigten Daten. ABER: Der Dump dauert länger und das wiedereinspielen natürlich auch.
Da dabei 100e Bilder in einer Datei liegen, würde ich die Bilder auf jeden Fall in eine andere Tabelle auslagern und mittels Fremdschlüssel in die Ursprungstabelle verlinken. Das spart bei einfachen lesezugriffen, dass die 100 Bilder jedesmal von der Platte in den RAM geladen werden müssen.

Mit PHP wirst du ja in der Regel einmal das HTML mit den Daten zusammenbauen, und darin ein Bild verlinken (evtl. über get_bild.php?bild_id=2444), weswegen du beim ersten Request das Bild noch nicht brauchst und beim 2. nur den Blob lesen musst.

Der Implementierungsaufwand ist nur geringfügig höher, da man das ja in einer Klasse verschachteln kann, der das Bild an einen Datensatz direkt dran hängt.

RHBaum
15-05-2006, 09:03
Schliesse mich Jasper an, Bilder in der DB ham durchaus in manchen Situationen einen Sinn.
Stell dir ne nicht Browser basierende App vor in ner heterogenen netzwerkumgebung vor, wenn man da die Pfade, wenns geht durch firewalls verschiedene Filesysteme noch einstellen muss, der Admin wird sich freuen ^^ Die TCP Verbindung zum server muss eh stehen, dann noch extra fuer die bilder was getrennt administrieren ?
Den Overhaed von TCP und der Bilder allgemein bekommt man durch nen Caching der Bilder in der App weg. Iss natuerlich bisserl mehr Aufwand.

In ner Webumgebung, wo Du sowieso auf nen relativ verlinktes Filesystem zugreifst, was nur durch die DB "befuelllt" wird, faellt der extra administrationsaufwand fuer den filezugang eh weg, da kann man die bilder einfacher extern lagern ....

Backup darf bei heutigen System kein Thema mehr sein .... da sollts auf die paar MB ned ankommen und unterstuetzen datenbanken nicht teilweisse auch inkrementelle backups ?

Ciao ...

Jorval
19-05-2006, 14:06
Hallo zusammen :)

danke nochmals fuer eure meinungen.

als resüme kann ich nun sagen das ich meine meinung zu bildern in der datenbank nun ein wenig ins gleichgewicht gebracht habe :)
ich glaube zwar das ich aus gewohnheit auch weiterhin bilder lieber im dateisystem ablege aber ich ich werde sicherlich auch mal die andere variante ausprobieren und bilder in einer datenbank speichern um zu schauen ob es mir die gleichen vorteile verschafft.

in der datenbank um die es in diesem konkreten fall geht sind derzeit ca 50% der bilder vorhanden. einen leistungseinbruch kann ich nicht feststellen. sehen wir mal ob es auch so bleibt aber ich denke da recht optimistisch :)

ich würde mich auch weiterhin über meinungen und beispiele pro/contra zu diesem thema freuen. ich hoffe das auch der eine oder andere der sich schonmal vor die selbe frage gestellt sah hier ein paar anregung und evtl. eine antwort findet.

danke nochmals an alle

j:

mwanaheri
19-05-2006, 17:36
Na gut, dann hier noch mal Gründe:
Vorteil von Bildern in der DB:
- Sie liegen nicht im Dateisystem und es wird weniger leicht von anderen daran herumgepfuscht.
- es reicht die Datenbankverbindung, ich brauche nicht noch zusätzlich einen Dateisystemzugriff zu überwachen.

Nachteile:
Will man sein System unabhängig vom Datenbanksystem halten, _kann_ es sich anbieten, clobs zu vermeiden.

Romanday
21-05-2006, 07:09
Man kann auch komplette Programme in einer DB Speichern (theoretisch).

Spaß beseite.
Einfach mal überlegen wie funktioniert eine DB Abfrage, und z.
B. wie viel RAM wird Wann, Warum verbraucht.

http://www.php-faq.de/q/q-db-blob.html

elrond
22-05-2006, 08:57
Man kann auch komplette Programme in einer DB Speichern (theoretisch).

Spaß beseite.


ist garnicht so abwegig.

bei uns läuft seit jahren ein (eigenentwickeltes) system auf den win-clients. ein startprog bekommt den auftrag das anwendungsprog zu starten. bevor das aber passiert, wird in der datenbank nach updates zur entspeechenden applikation gesucht und ggf. aus der db runtergeladen und installiert. damit benötigen wir keinerlei filezugriff der clients in unser netzwerk, sondern regeln das über die db...

Romanday
22-05-2006, 16:25
ist garnicht so abwegig.

bei uns läuft seit jahren ein (eigenentwickeltes) system auf den win-clients. ein startprog bekommt den auftrag das anwendungsprog zu starten. bevor das aber passiert, wird in der datenbank nach updates zur entspeechenden applikation gesucht und ggf. aus der db runtergeladen und installiert. damit benötigen wir keinerlei filezugriff der clients in unser netzwerk, sondern regeln das über die db...

Ist ja auch absolut sinnvoll, aber nicht fürs Internet gegeignet.
Das weißt du vorher nicht wie viele Leute gleichzeichtig auf deine
DB zugreifen.

elrond
23-05-2006, 06:41
da hassu latürnich recht... :o