Markus Trusk: welche Programmlogik ist die Beste?

Hi,
Ich will ein Board auf mySQL und Perl erstellen. Früher speicherte ich die Daten in Textfiles, wo jedes neue Thema ein neues Textfile am Server erzeugte, und die Antworten auf das Thema in dieser Datei immer unten drangestückelt wurden. Damit ich die verschiedenen Postings erkennen konnte, bekam jede Antwort ungefähr diese Format:

<hauptthema>
text, Username, usw....
</hauptthema>

<antwort=1>
Text, Username, usw...
</antwort>

<antwort=2>
Text, Username, usw...
</antwort>

So konnte ich die Daten leicht auslesen und ausgeben lassen.
Wenn ich mir jetzt aber überlege, wie ich die Programmlogik mit mySQL gestalten soll, komme ich nicht weiter.
Einerseits kann/will ich nicht Hundertausend Tabellen erstellen, die pro Posting immer mehr werden würden, und eine neue Spalte je Posting erstellen ist auch keine Lösung, aber wie kann man das dann am besten realisieren?

Markus Trusk.

  1. Hallo!

    Einerseits kann/will ich nicht Hundertausend Tabellen erstellen, die pro Posting immer mehr werden würden, und eine neue Spalte je Posting erstellen ist auch keine Lösung, aber wie kann man das dann am besten realisieren?

    Vielleicht hilft Dir: http://aktuell.de.selfhtml.org/artikel/phpasp/php-forum/index.htm

    Grüße
    Andreas

  2. Hi,

    Hallo!

    [...]

    Einerseits kann/will ich nicht Hundertausend Tabellen erstellen, die pro Posting immer mehr werden würden, und eine neue Spalte je Posting erstellen ist auch keine Lösung, aber wie kann man das dann am besten realisieren?

    ist hier: http://aktuell.de.selfhtml.org/artikel/phpasp/php-forum/index.htm sehr gut beschrieben!

    Markus Trusk.

    Viele Grüße

    MAresa P.

  3. hi,

    du suchst weniger nach einer programmlogik, als vielmehr nach einem datenmodell.

    Einerseits kann/will ich nicht Hundertausend Tabellen erstellen, die pro Posting immer mehr werden würden, und eine neue Spalte je Posting erstellen ist auch keine Lösung, aber wie kann man das dann am besten realisieren?

    überlege dir eine sinnvolle möglichkeit, postings abzuspeichern, und ihre relation untereinander zu kennzeichnen.

    z.b. könntest du eine spalte in deiner tabelle nutzen, um zu kennzeichnen, zu welchem thread ein posting gehört.
    bei dem posting, welches einen thread startet, steht hier einfach eine 0 drin, bei allen weiteren antworten auf dieses eigangsposting dann eben die ID dieses eingangspostings.
    damit könntest du aber wohl nur einen board-artigen thread aufbauen, also alle antworten untereinander.
    wenn du statt dessen eine baumstruktur wie hier haben willst, solltest du dir bei jedem posting die ID des beantworteten vorgängerpostings speichern. allerdings brauchst du dann noch ein weiteres kennzeichen, um die zugehörigekeit zu einem gesamtthread abzubilden, z.b. eine eigene thread-id.

    ist natürlich nur ein grober umriss ...

    gruss,
    wahsaga

    1. Hi,

      du suchst weniger nach einer programmlogik, als vielmehr nach einem datenmodell.

      Ja, mir ist nur das passende Wort dafür nicht eingefallen.

      Also ich glaube es hat mir schon mal ein wenig weitergeholfen. Ich habe es mir jetzt so vorgestellt:

      Spalten mit (vereinfacht dargestellt, weil mein Board wird ziemlich umfangreich und ich will die für dieses Problem irrelevaten Sachen mal weglassen)

      thema, text, unix_timestamp.

      Das Thema kann im Board nicht geändert werden, da es sowieso ein Board ist und das daher nicht notwendig ist. Jetzt habe ich das die Beziehung zw Antworten und Hauptthema, damit ich weiß, welche Zeilen (also pro Antwort eine neue Zeile) mit welchem Thema zusammengehören.
      Mit unix_timestamp (dort werden ich eben den Unix Zeitstempel hineinschreiben, nach dem ich bei meinem alten Board auch schon sortiere) kann ich die Reihenfolge der Postings richtig anordnen, sodaß das erste immer ganz oben steht (oder wie auch immer ich es anordnen will).
      Würde das eine gute Lösung sein, oder gäbe es vielleicht eine noch Effizientere?

      ZUSATZFRAGE:
      Wie kann man am effizientesten einen Wert in einer Spalten inkrementieren, weil manchmal stand ich schon kurz vor dem Problem, dass ich eine ID (oder timestamp) hatte, und diese pro weiteren Eintrag inkrementieren wollte.
      Natürlich kann ich jetzt mit den 08/15 Tricks hergehen, auslesen, inkrementieren, und neu speichern, aber gibt es nicht in mySQL etwas, das dies schon automatisch erledigen kann?

      Markus Trusk.

      1. hi,

        aber gibt es nicht in mySQL etwas, das dies schon automatisch erledigen kann?

        schau dir mal an, was in der doku bezüglich auto_increment steht:
        http://dev.mysql.com/doc/mysql/en/example-AUTO_INCREMENT.html

        gruss,
        wahsaga

        1. Hi,
          Alles klar danke. Das Problem ist eben immer, dass ich nicht weiß, wie diese Funktionen heißen, und ob es diese überhaupt gibt, deswegen finde ich ist es auch schwer danach irgendwie zu suchen.

          Markus Trusk.

          1. Hallo!

            Alles klar danke. Das Problem ist eben immer, dass ich nicht weiß, wie diese Funktionen heißen, und ob es diese überhaupt gibt, deswegen finde ich ist es auch schwer danach irgendwie zu suchen.

            Naja, dann solltest Du Dir das Manual einfach mal ansehen, so dass Du weißt wo Du suchen musst!

            http://dev.mysql.com/doc/mysql/de/Reference.html
            http://dev.mysql.com/doc/mysql/de/Tutorial.html
            http://dclp-faq.de/ch/ch-database_mysql.html
            und die MySQl-Kapitel in http://tut.php-q.net

            und nicht zuletzt mal im Linkverzeichnis vorbei gucken: http://aktuell.de.selfhtml.org/links/datenbank.htm

            Grüße
            Andreas

            1. Hi,

              http://dev.mysql.com/doc/mysql/de/Reference.html
              http://dev.mysql.com/doc/mysql/de/Tutorial.html

              danke, das sieht sehr übersichtlich aus. Werde nächstes Mal zuerst dort nachsehen.

              http://dclp-faq.de/ch/ch-database_mysql.html

              Ich verwende kein PHP :)

              Markus Trusk.

              1. Ich verwende kein PHP :)

                Ich meine natürlich diesen Link http://tut.php-q.net/ :)

                Markus Trusk.

  4. Hi nochmal.
    Wenn ich jetzt mehrere Zeilen und pro Zeile eine Spalte mit, sagen wir mal "timestamp", wo der aktuelle Unix Zeitstempel gespeichert wird habe, wie kann ich dann am effizientesten herausfinden, welche Zeile den aktuellsten Zeitstempel hat. (sprich die jüngste Zeile ist)?
    Ich könnte natürlich mit SORT BY "timestamp" arbeiten und dann die Schleife nach dem ersten Durchlauf abbrechen, aber das wäre aus meiner Sicht irgendwie gefrickelt. Wie würde man das professionell machen?

    Markus Trusk.

    1. hi,

      Ich könnte natürlich mit SORT BY "timestamp" arbeiten und dann die Schleife nach dem ersten Durchlauf abbrechen, aber das wäre aus meiner Sicht irgendwie gefrickelt. Wie würde man das professionell machen?

      man würde natürlich ebenfalls nach der zeit absteigend sortieren - allerdings noch ein LIMIT 1 anfügen, um die menge der zurückgelieferten datensätze auf genau einen (und zwar den _nach_ erfolgter sortierung ersten) zu beschränken.

      gruss,
      wahsaga

      1. Hi,
        Alles klar, danke.

        Markus Trusk.

  5. Hi,

    Einerseits kann/will ich nicht Hundertausend Tabellen erstellen, die pro Posting immer mehr werden würden, und eine neue Spalte je Posting erstellen ist auch keine Lösung, aber wie kann man das dann am besten realisieren?

    Hmm, eine Tabelle reicht für diesen Zweck. Jede neue Message auf dem Board bekommt ein fortlaufende Nummer: 1, 2, 3 usw.

    FollowUps auf 1 bekommen die Nummer 1.1, 1.2 usw.

    FollowUps aus 1.1 bekommen 1.1.1, 1.1.2 usw.

    In solchen Schlüsseln ist dann ein Thread abgebildet:

    Thread 1 sieht bspw so aus:

    1
    1.1
    1.1.1
    1.1.2
    1.2
    1.2.1
    1.2.2
    1.2.2.1

    usw.

    Anhand dieser Keys kannst du dann die Threads hierachisch in HTML abbilden (nichtlineares MessageBoard -> Forum).

    Für die DB: Diese Schlüssel sind der primary Key einer jeden Message.

    Die Tabellenfelder:
    id name email date subject message_body

    Der Rest ist Tipparbeit ;-)

    Rolf

    --
    SELFforum - Das Tor zur Welt!
    Theoretiker: Wie kommt das Kupfer in die Leitung?
    Praktiker: Wie kommt der Strom in die Leitung?
    1. Hi,
      es ist schon etwas komplizierter. Die aktuellsten Postings springen nach oben. Der name des Benutzers des letzten Postings wird angezeigt, usw, also mit ziemlichen Funktionsumfang. Außerdem gibts noch einen Messenger usw usw.

      Markus Trusk.

      1. Hi Markus,

        es ist schon etwas komplizierter. Die aktuellsten Postings springen nach oben. Der name des Benutzers des letzten Postings wird angezeigt, usw, also mit ziemlichen Funktionsumfang. Außerdem gibts noch einen Messenger usw usw.

        Ja schön dass du meinen Ansatz gelesen hast. Aber auch das was du nun schreibst ist mit diesem Ansatz lösbar, denn die dazu benötigten Daten liegen in der DB.

        Ich hab vor ein paar Jahren mal auf diese Art ein Forum programmiert in PERL. Zum Speichern der Daten hatte ich 2 Varianten

        1. Im Dateisystem
        2. eine Berkeley DB (DB_File)

        Beide Varianten liefen affenartig schnell. Auch heute würde ich für ein Forum nur dann ein DBMS verwenden, wenn die Daten archiviert werden sollen.

        Ansonsten nehme ich DB_File  für ein Forum. Hierbei ist die Messagenummer ein eindeutiger Key und alle anderen Daten stehen im Value zu dem Key.

        Viel Spass beim programmieren und lass mal wieder was von dir hören.

        Rolf alias Erwin

        --
        SELFforum - Das Tor zur Welt!
        Theoretiker: Wie kommt das Kupfer in die Leitung?
        Praktiker: Wie kommt der Strom in die Leitung?