PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Filesystem oder Datenbank? Wo Bilder abspeichern


Lex
13.10.2010, 16:31
Hi,

Hab heute (für mich was ganz was neues) erfahren, das man auch Bilder etc, problemlos in der Datenbank ablegen kann.

Jetzt stellt sich mir natürlich die Frage, ist es nicht gescheiter diverse Bilder wie zB Avatare, Cover für Torrents, Bitbucket in die Datenbank zu lagern? Klar die Datenbank wird dadurch groß, aber die Verwaltung und verminderung von Ghost-Files würde sich sicher
minimieren, da zB avatare und cover beim löschen des users bezw des torrents ja mitgelöscht werden.

Das könnte man doch sicher auch für die .torrent files auch machen. Damit minimiert man die Dateien eines laufenden trackers sicher um einiges.

Hat jemand genau Informationen wie sehr sich das denn auf die Performance auswirkt, bilder aus der datenbank anzuzeigen?

Lg Lex

bastelfreak
13.10.2010, 16:34
Die Speicherung von Daten im BLOB ist nicht förderlich für die Performance. Die Bilder direkt auf die Festplatte speichern ist am besten. Arbeite schon länger nicht mehr mit Tracker Sourcen, aber das löschen von Usern+ zugehörige Bilder stellt im Normalfall kein Problem dar(ich weis bei der NV ist alles anders :D).

Lex
13.10.2010, 16:49
Klar gibt möglichkeiten für Scripte etc, die zugehörigen Dateien zu löschen. Interessant is es ja, da durch löschen des User-datensatzes
die zugehörigen Bilder im selben zug zu löschen :)

Lg Lex

Feudas
13.10.2010, 17:16
Bilder in der db zu speichern ist überhabt kein prob.
einige db-manager haben zum beispiel extra da drauf optimierte binärtypen mit im gepäck.
Kann man auch mit mysql oder ms-sql machen.
meine radio webseite läuft schon immer so das sich die meisten bilder in der db befinden.
alle moderatoren oder interpreten zb sind als files nicht existend.
Es ist im übrigen eher vorteilhaft für die performance bilde rin der db zu speichern, die ist nämlich dafür gedacht viele daten in möglichst geringer zeit bereit zu stellen, das normale filesystem kommt da schon ewig nicht mehr hinterher.
jetzt komm mir keine rmit "aber die db liegt doch auf der hd, also muss das fs doch sowieso..." nein muss es nicht der db-.manager öffnet son db file und danach hat das fs damit ziemlich wenig bis nichts mehr mit zu tun.
wenn du viele icons und kleine bilder anzeigen willst bricht das in der db speichern alle recorde. von der optimierten funktion abgesehen greift natürlich noch der db cache grad bei icons und grafken die auf dem tracker angezeigt werden, mit vielen gleichzeitigen zugriffen.
allerdings benötigt die db dann auch mehr speicher, am besten soviel geht für indexierung und caching bereit stellen.
nen mysql mit standart config unoptimiert machst du natürlich tot wenn du alle grafken in einer db speicherst.
ich tippe mal das bastelfreaks erfahrung daher rührt ;)

.torrent files sind auch kein prob hab ich schon mit experimentiert, soll eine funktion meiner source werden, weil mich habend ie dinger schon immer genervt.
warum auch nicht was macht der tracker den?
das .torrent was er bekommt legt er in den ordner.
und wenn du kommst und es saugst wird es zerlegt und mit deinen daten da drin wieder zu einem file verknüpfelt um es dir zu senden, da smachste mit nem binärfile aus der db um einiges eleganter.

mal ein kleines beispiel wie so ein kleines php aussehen kann um bilder aus der db anzuzeigen.
das schnippselchen würde als ersatz für das bild in der img src stehen ;)

$query ="select * from bilddaten where bildname = '$_GET[bild]'";
$result=@mysql_query($query);
$row=@mysql_fetch_array($result);

$data = $row['bilddaten'];
$type = $row['filetype'];
$titel = $row['titel'];

// header setzen ohne browser caching damit er einem auch sicher immer das neue bild anzeigt
Header("Content-type: $type; Expires: Mon, 26 Jul 1997 05:00:00 GMT; Pragma: no-cache; Cache-Control: no-store, no-cache, max-age=0, must-revalidate");

