Flo: Problem beim logischen Aufbau einer Datenbank

Hallo Leute,

ich hätte da folgendes Problem:

ich möchte ne datenbank erstellen, die aufgebaut ist praktisch wie ein Forum, wird aber keins ;)
aufgebaut in der Form

-Titel
   -Überschrift
        -Text
   -Überschrift
        -Text

usw...

Das Problem ist nun, wie ich die Datenbank aufbauen soll. Es wäre kein Problem wenn zu jedem Titel jeweils nur eine Antwort kommen würde, aber wie soll ich es machen, dass dann dahinter noch mehr Antworten hinzugefügt werden können, und dann nachher wieder ausgelesen werden können?!

Die Datenbank wird MySQL, Applikationssprache wird PHP sein....

Wäre nett wenn ihr mir da ein paat Tipps geben könntet

MfG

Flo

  1. Hallo Leute,

    ich hätte da folgendes Problem:

    ich möchte ne datenbank erstellen, die aufgebaut ist praktisch wie ein Forum, wird aber keins ;)
    aufgebaut in der Form

    -Titel
       -Überschrift
            -Text
       -Überschrift
            -Text

    usw...

    Das Problem ist nun, wie ich die Datenbank aufbauen soll. Es wäre kein Problem wenn zu jedem Titel jeweils nur eine Antwort kommen würde, aber wie soll ich es machen, dass dann dahinter noch mehr Antworten hinzugefügt werden können, und dann nachher wieder ausgelesen werden können?!

    Die Datenbank wird MySQL, Applikationssprache wird PHP sein....

    Wäre nett wenn ihr mir da ein paat Tipps geben könntet

    MfG

    Flo

    Wenn ich dich richtig verstanden habe, ist dein Problem,
    daß du bei mehreren gleichen Titeln den Titel einmal hinschreiben willst und dann alle dazugehörigen ds?
    Bsp:
    Titel 1
    MeldungzuTitel1
    MeldungzuTitel1
    MeldungzuTitel1
    Titel 2
    MeldungzuTitel2
    MeldungzuTitel2

    usw.

    Du kannst ruhig ein Feld nehmen, welches jeweils den Titel beinhaltet, dann:
    // deine query
    if ($row=mysql_fetch_array($result))
    {
    $altertitel=$row[titel];  //muß einmal zu anfang gesetzt werden
    do
    {
      if ($altertitel!=$row[neuertitel]) // gabs den Titel schonmal?
      {  
      echo"$row[titel]<br>\n";    //gabs noch nicht, also hinschreiben
      echo"$row[ueberschrift]<br>\n";
      echo"$row[deintext]<br>\n";
      $altertitel=$row[titel];   //neuer alter titel
      }
      else   //titel war schon da, also nur inhalte schreiben
      {  
      echo"$row[ueberschrift]<br>\n";
      echo"$row[deintext]<br>\n";
      }
    }
    while ($row=mysql_fetch_array($result));
    }

    (ungeprüft!)
    Also: der jeweils letzte titel wird in einer variablen festgehalten, dann wird geprüft, ob der letzte titel ungleich dem aktuellen ist, wenn dem so ist, muß der titel neu hingeschrieben werden, und es gibt einen "neuen" altentitel. Wenn nicht, wird nur der Inhalt, nicht der Titel hingeschrieben.

    Hoffe, der code ist so richtig und auch verständlich.

    CU,Carsten

    1. Nachtrag:

      Wichtig ist bei der Art der Darstellung, daß du deine query nach titel sortierst, sonst klappt das ganze nicht :-((

      ...order by title;

      Gruss, Carsten

      1. Danke Leute!

        ich werds probieren und mich nochmal melden, falls es probleme gibt ;)

        MfG
        Flo

    2. Wenn ich dich richtig verstanden habe, ist dein Problem,
      daß du bei mehreren gleichen Titeln den Titel einmal hinschreiben willst und dann alle dazugehörigen ds?
      Bsp:
      Titel 1
      MeldungzuTitel1
      MeldungzuTitel1
      MeldungzuTitel1
      Titel 2
      MeldungzuTitel2
      MeldungzuTitel2

      usw.

      Du kannst ruhig ein Feld nehmen, welches jeweils den Titel beinhaltet..

      Soweit klar,

      aber wenn ich nur ein Feld nehme, um die Titel zu speichern, dann kann ich die ja nich richtig auslesen dann stehen da alle Titel hintereinander, in der Form

      Titel1Titel2Titel3
      (gleiches gilt dann ja auch für die Antworten wenn ich die alle auch in einem Feld speichere)

      wie soll ich die denn dann korrekt auslesen und den jeweiligen Texten bzw Meldungen zuweisen??

      danke im vorraus

      MfG
      Flo

      1. Hi,

        aber wenn ich nur ein Feld nehme, um die Titel zu speichern, dann kann ich die ja nich richtig auslesen dann stehen da alle Titel hintereinander, in der Form
        Titel1Titel2Titel3
        (gleiches gilt dann ja auch für die Antworten wenn ich die alle auch in einem Feld speichere)
        wie soll ich die denn dann korrekt auslesen und den jeweiligen Texten bzw Meldungen zuweisen??

        die Struktur Deiner Daten hängt ganz wesentlich davon ab, was Du damit später tun willst.

        Ich glaube Deinen Angaben entnehmen zu können, daß Du einen Baum mit variabler Verzweigungsbreite traversieren können willst.
        In einer relationalen Datenbank würde ich einen solchen Baum in einer einzigen Tabelle folgendermaßen darstellen:

        knotennummer    number;
          erster_sohn     number;
          naechste_bruder number;
          ...
          (weitere Komponenten, um den eigentlichen Inhalt des Knotens darzustellen)

        Gibt es einen Sohn bzw. Bruder nicht, dann schreibe eine entsprechende Markierung hinein.

        Eine erste Antwort zu einem Knoten hängst Du also an den first_son, falls der noch frei ist, ansonsten positionierst Du auf ihn und suchst solange die Brüder ab, bis einer davon der letzte ist, und hängst die Antwort dort dran.
        Analog kannst Du die gesamte Baumstruktur später wieder lesen.

        Anschauungsbeispiel (als Forum-Baum und als Tabellenwerte):

        Posting 1
           Posting 3
              Posting 6
        Posting 2
           Posting 4
           Posting 5

        ergibt:

        (1,3,2)
        (2,4,0)
        (3,6,0)
        (4,0,5)
        (5,0,0)
        (6,0,0)

        Wenn Du in einem solchen Baum auch noch löschen können willst, sollte ein Knoten auch einen Rückverweis auf seinen Vater bzw. vorherigen Bruder erhalten.

        mfG - Michael

  2. Hi,

    ist event. ein bisschen zu spät, aber ich Antworte trotzdem mal.

    Grundsätzlich ist für Deine Anforderung die Aufteilung der Tabellen notwendig, da Du in einer Tabelle ja nicht willenlos viele Felder einfügen kannst. Dadurch würde die logische Struktur durcheinander gebracht werden.
    Da ich leider nicht soviel Erfahr. mit MySQl (Arbeite selbst mit Access und Paradox) habe, kann ich Dir leider nur einen Ansatz bieten.

    Angenommen Du hast Produkte mit beliebig vielen Eigenschaften, dann gehst du ungefähr so vor

    Produkte:

    Art.-Nr.     Bezeichnung   Preis  
    ---------------------------------------
    012365 (key) Artikel 1     12,00  
    235866 (key) Artikel 2     20,00

    Eigenschaften:

    Id (key)     Art.-Nr.     Eigenschaft
    -------------------------------------------
    AutoWert     012365       Groß        
    AutoWert     012365       Schwer

    In Tabelle 1 ist das Schlüsselfeld die Artikel Nr. (darf nur einmal vorkommen), dies ist das Feld das Du mit dem [Art. Nr.] Feld in der Eigenschaften Tabelle verknüpfst (hier müssen Mehrfacheinträge möglich sein). Jetzt solltest Du ind Lage sein einem Produkt mehrere Eigenschaften zuzuweisen.

    Wie Du das in MySQL realisierst, kann ich Dir wie vorhergehend schon erwähnt leider nicht sagen. Ich hoffe trotzdem, das ich Dir ein wenig weiterhelfen konnte. Für weitere Informationen empfehle ich Dir auf den HP's diverser UNI's nachzuschauen, da gibte es Teilweise sehr gute Referate (gerade auch zu den Normalformen, die auf jeden Fall beachten solltest).

    Gruß Stephan

  3. Hallo

    an sich brauchst du in der DB nur eine einzelne tabelle :
    ID (primaryKey) Parent    Titel     MessageBody
    ---------------------------------------------------
    nummer(NOT NULL) nummer    Text      Text

    Das wichtige dabei ist "Parent".
    Wenn Parent NULL ist, heisst das, das der Datensatz den Titel darstellt

    z.b. ID=1
         Parent=NULL
         Titel=Titel1
         MessageBody=Hallo

    Wenn du jetzt eine Antwort zum diesem Datensatz einfügen willst, brauchst du nur einen neuen Datensatz einzufügen, dessen PARENT du auf 1 setzts ....
    Natürlich muss dieser Datensatz auch eine eigenen eindeutigen ID bekommen.

    hoffe, du hast es verstanden, wenn nicht, schreib mir eine E-Mail

    dein SQL Create sollte so sein:
    create Table Posting(ID number Primary key,
                         Parent number,
                         Titel varchar(100),
                         Messagebody varchar(100),
                         constraint fk foreign key(Parent) references Posting(ID))

    Grüsse
    Miraldo