Ankündigung

Einklappen
Keine Ankündigung bisher.

Textstrukturierung (Baumstruktur?)

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Textstrukturierung (Baumstruktur?)

    Hey,

    ich entwerfe momentan einen Algorithmus der mir aus einer Datenbank Überschriften und Texte holt und diese dann zu einem Text zusammenstellt. Gleichzeitig soll man aber auch neue Bausteine hinzufügen, löschen oder bearbeiten können.

    Momentan ist das ganze so aufgebaut:

    Datenbank:

    Code:
    CREATE TABLE modules (
      id INT NOT NULL AUTO_INCREMENT,
      title TEXT CHARACTER SET utf8 COLLATE utf8_german2_ci,
      txt TEXT CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE modules_text (
      id INT NOT NULL AUTO_INCREMENT,
      text INT NOT NULL,
      modules INT NOT NULL,
      PRIMARY KEY (id),
      FOREIGN KEY (text) REFERENCES text(id),
      FOREIGN KEY (modules) REFERENCES modules(id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE text (
      id INT NOT NULL AUTO_INCREMENT,
      txt TEXT CHARACTER SET utf8 COLLATE utf8_german2_ci,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Ich arbeite mit dem Framework CodeIgniter, welches ich letztens erst kennen gelernt habe und wirklich gut finde.
    Bisher funktioniert auch alles super!

    Mein Problem ist nun das ich gerne Unter-Überschriften möchte die hinterher bei der Generierung des Textes durch PHP durchnummeriert werden. Außerdem soll der Benutzer von dem generieren, auswählen können welche Textabschnitte überhaupt in den Text kommen. Also es kann auch sein das er nur Themen-Abschnitte wählt und überhaupt keine Unterthemen (siehe unten).
    Desweiteren gibt es Textabschnitte die immer Standardmäßig in einem Text vorkommen d.h auch nicht vom Benutzer abwählbar oder zuwählbar sind.

    Das ganze könnte als fertiger Text z.B. so aussehen:

    1 Thema
    1.1 Unterthema
    1.2 Unterthema
    2 Thema
    2.1 Unterthema
    2.1.1 Unterunterthema
    2.1.2 Unterunterthema
    2.1.3 Unterunterthema
    2.1.4 Unterunterthema
    2.2 Unterthema
    3 Thema
    4 Thema
    5 Thema
    5.1 Unterthema
    Mehr als 3 Stufen wird es nicht geben, sprich 2.1.1.1 nicht aber 2.1.1 schon.
    Ich habe leider nur überhaupt keine Idee, wie ich das sinnvoll in der Datenbank ablegen soll. Ich dachte erst an eine Baumstruktur, weiß aber nicht, wie man diese effektiv in einer Datenbank speichert.

    Könnt ihr mir vielleicht helfen?

  • #2
    Zitat von Chuky3000x Beitrag anzeigen
    Hey,

    ich entwerfe momentan einen Algorithmus der mir aus einer Datenbank Überschriften und Texte holt und diese dann zu einem Text zusammenstellt. Gleichzeitig soll man aber auch neue Bausteine hinzufügen, löschen oder bearbeiten können.

    Momentan ist das ganze so aufgebaut:...
    Könnt ihr mir vielleicht helfen?
    Vorweg: Zu CodeIgniter kann ich überhaupt nichts sagen und konzentriere mich ausschließlich auf die Frage zur Datenbankstruktur:
    Wenn ich dich richtig verstehe, hast du Module (was immer das sei, s.u.) und Texte und nun möchtest du über die Tabelle modules_text diese einander zuordnen. Aber bereits in dem Moment, wo ich mir dann die Tabelle modules anschaue, wird es widersprüchlich: Wieso tauchen da auf einmal wieder "Texte" auf?
    1. Mach bitte folgendes: Fülle deine drei Tabellen mit Testdaten (ca. 5 - 8 Datensätze pro Tabelle sind völlig genug) und poste dann bitte nochmal einen DB-Dump.
    2. Benenne bitte, was jeweils Gegenstand einer Zeile der Tabellen modules und text ist, und zwar konkret und "real life"! Was repräsentiert eine Zeile in modules? Wofür steht eine Zeile (DS) in text?
    Zu deiner Frage mit der Baumstruktur. Natürlich kann man eine Baumstruktur in der DB abbilden, die ist sozusagen dafür prädestiniert. Ich gebe mal ein Beispiel (Tabellen-Dump):
    Code:
    CREATE TABLE `abschnitt` (
      `abschnitt_id` int(11) NOT NULL,
      `ueordn_abschn_id_fk` int(11) DEFAULT NULL,
      `abschn_ueberschr` text NOT NULL,
      `ebene` int(11) NOT NULL,
      `rf_platz` int(11) NOT NULL,
      `hat_nachfolger` tinyint(1) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    INSERT INTO `abschnitt` (`abschnitt_id`, `ueordn_abschn_id_fk`, `abschn_ueberschr`, `ebene`, `rf_platz`, `hat_nachfolger`) VALUES
    (1, NULL, 'Das Wesen einer Baumstruktur', 1, 2, 1),
    (2, NULL, 'Die Realisierung mit einer DB', 1, 3, 1),
    (3, 1, 'Was bedeutet „hierarchische Struktur“?', 2, 1, 0),
    (4, 1, 'Elemente einer hierarchischen Struktur', 2, 2, 1),
    (5, 4, 'Ebenen', 3, 1, 0),
    (6, 4, 'Beziehungen zwischen den Elementen', 3, 2, 0),
    (7, 4, 'Reihenfolge der Elemente', 3, 3, 0),
    (8, 2, 'Datenbankstruktur: Tabellen', 2, 1, 0),
    (9, 2, 'Realisierung der Ebenen, Beziehungen und der Reihenfolge der Elemente', 2, 2, 0),
    (10, NULL, 'Einführung', 1, 1, 0),
    (12, NULL, 'Tabellen-Dumps', 1, 4, 0),
    (13, NULL, 'PHP- und HTML-Sourcecode', 1, 5, 1),
    (14, 13, 'Funktionen', 2, 1, 0),
    (15, 13, 'HTML-/PHP-Seiten-Code', 2, 2, 1),
    (16, 15, 'Einhaltung des EVA-Prinzips', 3, 1, 0),
    (17, 15, 'Hinweise für Entwickler', 3, 2, 0),
    (18, NULL, 'Quellen', 1, 6, 0);
    
    ALTER TABLE `abschnitt`
      ADD PRIMARY KEY (`abschnitt_id`);
    
    ALTER TABLE `abschnitt`
      MODIFY `abschnitt_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=19;
    Mit der folgenden Abfrage ziehst du dir dann erstmal die Überschriften-Texte und die Abschnitts-Nummern:
    Code:
    SELECT A.rf_platz, A.abschn_ueberschr, B.rf_platz, B.abschn_ueberschr, C.rf_platz, C.abschn_ueberschr, 
           A.hat_nachfolger, B.hat_nachfolger, C.hat_nachfolger 
           FROM ( abschnitt AS A LEFT JOIN ( 
                  SELECT abschnitt_id, abschn_ueberschr, ueordn_abschn_id_fk, rf_platz, hat_nachfolger 
                         FROM abschnitt 
                         WHERE abschnitt.ebene = 2) AS B 
                         ON A.abschnitt_id = B.ueordn_abschn_id_fk ) LEFT JOIN ( 
                         SELECT abschn_ueberschr, ueordn_abschn_id_fk, rf_platz, hat_nachfolger 
                                FROM abschnitt  
                                WHERE abschnitt.ebene = 3) as C 
                                ON B.abschnitt_id = C.ueordn_abschn_id_fk 
           WHERE A.ebene = 1 
           ORDER BY A.rf_platz, B.rf_platz, C.rf_platz;
    In PHP machst du dann via Gruppenstufenverarbeitung bspw. das vollständige Inhaltsverzeichnis daraus.

    Ergänzung: So sähe die Verarbeitung des Ergebnisses obiger Abfrage dann im Prinzip aus:
    Code:
    # -- ERGEBNIS VERARBEITEN ----------------------------------------------------
      if ($result === false) {
        // Fehlermeldung
      } else {
        $strTblRoh = '';
        $lngRfP_1 = 0;
        while ($row = mysqli_fetch_array($result)) {
          if ($row[0] <> $lngRfP_1) {
            $lngRfP_1 = $row[0];
            $lngRfP_2 = 0;
            $strTblRoh = $strTblRoh.$row[0].' '.$row[1].'<br>';
            if ($row[6] == 1) {
              $strTblRoh = $strTblRoh.$strEinrueck.$row[0].'.'.$row[2].' '.$row[3].'<br>';
            }   
          } else {
            if ($row[2] <> $lngRfP_2) {
              $lngRfP_2 = $row[2];
              $strTblRoh = $strTblRoh.$strEinrueck.$row[0].'.'.$row[2].' '.$row[3].'<br>';
            }
            if ($row[7] == 1) {
              $strTblRoh = $strTblRoh.$strEinrueck.$strEinrueck.$strEinrueck.
              $row[0].'.'.$row[2].'.'.$row[4].' '.$row[5].'<br>';
            }
          }
        }
      }
    Das Ergebnis sieht dann, eingebaut in eine entsprechende Seite, so aus (HTML-Sourcecode):
    HTML-Code:
    <!DOCTYPE html>
    <html lang="de">
    <head>
      <meta charset="utf-8">
      <!-- <title>Seiten-Titel</title> -->
    </head>
    <body>
      <div style="padding: 15px;">
        1 Einführung<br>
        2 Das Wesen einer Baumstruktur<br>&nbsp;&nbsp;&nbsp;
        2.1 Was bedeutet &bdquo;hierarchische Struktur&ldquo;?<br>&nbsp;&nbsp;&nbsp;
        2.2 Elemente einer hierarchischen Struktur<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        2.2.1 Ebenen<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        2.2.2 Beziehungen zwischen den Elementen<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        2.2.3 Reihenfolge der Elemente<br>3 Die Realisierung mit einer DB<br>&nbsp;&nbsp;&nbsp;
        3.1 Datenbankstruktur: Tabellen<br>&nbsp;&nbsp;&nbsp;
        3.2 Realisierung der Ebenen, Beziehungen und der Reihenfolge der Elemente<br>
        4 Tabellen-Dumps<br>
        5 PHP- und HTML-Sourcecode<br>&nbsp;&nbsp;&nbsp;
        5.1 Funktionen<br>&nbsp;&nbsp;&nbsp;
        5.2 HTML-/PHP-Seiten-Code<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        5.2.1 Einhaltung des EVA-Prinzips<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        5.2.2 Hinweise für Entwickler<br>
        6 Quellen<br>  </div>
    </body>
    </html>

    Kommentar

    Lädt...
    X