Linuchs: PDF in DB-Tabellen speichern

Moin,

ich baue eine DB-Tabelle auf mit Song-Titeln für Chöre.

Zu zahlreichen Titeln gibt es PDF Noten und PDF Texte. Es ist aufwändig, die als Admin per FTP als Dateien extra hochzuladen und zu verwalten. Chöre haben keinen Zugriff zum FTP.

Macht es Sinn, PDF-Dokumente im Datensatz zu speichern? Habe das noch nie gemacht.

Wie funktioniert das und welche Vor- und Nachteile hat das?

Gruß, Linuchs

  1. Hallo,

    da hast du erstmal die Aufgabe einen upload zu realisieren. Da lauern die üblichen Tücken…

    Auf der DB-Seite sehe ich wie bei Bilddateien zwei Varianten:

    1. Speichern im Dateisystem, in der DB bloß den Speicherort eintragen.
    2. PDF als blob in die DB laden.

    Gruß
    Kalk

    1. Hallo Tabellenkalk,

      für Blobs ist die Kenntnis von send_long_data hilfreich.

      Rolf

      --
      sumpsi - posui - obstruxi
    2. Hallo Kalk,

      da hast du erstmal die Aufgabe einen upload zu realisieren.

      Das kenne ich vom Kalender, mit URL-Eintrag in der DB.

      Beim Löschen von Datensätzen können dann Dateien vergessen werden und als ewige Leichen die Datensicherung belasten.

      Ist jetzt anderes Thema, aber wenn wir schon dabei sind: Wie finde ich die Leichen, also die Dateien, die nirgendwo einen URL-Eintrag haben? Vermutlich die Dateinamen in den Verzeichnissen lesen und jeden Dateinamen einzeln mit SELECT URL abfragen? Könnte Laufzeitprobleme geben und ich weiß nicht, wie man da wieder aufsetzen kann.

      Gruß, Linuchs

      1. Hallo

        Ist jetzt anderes Thema, aber wenn wir schon dabei sind: Wie finde ich die Leichen, also die Dateien, die nirgendwo einen URL-Eintrag haben? Vermutlich die Dateinamen in den Verzeichnissen lesen und jeden Dateinamen einzeln mit SELECT URL abfragen? Könnte Laufzeitprobleme geben und ich weiß nicht, wie man da wieder aufsetzen kann.

        Ich würde zwei strukturell identisch aufgebaute Array bilden und diese mit array_diff vergleichen. Strukturell identisch heißt hier, dass beide flach sein müssen [1] und in beiden entweder nur die Dateinamen oder nur die vollständigen Pfade drin stehen müssen (wenn du denn Dateinamen oder Pfade vergleichen willst).

        Tschö, Auge

        --
        200 ist das neue 35.

        1. siehe Manual-Seite, Abschnitt Anmerkungen ↩︎

      2. Ist jetzt anderes Thema, aber wenn wir schon dabei sind: Wie finde ich die Leichen, also die Dateien, die nirgendwo einen URL-Eintrag haben? Vermutlich die Dateinamen in den Verzeichnissen lesen und jeden Dateinamen einzeln mit SELECT URL abfragen? Könnte Laufzeitprobleme geben und ich weiß nicht, wie man da wieder aufsetzen kann.

        Über wie viele Dateien sprechen wir denn? Ich habe solche Nummern schon mit wirklich großen Datenmengen gemacht. Klar, kann schon was dauern. But so what?

        Oder meinst Du Web-Timeouts? Ja, optimalerweise macht man so etwas nicht per HTTP…

        1. Über wie viele Dateien sprechen wir denn?

          ca. 2500

          1. Über wie viele Dateien sprechen wir denn?

            ca. 2500

            Das ist nichts. Opendir sammlen + Query und etwaigem Unlink: ausem Bauch geschätzt 30 Sekunden. Das ist schon sehr hoch gegriffen.

          2. Hallo Linuchs,

            naja, das ist ja nun gar nichts.

            1. Dateinamen aus der Tabelle in ein Array lesen. Einen Mengenselect machen, das geht fix. Ein SELECT pro File dauert natürlich lange.
            2. Array flippen, damit die Namen zu Keys werden
            3. Ins Verzeichnis wechseln, wo die Dateien sind (damit glob keíne Pfade enthält) (altes Verzeichnis vorher sichern...)
            4. Mit glob() das Verzeichnis in ein Array saugen
            5. Jeden Eintrag mit array_key_exists auf Existenz prüfen. Wenn ja: mit unset aus dem Array entfernen. Wenn nein: mit unlink aus dem Ordner entfernen
            6. Ins alte Verzeichnis zurück
            7. Verbleibende Array-Einträge als fehlende Files reklamieren

            Das sollte - wenn nicht zu viele Unterschiede da sind, in 0.5 bis 5 Sekunden durch sein.

            Rolf

            --
            sumpsi - posui - obstruxi
  2. Hi there,

    Macht es Sinn, PDF-Dokumente im Datensatz zu speichern? Habe das noch nie gemacht.

    Durchaus.

    Wie funktioniert das und welche Vor- und Nachteile hat das?

    Du speicherst den Sourcecode des PDFs als BLOB in der Datenbank. (Wenn Du Dir ganz sicher bist, daß das PDF 16Mbyte nicht überschreitet, dann kannst Du das auch als MediumBlob speichern)

    Der Vorteil ist, daß das unter Umständen performanter ist und Du keine Leichen im Dateisystem hast (wobei sich in Bezug auf Performance erst ab einigen zig-tausend Dateien ein Unterschied bemerkbar machen dürfte, ich hab das einmal mit Fotos, nicht mit PDFs gemacht und konnte auf einem Webserver bei ca. 150.000 Fotos keinen nenneswerten Unterschied im Zugriff messen), der Nachteil, daß Deine PDFs nach einem Datenbankcrash alle weg sind, wenn Du keine Sicherungskopien davon hast. Ausserdem mußt die PDFs dann auch immer erst erzeugen, einfach irgendwo hinkopieren wenn man eines schnell einmal braucht ist dann nicht so einfach möglich.

    Wie auch immer, das oben Erwähnte berücksichtigend spricht im Prinzip nichts dagegen.

    1. Der Vorteil ist, daß das unter Umständen performanter ist

      Da möchte ich Zweifel anmelden. Wenn ein statisches File im Dateisystem liegt, dann kann der Webserver seine Stärken ausspielen, bestimmt besser als jedes selbst geschriebene Script.

      und Du keine Leichen im Dateisystem hast

      Ja. Der einzige Vorteil, der mir gerade einfällt.

      1. Hi there,

        Der Vorteil ist, daß das unter Umständen performanter ist

        Da möchte ich Zweifel anmelden. Wenn ein statisches File im Dateisystem liegt, dann kann der Webserver seine Stärken ausspielen, bestimmt besser als jedes selbst geschriebene Script.

        Naja, wie gesagt, das hängt von der Menge ab. Ein paar hundertausend Files in einem Verzeichnis lassen den besten Server leicht in die Knie gehen...

  3. Macht es Sinn, PDF-Dokumente im Datensatz zu speichern? Habe das noch nie gemacht.

    M.E. nicht, auch wenn das hier einige anders sehen.

    Wie funktioniert das und welche Vor- und Nachteile hat das?

    Vorteil, wie schon erwähnt: die Integrität. Datensatz gelöscht = PDF gelöscht.

    Nachteile? m.E. ne ganze Menge. Spontan fällt mir ein: Deine Datenbank wird fett, unfassbar fetter als ohne solche Binärblobs... Wenn ein Datenbank bislang 1MB groß war hast Du den in wenigen Sekunden erstellt und auch wieder zurückgespielt. Mit den Blobs nicht mehr.

    Dann wäre da z.B. noch die Performance, da antworte ich gleich auf klawischnigg…