Kalle_B: 2 Bilder pro Datensatz in Datenbank oder Datei?

Hallöle,

habe pro Adresse ein Vorschaubild (für Listen) und ein größeres Bild (ca. 400 x 400 px) zu speichern.

Würde das gerne in der Datenbank machen, weil

  • bei Kopierfunktion bekommt die neue Adresse automatisch die Bild mit,
  • bei Datensicherung DB sind die Bilder mitgesichert.

Es können mehrere zehntausend Datensätze werden. Macht MySQL 5 dabei irgendein Problem? Z.B. Laufzeitverhalten, DB-Größe?

An was wäre in diesem Zusammenhang noch zu denken?

LG Kalle

  1. An was wäre in diesem Zusammenhang noch zu denken?

    Ggf. kannst du das Vorschaubild auch on-the-fly aus der Datenbank generieren (oder in einem Cache-Verzeichnis ablegen, wenn es noch nicht existiert), wenn das Geschwindigkeitsmäßig ok ist. Dann musst du das Bild nicht 2x speichern.

    1. Ggf. kannst du das Vorschaubild auch on-the-fly aus der Datenbank generieren (oder in einem Cache-Verzeichnis ablegen, wenn es noch nicht existiert), wenn das Geschwindigkeitsmäßig ok ist. Dann musst du das Bild nicht 2x speichern.

      Hmm, muss ich überlegen. Das "kleine" Bild könnte sinnvollerweise ein Ausschnitt aus dem großen sein, also nicht nur eine 1:1 Verkleinerung, die kann man oft nicht erkennen.

      Aber wenn das kleine Bild fehlt, könnte ich es wohl erzeugen.

      Wie heisst die PHP- Bibliothek dazu und wie kann ich abfragen, ob sie vorhanden ist?

      Kalle

      1. Hello,

        Aber wenn das kleine Bild fehlt, könnte ich es wohl erzeugen.

        Wie heisst die PHP- Bibliothek dazu und wie kann ich abfragen, ob sie vorhanden ist?

        die gd-lib gehört inzwischen zu den PHP-Sourcen dazu.

        mit der Fnktion gd_info()
        http://de2.php.net/manual/de/function.gd-info.php
        kannst Du einige Features erfragen.

        Wenn DU eine Debian-Dtribution von PHP (5.2.6 ...) hast, wird die Funktion imagerotate() fehlen, was ich sehr bedaure.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. hi,

    Es können mehrere zehntausend Datensätze werden. Macht MySQL 5 dabei irgendein Problem? Z.B. Laufzeitverhalten, DB-Größe?

    Wenn bei einem Request ohnehin ein CGI-Prozess läuft, in dem ein Handle auf MySQL erstellt wird, also das Handle ohnehin schon vorhanden ist, ist das Auslesen eines Images ab diesem Zeitpunkt aus der DB performanter als dies mit einem CGI-Prozess aus dem Dateisystem zu lesen.

    An was wäre in diesem Zusammenhang noch zu denken?

    An die Übertragung und Speicherung der Images in der DB. Binärdateien können Zeichen enthalten, die Probleme machen. Nach meiner Erfahrung funktioniert das Übertragen von GIFs per HTTP und das Schreiben dieser in ein Blobfeld einwandfrei aber bei manchen JPGs ist das Bild kaputt. Wird alles MIME::Base64 kodiert, gibt es keine Probleme, jedoch ca 30% mehr Bits und Bytes.

    Da Base64 nur ASCII enthält, kommt für die DB ein ganz normales Textfeld in Frage.

    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Hi!

      Wenn bei einem Request ohnehin ein CGI-Prozess läuft, in dem ein Handle auf MySQL erstellt wird, also das Handle ohnehin schon vorhanden ist, ist das Auslesen eines Images ab diesem Zeitpunkt aus der DB performanter als dies mit einem CGI-Prozess aus dem Dateisystem zu lesen.

      Ein Request nach einem HTML-Dokument und der nach dem Bild sind zwei verschiedene, die sind also getrennt zu betrachten.

      An was wäre in diesem Zusammenhang noch zu denken?
      An die Übertragung und Speicherung der Images in der DB. Binärdateien können Zeichen enthalten, die Probleme machen.

      Mit kontextgerechter Behandlung der Werte ist mit keinen Problem zu rechnen. Ein passender Feldtyp (BLOB) sollte auch verwendet werden.

      Nach meiner Erfahrung funktioniert das Übertragen von GIFs per HTTP und das Schreiben dieser in ein Blobfeld einwandfrei aber bei manchen JPGs ist das Bild kaputt.

      Dann hast du sehr wahrscheinlich die Erfahrung mit fehlerhaften Scripten gemacht.

      Lo!

      1. Hi!

        Wenn bei einem Request ohnehin ein CGI-Prozess läuft, in dem ein Handle auf MySQL erstellt wird, also das Handle ohnehin schon vorhanden ist, ist das Auslesen eines Images ab diesem Zeitpunkt aus der DB performanter als dies mit einem CGI-Prozess aus dem Dateisystem zu lesen.

        Ein Request nach einem HTML-Dokument und der nach dem Bild sind zwei verschiedene, die sind also getrennt zu betrachten.

        Ja, macht es aus Performancegründen Sinn, das Bild in HTML einzubinden, also nicht vom Browser extra laden zu lassen (die Technik gibt es ja bei Mails, habe das auch schon für HTML getestet)?

        Kalle

        1. Hi,

          Ja, macht es aus Performancegründen Sinn, das Bild in HTML einzubinden, also nicht vom Browser extra laden zu lassen (die Technik gibt es ja bei Mails, habe das auch schon für HTML getestet)?

          Der IE kann das m.W. immer noch nicht interpretieren.

          Ausserdem kann es nur in Ausnahmefällen sinnvoll sein.
          Ein "normales" Bild kann mein Browser aus dem Cache holen, sobald es zum zweiten Mal angezeigt werden soll.
          Direkt im HTML-Code untergebrachte Bilddaten müsste er hingegen mit jedem neuen HTML-Dokument auch wieder erneut mitladen - das ist also unter normalen Web-Bedingungen das absolute Gegenteil von performant.

          MfG ChrisB

          --
          Light travels faster than sound - that's why most people appear bright until you hear them speak.
          1. Moin!

            Direkt im HTML-Code untergebrachte Bilddaten müsste er hingegen mit jedem neuen HTML-Dokument auch wieder erneut mitladen - das ist also unter normalen Web-Bedingungen das absolute Gegenteil von performant.

            Abgesehen davon erhöht die für "data:"-Ressources notwendige Codierung (base64) die Datenmenge durchaus beträchtlich. Das will man eigentlich wirklich nur für sehr kleine Grafiken, deren Datenmenge im Verhältnis zum HTTP-Overhead, den man vermeiden kann, klein ist.

            - Sven Rautenberg

          2. Ausserdem kann es nur in Ausnahmefällen sinnvoll sein.
            Ein "normales" Bild kann mein Browser aus dem Cache holen, sobald es zum zweiten Mal angezeigt werden soll.
            Direkt im HTML-Code untergebrachte Bilddaten müsste er hingegen mit jedem neuen HTML-Dokument auch wieder erneut mitladen - das ist also unter normalen Web-Bedingungen das absolute Gegenteil von performant.

            Nun ja, beim Hochladen und Anzeigen von Bildern bin ich eben verzweifelt. Das kleine Bild bekommt den Dateinamen ID_kl.jpg (ID steht für die Adress-ID). Egal, was ich hochgeladen habe, es wurde immer das erste Bild angezeigt.

            Ich habe den Code hin und her geprüft, mit echo Kontrollen ausgegebn ...

            Bis es bei mir "klick" machte und ich die Minuten und Sekunden angehängt habe: ID_kl.jpg?mi:ss Jetzt wird das aktuelle Bild geholt. An diesen verflixten Cache hatte ich nicht gedacht.

            Kalle