Hans Dieter: Sinnvolle DB-Struktur

Hallo,

ich möchte die Navigationspunkte einer Navigation mit 3 Ebenen dynamisch generieren lassen.

Hierzu sollen die Punkte in einer MySql DB abgespeichert werden. Zudem sollen die Inhalte die zu den Punkten gehören auch in der DB gespeichert werden.

Weiterverarbeitet sollen die Daten mit PHP werden.

Welche DB Struktur macht Sinn? Beispiele?

Vielen Dank

Hans

  1. Hallo,

    ich würde zwar ein Menü besser in (Include-)Files definieren, da normalerweise DB-Abfragen mehr Zeit benötigen und mehr CPU-Last erzeugen.

    Ich würde aber eine ganz simple DB-Struktur machen. Genau genommen, gar keine Struktur - nur eine Tabelle:

    Table:
    ID: z.B INT
    ParentID (dann auch INT)
    Url (wenn möglich relativ)
    MenuText (Oder Link zu einer Menügrafik)
    Description (etwa für alt- oder title-Tag)

    Wenn ParentID  = 0, dann ist das ein Menü-Eintrag oberster Stufe.
    Alle Unterpunkte vom Menüeintrag 1 haben als ParentID auch 1 stehen.

    Ich hab so eine Struktur bei einer hierarchichen Link-DB.

    Grüße
    Hannes

    1. Table:
      ID: z.B INT
      ParentID (dann auch INT)
      Url (wenn möglich relativ)
      MenuText (Oder Link zu einer Menügrafik)
      Description (etwa für alt- oder title-Tag)

      Wenn ParentID  = 0, dann ist das ein Menü-Eintrag oberster Stufe.
      Alle Unterpunkte vom Menüeintrag 1 haben als ParentID auch 1 stehen.

      Ja, geht natürlich, beinhaltet aber Rekursion, und das ist aufwändig.

  2. » ich möchte die Navigationspunkte einer Navigation mit 3 Ebenen
    » dynamisch generieren lassen.

    » Hierzu sollen die Punkte in einer MySql DB abgespeichert werden.
    » Zudem sollen die Inhalte die zu den Punkten gehören auch in der
    » DB gespeichert werden.

    Ich würde Dir eine "flat"-Lösung vorschlagen, sprich: zwei simple Tabellen.

    Tabelle Navi:
    +----------+-------------+-----------+-----------+----------+
    | ID       | Key         | URL       | Title     | Words    |
    +----------+-------------+-----------+-----------+----------+
    | uint(10) | char(xxx)   | char(255) | char(255) | char(255)|
    | pri key  | unique      |           | index     | index    |
    +----------+-------------+-----------+-----------+----------+
    | 1        | 000100000000|/s1/       |"ext.links"| foo,bar  |
    +----------+-------------+-----------+-----------+----------+
    | 2        | 000100010000|/s1/s1/    |"software" | software |
    +----------+-------------+-----------+-----------+----------+
    | 3        | 000100010001|/s1/s1/s1/ |"linux"    | os,linux |
    +----------+-------------+-----------+-----------+----------+
    | 4        | 000200000000|           |"impressum"| impr.    |
    +----------+-------------+-----------+-----------+----------+
    | 5        | 000300000000|           |"texte"    | texte    |
    +----------+-------------+-----------+-----------+----------+
    | 6        | 000300010000|           |"gedichte" | lyrik    |
    +----------+-------------+-----------+-----------+----------+
    | 7        | 000300010001|           |"rilke"    | rilke    |
    +----------+-------------+-----------+-----------+----------+
    | 8        | 000300020000|           |"lieder"   | lieder   |
    +----------+-------------+-----------+-----------+----------+
    | 9        | 000300020001|           |"abba"     | abba     |
    +----------+-------------+-----------+-----------+----------+

    Der "Trick" ist der Key. Zum Einen kannst Du mittels

    SELECT * FROM Navi WHERE Key LIKE "/[0-9]{4}0{8}/"

    die Hauptüberschriften auslesen, zum anderen mittels

    SELECT * FROM Navi WHERE Key LIKE "0003*"

    den Baum vom Texte-Bereich. Einfach dabei prüfen, wie viele "0000" am Ende stehen, um die Ebene zu erfahren.

    "Words" sind Keywords zur Suche. Die Spalte kannst Du natürlich weglassen.

    Die Inhalte-Tabelle ist noch simpler:

    Tabelle Content:
    +----------+----------+-----------+------------+
    | ID       | NaviID   | Title     | Content    |
    +----------+----------+-----------+------------+
    | uint(10) | uint(10) | char(255) | mtext      |
    +----------+----------+-----------+------------+
    | 1        | 9        |"Fernando" |"..."       |
    +----------+----------+-----------+------------+
    | 2        | 9        |"Money"    |"..."       |
    +----------+----------+-----------+------------+

    Mit

    SELECT Content.Title FROM Navi,Content
      WHERE Navi.Key = '000300020001'
        AND Navi.ID = Content.NaviID

    kriegst Du dann die Titel Deiner Inhalte in der "Abba"-Ecke. Darauf legst dann halt den Link auf die PHP-Seite, die den Content anzeigt und per Get nur die ID von "Inhalte" braucht.

    HTH

    Carsten

    1. » anzeigt und per Get nur die ID von "Inhalte" braucht.

      Natürlich von "Content".

      1. Vielen Dank!

        Das Ganze soll auch per Eingabemaske pflegbar sein (also Kategorien anlegen usw...). Wie mache ich sowas?

        Die Tabelle mit dem Content verstehe ich nicht! Kannst Du mir die Beziehung der Keys erklären?!

        Danke

        Hans

        1. Das Ganze soll auch per Eingabemaske pflegbar sein (also
          Kategorien anlegen usw...). Wie mache ich sowas?

          Ich würde jeweils in den Kategorien einen Link setzen, der auf eine Eingabe-Seite verweist und die Navi.ID mitgibt per GET. Die Seite holt sich den Key aus der Tabelle, formt einen neuen draus, und der Rest ist ein simples "INSERT". Bei den Inhalten genauso, hier reicht ja dann schon die Navi.ID.

          Die Tabelle mit dem Content verstehe ich nicht! Kannst Du
          mir die Beziehung der Keys erklären?!

          Zwischen Navi.ID und Content.NaviID? Darüber werden die Contents den Kategorien zugeordnet. Content.NaviID = 5 heißt, der Content gehört zur Kategorie, die die ID 5 hat. Du kannst natürlich auch über den Navi.Key zuordnen, ist Geschmacksache. Ich persönlich bevorzuge, die Relationen zwischen Tabellen ausschließlich über die ID zu machen, die bei mir auch immer Primary Key ist. Der Vorteil ist das "auto_increment", sodass Du Dich nicht darum kümmern musst, eigene IDs zu erstellen. Außerdem liefert zB MySQL bei einem INSERT diese ID als lastid() zurück.