Eddie: Datenbankstruktur zum Aufbau eines Baums

Hallo allerseits,

ich moechte einen Baum ablegen, bspw. eine Gliederung in Regionen, also:

Deutschland
|-Bayern
| |-Würzburg
| |-...
|-Baden-Wuerttemberg
...
Schweiz

Und ich moechte all diese Orte (also auch Laender) in einer Tabelle verwalten.

Das heisst, ich habe prinzipiell eine 1:n-Zuordnung zwischen den einzelnen Örtlichkeiten:
Jede Stadt gehoert zu genau einer Region, während eine Region beliebig viele Staedte habe kann (aber zu genau einem Land gehoert).

Soweit schoen und gut, aber was ist mit den Laendern? Wozu gehoeren die? Zu einem neu zu definierenden Objekt "Wurzel"? Und wozu gehoert das dann? Also haut meine 1:n-Verknüpfung nicht hin, oder?

Also, wie mache ich das am besten? Oder ist mein Ansatz schon falsch?

Danke für eure Hilfe,
Eddie

--
Old men and far travelers may lie with authority.
  1. Soweit schoen und gut, aber was ist mit den Laendern? Wozu gehoeren die? Zu einem neu zu definierenden Objekt "Wurzel"? Und wozu gehoert das dann? Also haut meine 1:n-Verknüpfung nicht hin, oder?

    Aaalso. Die Länder gehören logischerweise zu Kontinenten und Kontinente gehören zur Erde und die Erde zum Universum.

    Entweder du machst mehrere tabellen mit jeweiligen fremdsschlüsseln oder du verwendest eine Baumstruktur.

    Bei dieser einfachen Baumstruktur empfiehlt sich die einfach methode, des "parent" prinzips:

    id land          parent
    1 | europa      | NULL
    2 | deutschland | 1
    3 | bayern      | 2
    4 | münchen     | 3

    ..uns so weiter

    es gibt auch noch die methode des nested set - die allerdings nur unter best. voraussetzungen sinnvoll ist.

    1. Hi,

      würde ich ähnlich sehen.
      Eine Referenztabelle sollte es aber dann schon sein.

      Eine Tabelle, in der wirklich alles namentlich verwaltet wird, aber auch eine Referenztabelle.

      Tabelle allenamen

      ID 1 NAME Europa
      ID 2 NAME Deutschland
      ID 3 NAME Asien
      ID 4 NAME Bayern
      ID 5 NAME München

      Referenztabelle

      ID 1 REF_ID 5  PARENT_ID 4
      ID 2 REF_ID 4  PARENT_ID 2
      ID 3 REF_ID 2  PARENT_ID 1

      Vorteil: sehr leicht zu pflegen, zu erweitern und zu ändern; sollte man feststellen, das Bayern ab morgen wieder offiziell Königreich Bayern heißt, muss man das nur an einer Stelle ändern, nicht bei jeder (königlich) bayrischen Stadt, die als Eintrag in der DB hinterlegt ist.

      MfG

      Dark Sider

      1. Hallo Dark Sider,
        ich bin mir nicht sicher, ob ich das richtig verstanden habe.

        Eine Referenztabelle sollte es aber dann schon sein.

        Das brauche ich aber doch eigentlich nur bei n:m-Verknuepfungen? Die habe ich ja aber hier nicht: jede Stadt gehoert zu genau einem Bundesland, während jedes Bundesland beliebig viele (0-n) Staedte hat, also 1:m. Oder?
        Ich habe keine solchen Scherze geplant wie

        • Baden-Wuerttemberg/Wuerzburg (liegt zwar sehr nah an der Grenze)
        • Bayern/Wuerzburg (gehoert aber zu Bayern)
          auch wenn das benutzerfreundlicher waere.

        Vorteil: sehr leicht zu pflegen, zu erweitern und zu ändern; sollte man feststellen, das Bayern ab morgen wieder offiziell Königreich Bayern heißt, muss man das nur an einer Stelle ändern, nicht bei jeder (königlich) bayrischen Stadt, die als Eintrag in der DB hinterlegt ist.

        Aber wie unterscheidet sich das von der Realisierung ohne Referenztabelle? In der Tabelle "Regionen" gibt es nur einen Eintrag "Bayern", der mit entsprechenden Staedten in derselben Tabelle verknuepft ist. Langt doch eine Aenderung, oder?

        Viele Gruesse, Eddie

        --
        Old men and far travelers may lie with authority.
    2. Hallo schildi,

      Bei dieser einfachen Baumstruktur empfiehlt sich die einfach methode, des "parent" prinzips:

      id land          parent
      1 | europa      | NULL
      2 | deutschland | 1
      3 | bayern      | 2
      4 | münchen     | 3

      Ok, es ist also kein Problem, in einer Fremdschlüssel-Spalte NULL zu erlauben?
      Achja, noch die Frage: NULL oder ''? Bisher habe ich, wenn irgendwas nicht definiert ist immer was Leeres reingeschrieben. Kann ich NULL einfach setzen per:
      UPDATE ... SET email = NULL WHERE ...
      Wie gesagt, bisher habe ich
      UPDATE ... SET email = '' WHERE ...

      es gibt auch noch die methode des nested set - die allerdings nur unter best. voraussetzungen sinnvoll ist.

      Koenntest Du mir einen kurzen Hinweis geben, was ich darunter zu verstehen habe?

      Danke Dir,
      Eddie

      --
      Old men and far travelers may lie with authority.
    3. Hi,

      Aaalso. Die Länder gehören logischerweise zu Kontinenten und Kontinente gehören zur Erde und die Erde zum Universum.

      es gibt also in diesem Beispiel anscheinend die Entitaeten "Ort", "Land" und "Kontinent". Sollte relativ klar sein, dass keine neue Entitaeten hinzukommen bzw. aus dem System entfernt werden, dann kommt man traditionell mit drei Tabellen und den 1:n-Beziehungen "Kontinent-Land" und "Land-Ort".

      Entweder du machst mehrere tabellen mit jeweiligen fremdsschlüsseln oder du verwendest eine Baumstruktur.

      Sollten die einzelnen Entitaeten zum Zeitpunkt des initialen Datenbankdesigns noch gar nicht feststehen, aber die Gesamtstruktur als Baumstruktur schon, dann kommt man mit dem "Parent-Prinzip". Allerdings sind die Datenzugriffe auf so eine Struktur nicht besonders performant und einfach, und demzufolge ist die DB dann moeglicherweise in der Pflege etwas unfreundlich.

      Gruss,
      Ludger

      1. Hallo Ludger,

        es gibt also in diesem Beispiel anscheinend die Entitaeten "Ort", "Land" und "Kontinent". Sollte relativ klar sein, dass keine neue Entitaeten hinzukommen bzw. aus dem System entfernt werden, dann kommt man traditionell mit drei Tabellen und den 1:n-Beziehungen "Kontinent-Land" und "Land-Ort".

        Entweder du machst mehrere tabellen mit jeweiligen fremdsschlüsseln oder du verwendest eine Baumstruktur.

        Was spricht denn dagegen, nur eine Entitaet ("Herkunft") zu haben, mit Kontinent, Land, Stadt? Grosse Unterschiede gibts da eigentlich nicht, sind alles Ortsangaben. Per 1:n habe ich dann meine Baumstruktur. Kontinente und Laender sind fix, Staedte koennen neu dazu kommen und werden einem Land zugeteilt.
        Ist es schlecht, das so zu machen?

        Eddie

        --
        Old men and far travelers may lie with authority.
        1. Hi,

          Was spricht denn dagegen, nur eine Entitaet ("Herkunft") zu haben, mit Kontinent, Land, Stadt? Grosse Unterschiede gibts da eigentlich nicht, sind alles Ortsangaben. Per 1:n habe ich dann meine Baumstruktur. Kontinente und Laender sind fix, Staedte koennen neu dazu kommen und werden einem Land zugeteilt.
          Ist es schlecht, das so zu machen?

          ja, Du handelst vermutlich gegen das Konzept der RDBMSe. (Wie stelltst Du Dir zudem den Datenzugriff bei drei Tabellen und bei einer Tabelle ("Parent-Prinzip") vor?)

          Gruss,
          Ludger

          1. Hallo Ludger,

            (Wie stelltst Du Dir zudem den Datenzugriff bei drei Tabellen und bei einer Tabelle ("Parent-Prinzip") vor?)

            Bei einer Tabelle stelle ich's mir so vor:
             __________
            |          |
            | Herkunft |
            |__________|
             0:1|  |0:m
                |  |
                |__|

            Links: Die Wurzel (Welt) ist nichts zugeordnet (0), Würzburg ist Bayern zugeordnet (1).
            Rechts: Der Wurzel (Welt) sind ~230 Länder zugeordnet (m), Würzburg ist nichts zugeordnet (0).

            Das sind einfach nur Kategorien, ich kann doch nicht beim Hinzufuegen einer neuen Kategoriestufe jedesmal eine neue Tabelle erstellen!
            Dann haette ich naemlich:
            .../Berlin/Kreuzberg (aus der Tabelle Ortsteile)
            .../Wuerzburg/Kist (aus der Tabelle Vororte)
            und braeuchte dafuer zwei statt einer neuen Tabelle.

            Dann nenn ich das doch lieber "Herkunfts-Kategorien" und lege ggf. Konsistenzbedingungen fest, zusammen mit einem ENUM-Feld "typ". Staedte gehoeren dann eben zu Laendern und nicht zur Welt.
            Ohne Konsistenzbedingungen haette ich auch die Freiheit Zweige umzuhaengen, z.B. wenn wir mal Bundeslaender mit reinnehmen:
            .../Deutschland/Muenchen
            statt
            .../Deutschland/Bayern/Muenchen
            Einfach durch den entsprechenden Fremdschluessel aendern, fertig.

            Auch eine Koexistenz beider Teilbaeume ist moeglich, indem ich die Relation von 1:m auf n:m (beide konditional) erweitere.

            =========

            Mit mehreren Tabellen geht das nicht so einfach, da muss ich naemlich solche Zuordnungen extra programmseitig implementieren. Nur mal fuer den Fall, dass der Baum mehr als 3 Ebenen hat, kann das doch ein rechter Aufwand werden. Oder hab ich da was falsch verstanden?

            Danke fuer Antwort,
            Eddie

            --
            Old men and far travelers may lie with authority.
            1. Hi,

              Bei einer Tabelle stelle ich's mir so vor:

              klar, wie das mit einer Tabelle geht, ja ist klar.

              Das sind einfach nur Kategorien, ich kann doch nicht beim Hinzufuegen einer neuen Kategoriestufe jedesmal eine neue Tabelle erstellen!

              Manchmal ja, manchmal nein. Wenn beim initialen Datenbankdesign weisst, welche Entitaeten relevant sind, dann wird in aller Regel erst einmal (;-) auch keine neue Datenbanktabelle hinzugefuegt.
              Wenn Du weisst, dass die Struktur eine "dynamische" Baumstruktur (ein Inhaltsverzeichnis eines Buchs von mir aus - oder ein Buch) ist, dann kannst Du das "Parent-Prinzip" anwenden. BTW - "XML-Datenhaltung" (objektorientierte DBMSe) bietet sich da vielleicht ebenfalls an.

              Mit mehreren Tabellen geht das nicht so einfach, da muss ich naemlich solche Zuordnungen extra programmseitig implementieren.

              Womit Du verloren haettest, oder?

              Nur mal fuer den Fall, dass der Baum mehr als 3 Ebenen hat, kann das doch ein rechter Aufwand werden. Oder hab ich da was falsch verstanden?

              Schon mal mit SQL beschaeftigt?   ;-)
              (Nur damit wir noch etwas in der Praxis bleiben (Datenzugriffe und so).)

              Gruss,
              Ludger

  2. Hallo Eddie,

    och menno Du oller DB-Fetischist ;) Hier mein Kontra:

    -/Welt                                    [Wurzell]
      |
      |-reiseberichte.php
      |
      |-/Kontinent                            [z. B. Europa]
         |
         |-/Name_des_Lands                    [z. B. Germany]
            |
            |-/Regionen                       [z. B. ein Bundesland]
               |
               |-/Stadt                       [oder auch Landkreis]
                  |
                  |-/Bilder                   [alle Bilder zum Thema]
                  |
                  `-/DataDir                  [Ablage von Texten]

    (Jedem Ornder [egal welcher Katekorie] kannst Du Ordner für Bilder und Bezugsdaten einhängen.)

    Warum so? Jeder der schreiben kann wird nun in Deinem Web auch mittels Adressierung navigieren können. Er muß nicht erst eine große Suche mittels einem Formulas veranstalten, sondern kann, wenn er das Prinzip geblickt hat, gleich sein Ziel eingeben.

    Beispiel: http://www.umdiewelt.de/Reiseberichte/Asien/Japan/Kanto/

    Ein weiterer Vorteil ist die mit PHP schnell realisierbare Abstraktion der Gliederung von Inhalten:

    function verz($v)
       {
       echo '<dl>';
       $dat=opendir($v);
       while($f=readdir($dat))
          {
          if(is_dir($v.$f) && $f!="." && $f!="..")
             {
             echo '<dd><a href="'.$v.'/'.$f.'/">'.$f.'</a> ';
             verz($v.'/'.$f);
             echo '</dd>';
             }
          }
       closedir($dat);
       echo '</dl>';
       }

    Dieses Script ist universell auf jedem (vermeintlichen [aber das kommt später]) Dokument einsetzbar und kann dazu genutz werden, dem User alle weiterführenden Themen unterhalb seiner jetzigen Position im Web anzuzeigen. Dies geht genauso auch mit einer Modifizierung der Funktion, wenn man zusätzlich bis zum Wurzelverzeichnis den direkten Pfad abbilden lassen möchte.

    Zu dem (für meine Begriffe) nützlichen Punkt, der die Userintuition berüksichtigt, sprechen ach ganz andere Punkte eine deutliche Sprache: http://www.at-web.de/google/g-deutsch.htm Lies es Dir bitte sorgfältig durch, was ein Strukuriertes Web alles bewirken kann. Insbesondere interessiert Dich dabei ein Abzuleitendes Schema folgender Art:

    http://www.umdiewelt.de/reiseberichte/kontinent/land/stadt/ oder ander geschriben
    http://www.umdiewelt.de/Keyword1/Keyword2/Keyword3/Keyword4/

    Das hört sich jetzt alles nach einem riesigem Wasserkopf von unnützen Hunderten von index.php an, die den Webspace ewig Platz rauben. Da gibt es aber Möglichkeiten, wenn der Server apache ist und die Konfiguration für AcceptPhatInfo nicht Off ist (Voreinstellung ist On), hast Du eine gefüllte Variable $_SERVER["PATH_INFO"], die Du auswerten lassen kannst.

    http://www.umdiewelt.de/reiseberichte.php/kontinent/land/stadt/
    mit echo $_SERVER["PATH_INFO"]; erhälst Du "/kontinent/land/stadt/".

    Mit einem halbwegs durchdachtem LayoutIncludeKonzept kannst Du mit dieser EINEN reiseberichte.php in einem webzugängigen Verzeichnis alle Daten und Dateien heranorganisieren (echo '<img src="'.$_SERVER["PATH_INFO"].'bilder/kueste.png">';) aus einem weiteren beziehst Du Standardlayouts für jedes Land vielleicht ein anderes.

    Z. B.:

    $p=explode('/',$_SERVER["PATH_INFO"]);
    if(isset($p[2]))
       include('/layout/'.$p[2].'/head.inc');
    else
       include('/layout/main/head.inc');
    $text=file($_SERVER["PATH_INFO"].'/datadir/data.txt');
    mach_was($text);
    if(isset($p[2]))
       include('/layout/'.$p[2].'/foo.inc');
    else
       include('/layout/main/foo.inc');

    Beispielaufgabe eines Webadmins: Es erreicht Dich zu später Stunde eine Mail -dieses und jenes ist völlig falsch- . Wie die lieben meckernden Dummies nun mal sind, ist ihnen auch nicht klar, das ein Link immer hilfreich ist. Aus dem Text ergibt sich eine klare Struktur (kontinent/land/region/); aber Du hast Dich ja für eine Datenbank entschieden und kramst statt per FTP den schnell den Text zu editieren, in den Tabellen rum.

    Das Thema DB hatten wir doch schon ;) Bitte sage mir warum es eine DB sein muß!

    Gruß aus Berlin!
    eddi

    --
    Manchmal trifft es einen doch ganz unverhofft t86591:
    > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
    Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
    1. @eddi

      das ist mal ein konstruktiver interressanter vorschlag!

      einen beitrag in dieser art hätte ich für meinen aus den rudern gelaufenen thread http://forum.de.selfhtml.org/?t=87719&m=521851
      auch gewünscht.

      sehr interressantes vorgehen! diese denkweise könnte man u.U in einem cms auch verwerten.

    2. @xarax

      "Bitte sage mir warum es eine DB sein muß!"

      nuja...

      -> redundanz zum beispiel

      -> gleichzeitige datenzugriffe!

      1. Hallo schildi,

        "Bitte sage mir warum es eine DB sein muß!"

        nuja...

        -> redundanz zum beispiel

        Da gebe ich Dir völlig recht! Der Römer sprach dies aus, wenn er Überfluß meinte. Ja - Datenbanken sind für simples Servieren überflüssig ;)

        -> gleichzeitige datenzugriffe!

        Letzlich hatte ich Toms Server mal unter Beschuß genommen und eine Dokument über 300/sec auslesen lassen. Mit anderen Worten, es kann ruhig nacheinander geschehen. Ich sehe nur nicht den Unterschied, zu einer normalen Festplatte. Einen Datenträger braucht ein Server zum servieren - damit das geornet abgeht, auch noch ein Dateisystem. Soweit komme ich mit. Bitte wofür brauche ich jetzt eine Datenbank, die ich zusätzlich in diesen Datenbezugsweg dazwischen zwenge, die Recoursen frißt und nicht grade leicht zu bedienen ist.

        Außerdem muß ich nachfragen, ob eine Datei immer nur einmal gelesen werden kann?

        Gruß aus Berlin!
        eddi

        --
        Manchmal trifft es einen doch ganz unverhofft t86591:
        > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
        Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
    3. Hallo eddi,

      -/Welt                                    [Wurzell]
        |
        |-reiseberichte.php
        |
        |-/Kontinent                            [z. B. Europa]
           |
           |-/Name_des_Lands                    [z. B. Germany]

      Was denn nun enlisch oder deutsch?

      Das Thema DB hatten wir doch schon ;) Bitte sage mir warum es eine DB sein muß!

      1. Mehrsprachigkeit http://forum.de.selfhtml.org/archiv/2004/8/87404/#m519543
      2. Vermeidung von Datenredundanzen (Das "Wandern" oder den "Wintersport", in meinem Beispiel im obigen Link, kann ich jedem Bundesland, egal in welchem Staat, zuordnen.
      3. Portierbarkeit (Deine Version "hardcodiert" die Pfadzugriffe in _einer_ Programmiersprache. Die DB codiert die Zusammenhänge in ihrerm strukturellen Aufbau, in welchem mit SQL abgefragt wird. Das ist leichter umzustellen (Daten von DB zu anderer DB, umstellen der Scripte, die per SQL abfragen, von Sprache zu anderer Sprache, wobei fast immer "Standardscripte" verwendet werden) als das Umstellen Deiner Scripte von PHP nach JSP (z.B.), was häufig Änderungen bis hinunter in die Programmablauflogik nach sich zieht.
      4. Alle anderen Vorteile, die Du angegeben hast, sind mit einer DB auch realisierbar, einschließlich der sprechenden Pfadangaben (Apache mod rewrite http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteRule).
      5. Der angebliche Nachteil bei der Suche nach Textteilen ist bei einem durchdachten Datenbankdesign nicht vorhanden. Mit einem kleinen Suchscript wird die DB sogar _leichter_ zu pflegen sein, als Dateien in einer Verzeichnisstruktur.

      viele Grüße

      Axel

      1. Hallo Axel,

        Was denn nun enlisch oder deutsch?

        Auch eine Art eine Kommunikation zu beginnen...

        Das Thema DB hatten wir doch schon ;) Bitte sage mir warum es eine DB sein muß!

        1. Mehrsprachigkeit

        Und es ist nicht möglich in einfachen Textdateien einen deutschen und einen Englischen teil einzustellen? Man lern hier doch nie aus. Gut wenn das nicht geht nehme ich doch gleich zwei oder sogar mehrere Dateien (inc.de / inc.en / inc.es / inc.fr / inc.nl / ...), hole mir bsw. den Accept-language und werde genauso glücklich.

        1. Vermeidung von Datenredundanzen (Das "Wandern" oder den "Wintersport", in meinem Beispiel im obigen Link, kann ich jedem Bundesland, egal in welchem Staat, zuordnen.

        Ich kann jedem Kontinent, jedem Land, jeder Stadt sogar ein eigenes verzeichnis zuweisen wo alle Daten abgelegt sind und nach simpelstem Schema F für label handling routine PHP zugängig machen kann.

        Das geht natürlich nicht mit einer Textdatei, wo ich nicht die Möglichkeit habe mir bereich zu definieren, die standardmäßige segmentiert sind:

        Sandardthema 1

        text text text text text text text text
             text text text text text text text text
             text text text text text text text text

        Sandardthema 2

        text text text text text text text text
             text text text text text text text text
             text text text text text text text text
             text text text text text text text text

        Sandardthema 4

        text text text text text text text text
             text text text text text text text text
             text text text text text text text text
             text text text text text text text text
             text text text text text text text text
             text text text text text text text text

        Zusatz

        text text text text text text text text
             text text text text text text text text
             text text text text text text text text

        1. Portierbarkeit (Deine Version "hardcodiert" die Pfadzugriffe in _einer_ Programmiersprache. Die DB codiert die Zusammenhänge in ihrerm strukturellen Aufbau, in welchem mit SQL abgefragt wird. Das ist leichter umzustellen (Daten von DB zu anderer DB, umstellen der Scripte, die per SQL abfragen, von Sprache zu anderer Sprache, wobei fast immer "Standardscripte" verwendet werden) als das Umstellen Deiner Scripte von PHP nach JSP (z.B.), was häufig Änderungen bis hinunter in die Programmablauflogik nach sich zieht.

        Die gesamte Ornerstruktur ist mit einem einfachen Zipprogramm portierbar bis zum geht nicht mehr. Und es ist lediglich von PHP nicht von unterschiedlichen DB-Sprachen abhängig.

        Alles, was man also braucht, wäre apache und PHP. Das gibts nun bei Hostern in fast allen Variationen zu unterschiedlichsten Preisen; bis hin zum Mietserver.

        Ich weiß nicht, ob sich bei diesem Projekt überhaupt schon ein CMS lohn, grade weil Eddie das Web selbst aufgebaut hat. Wenn ich von PHP dabei rede, dann von nicht wesentlich mehr als einer Hand voll von Dateien.

        Ehrlich gesagt finde ich dieses Beispiel "PHP nach JSP" für ein privates Projekt (ich gehe hofentlich da recht in der Annahme) an den Haaren herbeigezogen.

        1. Alle anderen Vorteile, die Du angegeben hast, sind mit einer DB auch realisierbar, einschließlich der sprechenden Pfadangaben.

        Also schalte ich noch einen apache-Handler hinzu, nur um auf Biegen und Brechen das gleiche zu erzeugen? Das kann nicht Dein Ernst sein.

        1. Der angebliche Nachteil bei der Suche nach Textteilen ist bei einem durchdachten Datenbankdesign nicht vorhanden. Mit einem kleinen Suchscript wird die DB sogar _leichter_ zu pflegen sein, als Dateien in einer Verzeichnisstruktur.

        Das weiß ich nicht, war auch nicht mein erklärtes Ziel dort nun Suchroutienen von PHP in einer Verzeichnisstruktur neben einer DB gegenüberzustellen.

        Eine Datenbank arbeitet doch auch nur mit Dateien. Die Software meiner DB ist in meinem Beispiel einfach PHP und das Dateisystem. Bitte wo sind jetzt die tiefgründigen Vorteile einer anderen Datenbank?

        Gruß aus Berlin!
        eddi

        --
        Manchmal trifft es einen doch ganz unverhofft t86591:
        > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
        Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
        1. Hallo eddi,

          1. Mehrsprachigkeit

          Und es ist nicht möglich in einfachen Textdateien einen deutschen und einen Englischen teil einzustellen? Man lern hier doch nie aus.

          Doch. Allerdings musst Du dann die _ganze_ Datei öffnen, den Anfang der gewünschten Sprache suchen, den Text in der gewünschten Sprache bis zum Ende oder zum Anfang der nächsten Sprache auslesen und zur Verfügung stellen. In der Datenbank gibt es dafür ein Feld, welches genau angesprochen werden kann. Mein Beispiel aus http://forum.de.selfhtml.org/archiv/2004/8/87404/#m519543:
          SELECT EN FROM MenueUnterebene1 WHERE HEID = 1;
          gäbe:
          Thuringia
          Saxony
          Lower Saxony
          ...
          Bavaria

          Gut wenn das nicht geht nehme ich doch gleich zwei oder sogar mehrere Dateien (inc.de / inc.en / inc.es / inc.fr / inc.nl / ...),

          Das würde gehen. Allerdings bekommt man es, mit einer ausgeklügelten Datenbankstruktur hin, dass z.B. der Zusammenhang DE Sachsen = EN Saxony nur _einmal_ gespeichert werden muss. Gut, das bekommt man mit Textdateien auch hin. Aber die Programmroutinen, um diese Textdateien zu durchsuchen (Sortieren, Indizieren, Finden, Zurückgeben), würden dann quasi ein eigenes Datenbank-System ergeben. Warum der Aufwand, wenn es doch fertige Datenbank-Systeme gibt?

          hole mir bsw. den Accept-language und werde genauso glücklich.

          Das geht nun wieder nicht. Man lässt den Nutzer entscheiden, welche Sprache er sehen will, nicht den Browser ;-)).

          1. Vermeidung von Datenredundanzen (Das "Wandern" oder den "Wintersport", in meinem Beispiel im obigen Link, kann ich jedem Bundesland, egal in welchem Staat, zuordnen.

          Ich kann jedem Kontinent, jedem Land, jeder Stadt sogar ein eigenes verzeichnis zuweisen wo alle Daten abgelegt sind und nach simpelstem Schema F für label handling routine PHP zugängig machen kann.

          Ja, und eine Suchfunktion ochst dann quer durch alle Verzeichnisse und führt Zeichenkettenvergleiche durch. Wenn Du das einigermaßen nutzbar hinbekommen willst, dann programmierst Du irgendwann ein eigenes DBMS (siehe oben).

          Das geht natürlich nicht mit einer Textdatei, wo ich nicht die Möglichkeit habe mir bereich zu definieren, die standardmäßige segmentiert sind:

          Das geht, mit den Nachteilen von 1. Du musst die _ganze_ Datei öffnen, den Anfang des gewünschten Segments suchen, den Text des gewünschten Segments bis zum Ende oder zum Anfang des nächsten Segments auslesen und zur Verfügung stellen.

          1. Portierbarkeit (Deine Version "hardcodiert" die Pfadzugriffe in _einer_ Programmiersprache. Die DB codiert die Zusammenhänge in ihrerm strukturellen Aufbau, in welchem mit SQL abgefragt wird. Das ist leichter umzustellen (Daten von DB zu anderer DB, umstellen der Scripte, die per SQL abfragen, von Sprache zu anderer Sprache, wobei fast immer "Standardscripte" verwendet werden) als das Umstellen Deiner Scripte von PHP nach JSP (z.B.), was häufig Änderungen bis hinunter in die Programmablauflogik nach sich zieht.

          Die gesamte Ornerstruktur ist mit einem einfachen Zipprogramm portierbar bis zum geht nicht mehr. Und es ist lediglich von PHP nicht von unterschiedlichen DB-Sprachen abhängig.

          Wenn Du PHP voraussetzt, ist das so.

          1. Alle anderen Vorteile, die Du angegeben hast, sind mit einer DB auch realisierbar, einschließlich der sprechenden Pfadangaben.

          Also schalte ich noch einen apache-Handler hinzu, nur um auf Biegen und Brechen das gleiche zu erzeugen? Das kann nicht Dein Ernst sein.

          Das mit dem

          http://www.umdiewelt.de/reiseberichte/kontinent/land/stadt/
          und
          .htaccess:
          <Files reiseberichte>
            ForceType application/x-httpd-php
          </Files>
          und
          $_SERVER['PATH_INFO'] im File "reiseberichte"

          kannte ich bisher nocht nicht. Vielen Dank für die Info. Das ginge aber mit Datenbankzugriffen vom Script "reiseberichte" auch ;-))

          viele Grüße

          Axel

          1. Hallo Axel,

            Und es ist nicht möglich in einfachen Textdateien einen deutschen und einen Englischen teil einzustellen? Man lern hier doch nie aus.
            Doch. Allerdings musst Du dann die _ganze_ Datei öffnen,

            $dat=fopen('alle_sprachen.txt',r);
            $header=fgets($dat);

            echo $header;

            #Ausgabe:

            thema1~244|3468|87001|12690 thema2~541|3805|87222|12998 usw.

            #zu jedem Thema habe ich dann in vier Sprachen den Dateizeiger, brauche nur noch mit fseek zu positionieren.

            den Anfang der gewünschten Sprache suchen, den Text in der gewünschten Sprache bis zum Ende oder zum Anfang der nächsten Sprache auslesen und zur Verfügung stellen. In der Datenbank gibt es dafür ein Feld, welches genau angesprochen werden kann. Mein Beispiel aus http://forum.de.selfhtml.org/archiv/2004/8/87404/#m519543:

            Wo ist nun der funktionelle Nachteil in meinem Beilspiel (wo ist der Unterschied zum internen Verhalten der DB)?

            Das würde gehen. Allerdings bekommt man es, mit einer ausgeklügelten Datenbankstruktur hin, dass z.B. der Zusammenhang DE Sachsen = EN Saxony nur _einmal_ gespeichert werden muss. Gut, das bekommt man mit Textdateien auch hin. Aber die Programmroutinen, um diese Textdateien zu durchsuchen (Sortieren, Indizieren, Finden, Zurückgeben), würden dann quasi ein eigenes Datenbank-System ergeben. Warum der Aufwand, wenn es doch fertige Datenbank-Systeme gibt?

            Mein PHP Manual hat 4004 Dateien und ist 17,7 MB groß und ich durchsuche es mit einem PHPScript in unter einer sec. Dabei ist das nur meine olle kiste und nichts gegen einen Server.

            hole mir bsw. den Accept-language und werde genauso glücklich.
            Das geht nun wieder nicht. Man lässt den Nutzer entscheiden, welche Sprache er sehen will, nicht den Browser ;-)).

            Sei mal bitte so frei und nimm das "bsw." entweder wahr, oder stelle es Dir als Parable zu einer (idR) einmalig zu definierenden Variablen vor.

            Ja, und eine Suchfunktion ochst dann quer durch alle Verzeichnisse und führt Zeichenkettenvergleiche durch. Wenn Du das einigermaßen nutzbar hinbekommen willst, dann programmierst Du irgendwann ein eigenes DBMS (siehe oben).

            Derlei Möglichkeiten gäbe es nicht grade wenige. Man muß nur Wege finden Daten quasimodular halten zu können. Nur ab welcher Größe zu welcher Maschine und welcher Belastung dies einen Gedanken lohnt... Glücklicherweise ist mir noch kein solches System zusammengebrochen, sodaß ich es besser wüßte.

            Die gesamte Ornerstruktur ist mit einem einfachen Zipprogramm portierbar bis zum geht nicht mehr. Und es ist lediglich von PHP nicht von unterschiedlichen DB-Sprachen abhängig.
            Wenn Du PHP voraussetzt, ist das so.

            Na irgendwas ist doch immer, beide kommen wir im übrigen von einer Abhänigkeit nicht weg: Ich nicht von PHP. Du nicht von einer Datenbank.

            Also schalte ich noch einen apache-Handler hinzu, nur um auf Biegen und Brechen das gleiche zu erzeugen? Das kann nicht Dein Ernst sein.
            Das mit dem

            http://www.umdiewelt.de/reiseberichte/kontinent/land/stadt/
            und
            .htaccess:
            <Files reiseberichte>
              ForceType application/x-httpd-php
            </Files>
            und
            $_SERVER['PATH_INFO'] im File "reiseberichte"

            Offengestanden ist mir das auch nicht bewurßt; wenn es so gehten sollte, ist das ja noch besser, als "reisebereichte.php/verzeichnisse". Das werde ich mal ausprobieren.

            Gruß aus Berlin!
            eddi

            --
            Manchmal trifft es einen doch ganz unverhofft t86591:
            > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
            Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
    4. Hallo Eddi,

      nachdem das Thema ja schon reichlich behandelt wurde, komme ich auch endlich dazu, was zu schreiben!

      Den Baum brauche ich diesmal tatsaechlich nicht fuer www.umdiewelt.de. Aber was waere ich froh, wenn ich den umdiewelt.de-Laenderbaum besser geplant haette :-(
      Ich brauch's fuer einen Shop (um die Kategorieseiten aufzubauen), ist aber auch egal, lass uns einfach beim umdiewelt.de-Beispiel bleiben, ist naemlich im Prinzip dasselbe.

      Dein Vorschlag ist sicher bis zu einem gewissen Punkt die geeignete Loesung, aber - korrigier mich, wenn ich falsch liege - hier nicht.
      Stell Dir vor, ich habe mehrere Arten, Reiseberichte zu suchen:

      1. nach Laendern, Regionen, ...
      2. nach Fortbewegungsmitteln
      3. nach Art des Urlaubs (individuell+abenteuer, individuell+luxus, pauschal, ...)
      4. nach - schlag-mich-tot - Jahreszeiten

      Jede dieser Navigationsarten konstituiert einen Baum. Navigiere ich nach 1) bis zur Rubrik Thailand
      (http://www.umdiewelt.de/Asien/Suedostasien/Thailand/Reiseziel-th.html (das ist noch im ersten Baum!),
      wo ich gerade geschockt feststelle, dass es da 15 Berichte gibt (im Ernst, ich dachte, es waeren 10 oder 11), dann will ich filtern, und zwar mit 2):
      http://www.umdiewelt.de/Asien/Suedostasien/Thailand/Motorradreisen/Enduro/

      Navigiere ich zuerst mit 2) zu
      http://www.umdiewelt.de/Motorradreisen/Enduro (das ist noch im zweiten Baum!),
      dann will ich auch wieder filtern, und zwar nach 1) und lande je nach Implementierung auf
      a) http://www.umdiewelt.de/Asien/Suedostasien/Thailand/Motorradreisen/Enduro/ (weniger benutzerfreundlich, weil z.B. die Kruemelspur dann nicht mehr den tatsaechlichen Weg nachbilden kann)
      b) oder auf
      http://www.umdiewelt.de/Motorradreisen/Enduro/Asien/Suedostasien/Thailand/

      Die Baeume ueberlagern sich also. Stell Dir mal vor, ich nehme in einem Jahr die Rubrik "Kanutouren" dazu:

      • bei einer DB-Realisierung fuege ich einfach nur eine neue Zeile in die Fortbewegungsmittel-Tabelle.
      • bei einer Dateisystem-Realisierung muss ich entweder die Datei erweitern oder neue Verzeichnisse anlegen. Aufwand bei b): |Regionen| * |Fortbewegungsmittel| * |Urlaubsart| ..., bei a) natuerlich geringer.

      So, und jetzt zurueck zum eigentlichen Thema dieses Threads: ein Shop und LEIDER nicht mein Hobby, sondern Arbeit. Noch dazu sitzt mir ein Prof. im Nacken, der sich nicht nur fuer die Funktion interessiert, sondern auch fuer die Algorithmen (noch ein Argument fuer die DB, DAVON muss ich den Prof. nicht erst ueberzeugen:-).
      Der Shop soll eben mehrere Baeume vereinen koennen, wenn auch nur kleine. Aber da meine kommende Diplomarbeit vermutlich abartig "verbaumt" sein wird, kann ich so schonmal ueben.

      =======

      Bzgl. Google sind natuerlich sowohl die DB-, als auch die Dateisystemvariante geeignet. Cooler Tipp uebrigens auf der Seite, bisher habe ich immer per Hand ausgerechnet, wieviele Seiten www.umdiewelt.de hat, jetzt geht's einfacher (http://www.google.de/search?sourceid=navclient&hl=de&ie=UTF-8&q=site%3Aumdiewelt.de+%2Bde): 788. Geil.

      Gruesse, Eddie

      --
      Old men and far travelers may lie with authority.
      1. Hallo Eddie,

        vorneweg: Gegen Einen Kundenwunsch (sei er auch noch so
                  bescheiert) hat man Leider keine Chance. Ob
                  der Kunde dabei nun der eigene Prof. ist, oder
                  es sich um einen reellen Kunden handelt.

        Im weiteren werden Dir diese Ausführungen
                  parktisch direkt von keinem Nutzen sein. Aber
                  möglicherweise hast Du ein andermal Gelegen-
                  heit mein Dargeletes zu prüfen. :)

        res1 res2 res3 res4 res5 res6 res7 res8

        verzeichnis1   +    +         +    +              +     europa_12458/
        verzeichnis2        +                                   europa_12458/norwegen_2/
        verzeichnis3                                            europa_12458/norwegen_2/oslo_
        verzeichnis4   +    +                             +     europa_12458/niederlande_128/
        verzeichnis5        +                                   europa_12458/niederlande_128/amsterdam_2
        verzeichnis6   +                                        europa_12458/niederlande_128/delft_1
        verzeichnis7                  +    +                    europa_12458/niederlande_128/edam_45
        ...

        Ich hatte Dir kurz eine keine Funktion verz() zusammengezimmert, die nur nach (is_dir($v.$f) && $f!="." && $f!="..") abfragt. Dann übergebe der Funktion doch mal einen weiteren Parameter und erfrage nach explode('-',$f); in $array[1] einen/mehreren bestimmten Wert/-en ab.
        Poteziell eignet sich diese Methode um pro Byte über 60 Kategorien zu erzeugen. Das sollte ausreichen.

        Nun kommen wir an einem Punkt, wo man tatsächlich ein CMS-ähnliches System etablieren müßte, um diese Strukturiernung wardbar zu halten. Oderaber man liest von jeder beischreibung wie in <./?t=87724&m=522346> einen $header aus.

        http://www.umdiewelt.de/Motorradreisen/Enduro (das ist noch im zweiten Baum!),

        Praktischer Ansatz der /verzeichnis_{wert}{wert}{wert} -Methode ist für mich, ich bleibe in EINEM Baum. Man muß nicht erst Pseudostrukturen innerhalb einer DB einrichten, um einen Datenfeld (Inhalt von Wurzelverzeichnis) neu zu erschließen, sondern man nutz die Logischen strukturen aus.

        Die Baeume ueberlagern sich also. Stell Dir mal vor, ich nehme in einem Jahr die Rubrik "Kanutouren" dazu:

        • bei einer DB-Realisierung fuege ich einfach nur eine neue Zeile in die Fortbewegungsmittel-Tabelle.
        • bei einer Dateisystem-Realisierung muss ich entweder die Datei erweitern oder neue Verzeichnisse anlegen. Aufwand bei b): |Regionen| * |Fortbewegungsmittel| * |Urlaubsart| ..., bei a) natuerlich geringer.

        Das sei mir das allererste Argument für eine DB!

        Um auch das kurz darzulegen: Ich bin um jede Kontroverse dankbar und auch der Ansicht, Fundamentalismus ist in keinem geistigem Gebiet gut. Nur ich würde endlich gerne den Mehrwert von einer DB kennenlernen wollen, um auf meinem Server die Datenbank wieder anzuschmeißen. Jedes System wird mit der wachsenden Komplexität im Innern störanfälliger.

        Gruß aus Berlin!
        eddi

        --
        Manchmal trifft es einen doch ganz unverhofft t86591:
        > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
        Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)