// bild aus den db daten erzeugen
$im = @imagecreatefromstring($data);

// wenn man will noch nen eigenes logo auf jedes bild
//$logo = imagecreatefrompng("images/logo.png");
//$cBackground = ImageColorClosest($logo, 255, 255, 255);
//ImageColorTransparent($logo, $cBackground);
//ImageCopyMerge($im , $logo, 3, 3, 0, 0, ImageSX($logo), ImageSY($logo), 100);

// zusätzlich noch ne beschriftung mit schlagschatten?
// $farbe1 = @imagecolorallocate($im, 255, 255, 255);
// $farbe2 = @imagecolorallocate($im, 0, 0, 0);
// @imagestring($im, 5, 11, ((@ImageSY($im) - 16)), $titel, $farbe2);
// @imagestring($im, 5, 10, ((@ImageSY($im) - 17)), $titel, $farbe1);

// bildausgabe erzeugen
@imagejpeg($im);
// bildobject löschen
@imagedestroy($im);

kann man sicher besser machen, soll dir auch nur zeigen was man so anstellen kann.

gotthummer
14.10.2010, 15:37
also ich persönlich würds nicht mit in die db machen alleine weil dann leute die möglichkeit haben in meien db etwas hochzuladen 2 grund wär die db würde mir zu gross werden und nur damit mann weniger müll hat es gibt doch schon den bilder cleaner von cerb für die nv da ist doch dann garnix mehr mit bild müll auf der hdd und denn mod kann mann sich doch auch super für die torrentfiles anpassen

Lex
14.10.2010, 15:43
Hab mich fürs erste mal entschieden die Covers / Screens für die Torrents in die DB zu packen, wie man am 2. Thread erkennt.
Die Argumente von Feudas haben doch sehr positiv geklungen, und absichern muss man das ganze sowieso. Ob jetzt in die DB laden, oder ins Filesystem
ist im Grunde egal, gesichert muss beides werden. Vorallem denk ich ist es "sicherer" da die bilder ja per funktion in binär zerlegt werden, wudurch sämtliche gefahr
"decodiert" ist.

Einene weiteren Vorteil sehe ich darin, mich nicht mehr um Pfade kümmern zu müssen :)

Lg Lex

gotthummer
14.10.2010, 16:05
naja jeder halt wie er meint nech

SP4C3
14.10.2010, 18:03
Glaub für die Torrentfiles in der DB hab ich irendwo noch was liegen. Ich such das mal raus... Die werden "on the fly" erzeugt etc.pp.

Feudas
14.10.2010, 20:28
jo genau so dachte ich mir das auch, was anderes wird da im momment ja auch nicht gemacht, nur das der ausgangspunkt ne datei ist und kein datencache, wobei aus der datei im ersten schritt auch nur noch nen datencache gemacht wird :D

Lex
19.10.2010, 14:47
So, hab mir jetzt mal mehrere Möglichkeiten ausprobiert.
Dabei hab ich alerdings volgendes Problem.
Zum Darstellen innerhalb eines Contents ist die Variante das Bild im Binär zu speichern und dann per <img src=""> auszugeben auf jeden fall die einfachere Möglichkeit,
da man imagepng(); nur verwendne kann wenn man sonst keinen Content hat.

Ich müsste also zum Auflisten der Cover die <img src="'data:image/*;base64,' . base64_encode($hash);"> Variante benutzen, und als direktlink für die lightbox den imagepng();

Kommt mir unnötig doppelt und kompliziert vor. Vorallem da mir die Variante von Feudas besser gefällt, da man auch thumbs anlegen kann, was ja nicht schlecht ist.
Hat jemand ne Idee wie ich das umsetzen könnte? Ich will nicht wirklich beide varianten benutzen, würde auch die Datenbank unnötig belasten.

Lg Lex



--======================================--
--== Beitrag erstellt: 14:47 um 12:39 ==--
--== geantwortet auf Beitrag vom ==--
--== automatische Beitragszusammenführung ==--
--======================================--


Lex schrieb nach 2 Stunden, 7 Minuten und 11 Sekunden:

So, nach einem kurzen Denkanstoß von Feudas im ICQ hab ichs nun doch noch geschafft.

Vielen Dank an alle beteiligten ^^

Lg Lex

Korrekter Code

<img src="inc/covers.php?coverid=' . $cover['cover_id'] . ' ">