Frank Dell: Verzeichnissystem: Wie organisieren? (PHP+MySql)

Hallo Leute,

Ich zerbrösel mir seit einigen Tagen den Kopf, komme aber nicht so recht
weiter. Ich schildere einfach mal das Problem:

Also, ich soll eine Grafik-Datenbank programmieren (PHP + MySql). Die im
Verzeichnissystem zu hinterlegenden Grafiken sind die Originaldatei (z.B.
Photoshop / *.psd oder Quark) und ein Vorschaubild (*.jpg).

Der Gesamtumfang der Datensätze beläuft sich aktuell auf ca. 5.000 (Also
5.000 "Originalgrafiken/*.psd plus 5.000 Vorschaubilder/*.jpg)  wird sich
aber weiter erhöhen. Eine einzelne Originaldatei kann u.U. auch schon mal
2-3 MB "schwer" sein.

Wie organisiere ich jetzt das Verzeichnissystem. Eigentlich habe ich vor,
alle Grafikdateien in ein einziges Verzeichnis zu packen. Dabei ist
sichergestellt, daß alle  Dateien eine eindeutige Bezeichnung habe
(Dateibezeichnung beinhaltet Datensatz-ID). Ich bin jetzt darauf hingewiesen
worden, daß es besser wäre, ein Verzeichnissystem auf 2-3 Ebenen für die
Originalgrafiken einzurichten. Eine nachvollziehbare Erklärung hat man mir
bisher aber nicht liefern können.

Der WebServer ist ein Apache und die Hardwareausstattung allerfeinst.
Ressourcenprobleme dürften "eigentlich" nicht auftauchen.

Wie ist Eure Meinung dazu.

Viele Grüße

Frank Dell

  1. Hallo,

    Wie organisiere ich jetzt das Verzeichnissystem. Eigentlich habe ich vor,
    alle Grafikdateien in ein einziges Verzeichnis zu packen. Dabei ist
    sichergestellt, daß alle  Dateien eine eindeutige Bezeichnung habe
    (Dateibezeichnung beinhaltet Datensatz-ID). Ich bin jetzt darauf hingewiesen
    worden, daß es besser wäre, ein Verzeichnissystem auf 2-3 Ebenen für die
    Originalgrafiken einzurichten. Eine nachvollziehbare Erklärung hat man mir
    bisher aber nicht liefern können.

    Ich würde die Dateien auf einzelne Verzeichnisse aufteilen, sagen wir mal in 1000er-Schritten. Außerdem würde ich Original und Vorschaubild in zwei eigenen Verzeichnisstrukturen ablegen.

    Zur Begründung der Aufteilung: Verzeichnisse sind bei praktisch allen Betriebssystemen nichts anderes als spezielle Dateien, in denen die Dateinamen und deren Verwaltungsinformationen (Rechte, Änderungsdatum, Einsprungstelle für die eigentlichen Daten usw.) abgelegt sind. Je größer diese Datei wird, desto zeitintensiver wird es für das Betriebssystem, Informationen für eine bestimmte Datei zu finden. Selbst die für schnelle Dateisysteme bekannten Unix-Plattformen haben mit vielen Dateien in einem Verzeichnis so ihre Probleme. Dabei ist die Größe der einzelnen Dateien (also der Grafiken) nicht von Belang.

    Die Aufteilung von Original und Vorschau würde ich allein der Übersichtlichkeit wegen schon machen, außerdem bleibt DIr dann auch nicht der Weg versperrt, beispielsweise untershciedliche Rechte für beide Kategorien zu vergeben, sollte es einmal notwendig sein.

    Grüße
      Klaus

  2. Hallo Frank,

    Der WebServer ist ein Apache und die Hardwareausstattung allerfeinst.
    Ressourcenprobleme dürften "eigentlich" nicht auftauchen.

    Trotzdem ist das wohl der Grund, warum Dir empfohlen wurde, nicht alles in ein Verzeichnis zu packen, viele Filesysteme (z.B. ext2) werden sehr langsam, wenn eine große Anzahl Dateien (>10.000) in einem Verzeichnis liegen, weil für viele Operationen erstmal der Inhalt des Verzeichnisses eingelesen werden muß, und die Filesysteme sind dann einfach nicht dafür optimiert, daß da mehrere tausend Dateien drinstehen. (Wenn Du dagegen z.B. ReiserFS hast, sollte es keine Probleme geben).

    Viele Grüße
    Stephan

  3. Du solltest die Daten auf jeden Fall in mehreren Verzeichnissen organisieren.

    Vernünftig wäre:

    Unterteilung in Vorschau und Original
    Und dann immer nur maximal 1000 Bilder in einen Ordner.

    bilder/vorschau/jahr-monat/tausender/nummer.jpg
    bilder/original/jahr-monat/tausender/nummer.jpg

    Bei dieser simplen Verteilung hast du keine Probleme bis hin zu
    5Millionen Bilder je Monat (solte reichen).

    Die Eindeutigkeit ist trivial erfüllt jedes Bild erhält als Namen
    einen String den du aus dem Jahr und Monat seiner Einfügung in dein System sowie einer laufenden Numer erzeugst.

    Beispiele:

    Bild Nummer 1

    bilder/vorschau/2002-08/0/1.jpg
    bilder/original/2002-08/0/1.jpg

    Bild Nummer 999

    bilder/vorschau/2002-08/0/999.jpg
    bilder/original/2002-08/0/999.jpg

    Bild Nummer 1000

    bilder/vorschau/2002-08/1/0.jpg
    bilder/original/2002-08/1/0.jpg

    Bild Nummer 13479 nächstes Jahr im Juni

    bilder/vorschau/2003-06/13/479.jpg
    bilder/original/2003-06/13/479.jpg

    Warum die Verteilung auf Ordner.
    Ein Ordner ist nur eine Datei je mehr drin steht je länger braucht das OS für die Verwaltung (bei fast allen Filesystemen).

    Zusätzlich viele shell tools haben Grenzen ein simples
    rm * in der bash wird scheitern wenn du zB >20000 files hast auf die * passt.

    mfg
    FH

    1. Hallo,

      bilder/vorschau/jahr-monat/tausender/nummer.jpg

      Warum sollte das Datum mit in die Verzeichnisstruktur?

      Da die ID ausreicht, um ein Bild eindeutig zu identifizieren, sollte IMHO im Pfad nicht noch zusätzliche Meta-Informationen mit eingebaut werden, wodurch sich die Ermittlung des richtigen Dateinamenes unnötigerweise verkompliziert.

      Grüße
        Klaus

      1. Hallo,

        bilder/vorschau/jahr-monat/tausender/nummer.jpg

        Warum sollte das Datum mit in die Verzeichnisstruktur?

        Nur für uns Menschen.

        Es ist praktisch Daten die nach und nach Anfallen irgendwie mit ihrem Entstehungsdatum zu verbinden. Zudem ist ein Datum etwas das nie wieder kommt.

        Wie oft hast du schon die Frage gelesen wie man eine brauchbare SID generiert?

        Da die ID ausreicht, um ein Bild eindeutig zu identifizieren, sollte IMHO im Pfad nicht noch zusätzliche Meta-Informationen mit eingebaut werden, wodurch sich die Ermittlung des richtigen Dateinamenes unnötigerweise verkompliziert.

        Der muss nicht ermittelt werden er ist in der db bekannt.

        Ohne die SQL db Anbindung hätte ich es nicht empfohlen,
        so nuzt es.

        Ohne db also nur um Daten zu verteilen kann man natürlich rein die Zahl benutzen.

        mfg
        FH

        Grüße
          Klaus

        1. Hallo,

          Warum sollte das Datum mit in die Verzeichnisstruktur?
          Nur für uns Menschen.

          Ja, und warum?
          Was birgt mir das Wissen um ein, willkürliches, Datum, wenn ich einfach nur ein Bild sehen will?
          Woher weißt Du, daß ein Datum eine für das Vorhaben des OP, oder für die Benutzer, relevante Information ist?
          Und wie oft überprüfst Du beispielsweise das Änderungsdatum einer beliebigen Webseite, wenn Du sie Dir ansiehst? [1]

          Es ist praktisch Daten die nach und nach Anfallen irgendwie mit ihrem Entstehungsdatum zu verbinden. Zudem ist ein Datum etwas das nie wieder kommt.

          Jahr und Monat ist eine Information die ziemlich oft vorkommen kann, je nach Feinheit der Auflösung, bzw. Frequenz der Bildergenerierung. Somit kann man nicht von einer Eindeutigkeit sprechen.

          Und noch etwas, jedes vernünftige Betriebssystem speichert für eine Datei mindestens drei Daten, das Erstellungsdatum, das Modifikationsdatum, und das Datum des letzten Zugriffs. Die einzige Voraussetzung, auf diese Daten zuzugreifen, ist deren Namen zu wissen. Eine fortlaufende ID, wie sie lt. OP gegeben ist, reicht für dieses Vorhaben völlig.

          Wie oft hast du schon die Frage gelesen wie man eine brauchbare SID generiert?

          Was hat das eine mit dem anderen zu tun?

          Da die ID ausreicht, um ein Bild eindeutig zu identifizieren, sollte IMHO im Pfad nicht noch zusätzliche Meta-Informationen mit eingebaut werden, wodurch sich die Ermittlung des richtigen Dateinamenes unnötigerweise verkompliziert.

          Der muss nicht ermittelt werden er ist in der db bekannt.

          Was allerdings einen Datenbankzugriff erfordert, mit all seinen Konsequenzen.
          Angenommen, einem Script wird nur die gewünschte ID bekannt gegeben, so kann nicht einfach aufgrund der ID der Dateiname ermittelt werden, sondern es muß zusätzlich noch die Datenbank abgefragt werden, um einen Datumswert abzufragen und diesen in ein passendes Format zu konvertieren. Erst dann kann der Dateipfad erzeugt werden.
          Ziemlich viel Aufwand für, meines Erachtens, wenig Nutzen, findest Du nicht?

          Grüße
            Klaus

          [1] jetzt einmal die Forumshauptdatei ausgenommen, wo IMHO der Ladezeitpunkt wirklich relevant ist.

  4. Hallo Leute,

    vielen Dank für die Antworten. Ich habe paralell in verschiedenenen Foren
    nachgefragt und überall eine Empfehlung "pro detailliertes
    Verzeichnissystem" erhalten. Ich werde mich also an diese (Eure)
    Empfehlungen halten. Danke nochmals.

    Viele Grüße

    Frank Dell