nobody: Grundprinzip, Datenbanken eines Forums...

Hallo,

mich würde mal interessieren, wie so die Grundidee eines Forums aussieht und die dazugehörigen Tabellen. Auf Basis von php und mysql.

Mein Gedanke:

user_tabelle: Id, letzter_login, letzte_aktion, sonstige angaben wie nick, nam, mail usw.

themen_tabelle: themen_id, themen_name, letzter post, letzter thread

thread_tabelle: thread_id, zugehörige themen_id, letzter post, author

post_tabelle: der post an sich, dazugehörige thread_id, author, erstellungsdatum

Wie macht "man" das "normalerweise"?

Gruß

P.S.: Sollte man das Datum für Sortierungen etc. als UNIX-Timestamp speichern oder in einem Mysql-Datums-Feld? Dachte da an Unix-Timestamp wegen der einfacheren vergleichsmöglichkeit...

  1. Hi,

    themen_tabelle: themen_id, themen_name, letzter post, letzter thread

    dies dient der Verwaltung unterschiedlicher Foren?

    thread_tabelle: thread_id, zugehörige themen_id, letzter post, author
    post_tabelle: der post an sich, dazugehörige thread_id, author, erstellungsdatum

    Ein Thread ist dadurch definiert, dass es mindestens ein Posting darin gibt. Alle threadbezüglichen Informationen sind durch die zugehörigen Postings gegeben. Es existiert also kein Grund, den Thread separat zu speichern. Entsprechend gehört zum Posting auch nicht die Thread-ID, sondern die ID desjenigen Postings, auf das es bezogen ist. Diejenigen Postings, die sich auf kein anderes Posting beziehen, markieren den Anfang eines Threads.

    P.S.: Sollte man das Datum für Sortierungen etc. als UNIX-Timestamp speichern oder in einem Mysql-Datums-Feld?

    Es ist logisch, dass sich Dir diese Frage stellt; aber ich verstehe nicht, dass sie überhaupt existieren kann. Oracle kommt mit genau einem Datumstypus aus, welcher (nach meinem Kenntnisstand) alle Fälle abdecken kann, die die vielen Datums- und Zeittypen von MySQL abdecken. Der Zweck mehr als einen Typs erschließt sich mir also nicht.

    Dachte da an Unix-Timestamp wegen der einfacheren vergleichsmöglichkeit...

    Trotz aller (scheinbaren) Unterschiede sind die Datumstypen von MySQL immer noch Datumstypen. Auch Daten im Format "dd.mm.yyyy" lassen sich korrekt miteinander vergleichen.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      danke für deine Antwort.

      Also die themen_tabelle hatte ich mehr oder weniger für die "Unterforen" gedacht.

      Und die Postings soll ich dann alle in eine Tabelle werfen und nach denen durchsuchen, die sich auf kein anderes Posting beziehen?
      Wird das dann nicht sehr langsam? Vielleicht für jedes Unterforum eine Tabelle?

      Und wie erkenne ich dann die Zugehörigkeit zu einem der "Unterforen"? Am besten dafür noch eine ID einbauen? Oder die ID des Ersten Posts durch ein Vorangestelltes Erkennungszeichen markieren und so dann die "Unterforen"-ID speichern?

      Und ich hätte es gerne so, dass jeder Thread ein Thema hat, jedoch nicht jedes Posting, also müsste ich schon irgendwo eine thread_tabelle haben...

      Und noch was: wie speicher ich am besten Private-Usernachrichten von anderen Usern im Forum? Eine Tabelle anlegen mit dem Nachrichten-Titel, der Nachricht, der Empfänger-ID und der Absender-ID?

      Also dann ist es Geschmackssache, ob MySql-Timestamp oder Unix-Timestamp? Oder gibt es einen Performance-Unterschied oder irgendeienen anderen Untershcied, der vielleicht von Bedeutung wäre?

      Gruß

      1. Hi,

        Also die themen_tabelle hatte ich mehr oder weniger für die "Unterforen" gedacht.

        ja, das ist vernünftig.

        Und die Postings soll ich dann alle in eine Tabelle werfen und nach denen durchsuchen, die sich auf kein anderes Posting beziehen?

        Wenn Du nur die Initialpostings auflisten willst: Ja.

        Wird das dann nicht sehr langsam?

        Wenn dem so ist, ist Dein DB-Layout fehlerhaft. Es drängt sich dann die Vermutung auf, dass Du die falschen Indexe angelegt hast.

        Vielleicht für jedes Unterforum eine Tabelle?

        Um Gottfrieds Willen! Gleichförmige Daten gehören in die gleiche Tabelle. Niemals werden Tabellen in Abhängigkeit eines Inhalts geschaffen.

        Und wie erkenne ich dann die Zugehörigkeit zu einem der "Unterforen"?

        Durch eine Referenz auf die themen_tabelle.

        Oder die ID des Ersten Posts durch ein Vorangestelltes Erkennungszeichen markieren und so dann die "Unterforen"-ID speichern?

        Nein, auf keinen Fall. Erstens sind Daten in einer Tabellenzelle immer atomar, zweitens haben alle Daten einer Tabellenspalte immer die gleiche Bedeutung.

        Und ich hätte es gerne so, dass jeder Thread ein Thema hat, jedoch nicht jedes Posting, also müsste ich schon irgendwo eine thread_tabelle haben...

        Ja, müsstest Du. Die Referenz auf die themen_tabelle müsste dann vermutlich in die thread_tabelle wandern, was Dir natürlich Möglichkeiten nimmt. Allerdings halte ich es dann für fragwürdig, ob es sich noch um ein Forum handelt. Schwebt Dir vielleicht eher ein Board vor?

        Btw: Es existiert kein Grund, Tabellen mit "_tabelle" zu benennen. Diese Information ist bereits in der Tatsache hinterlegt, dass es sich um eine Tabelle handelt.

        Und noch was: wie speicher ich am besten Private-Usernachrichten von anderen Usern im Forum?

        Welche Anforderungen bzw. Informationen haben diese?

        Also dann ist es Geschmackssache, ob MySql-Timestamp oder Unix-Timestamp? Oder gibt es einen Performance-Unterschied oder irgendeienen anderen Untershcied, der vielleicht von Bedeutung wäre?

        Bitte schaue hierzu in der Doku nach. Ich kenne die Unterschiede nicht im Detail.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo,

          ertsmal Danke für deine Antwort(en)!

          Wird das dann nicht sehr langsam?

          Wenn dem so ist, ist Dein DB-Layout fehlerhaft. Es drängt sich dann die Vermutung auf, dass Du die falschen Indexe angelegt hast.

          Indexe sind mein liebstes Thema...hab da meine Probleme mit (erstelle meine Tabellen noch mit phpMyAdmin, das sag alles...).
          Also der Primary-Key den würde ich dann auf die id-Spalte legen.
          Aber wo sind da dann wohl noch Indexe am sinnvollsten?

          Und wie erkenne ich dann die Zugehörigkeit zu einem der "Unterforen"?

          Durch eine Referenz auf die themen_tabelle.

          also praktisch für jeden Post noch einen Verweis auf das unterforum? Sodass ich dann einfach alle Posts dieses Forums an der ID erkennen kann und diese durch erkennen der Initial-Post in die Themen einteilen kann...

          Und ich hätte es gerne so, dass jeder Thread ein Thema hat, jedoch nicht jedes Posting, also müsste ich schon irgendwo eine thread_tabelle haben...

          Ja, müsstest Du. Die Referenz auf die themen_tabelle müsste dann vermutlich in die thread_tabelle wandern, was Dir natürlich Möglichkeiten nimmt. Allerdings halte ich es dann für fragwürdig, ob es sich noch um ein Forum handelt. Schwebt Dir vielleicht eher ein Board vor?

          Also ich glaube schon das das ein Forum ist was ich meine:
          Hauotseite mit den unterforen: sagen wir mal Katzen Hunde,...
          Darin dann Threads z.B. mein Hund ist krank, meine Katze ist tot
          Und darin dann die Posts

          Btw: Es existiert kein Grund, Tabellen mit "_tabelle" zu benennen. Diese Information ist bereits in der Tatsache hinterlegt, dass es sich um eine Tabelle handelt.

          Das mache ich auch nur hier so, um zu kennzeichen, dass ich von eine Tabelle rede.

          Und noch was: wie speicher ich am besten Private-Usernachrichten von anderen Usern im Forum?

          Welche Anforderungen bzw. Informationen haben diese?

          Nachrichten, die nur von dem Empfänger gelesen werden dürfen und von jedem Benutzer an jeden Benutzer geschireben werden können...

          Gruß

          1. Mach mal einen Datendesignvorschlag, dann sehen wir weiter.

            Und leg den PK auf das "ID-Feld" und vermeide den Begriff "Unterforum".

            :-

            1. Hi,

              Danke für eure Hilfe!

              Also ich dachte an so eine Posting-Tabelle

              POST REF_ID THEMEN_ID AUTOR_ID ERSTELLUNGSDATUM TITEL (wenn jeder Post einen Titel bekommt...)

              Und dann würde ich den PK auf die REF_ID legen? Oder auf die THEMEN_ID?
              Und wenn ich mal noch eine Volltextsuche einbauen möchte, sollte ich dann noch irgendwas mit dem POST-Feld machen?

              Gruß

              1. Also ich dachte an so eine Posting-Tabelle

                POST REF_ID THEMEN_ID AUTOR_ID ERSTELLUNGSDATUM TITEL (wenn jeder Post einen Titel bekommt...)

                Und dann würde ich den PK auf die REF_ID legen? Oder auf die THEMEN_ID?

                Der Primaerschluessel der Tabelle Postings sollte PostingsID heissen, numerisch sein, einen auto increment-Wert besitzen und als primary key explizit gekennzeichnet sein, so dass das RDBMS selbststaendig einen Index darauflegt.
                Anders formuliert: Es fehlt erst einmal das Datenfeld PostingsID.
                "REF_ID" ist ja ein Selbstbezug, diesen als Fremdschluessel kennzeichnen.

                Und wenn ich mal noch eine Volltextsuche einbauen möchte, sollte ich dann noch irgendwas mit dem POST-Feld machen?

                Mach erstmal Deine Tabellen auf, diskutiere die hier incl. Verzeigerungen und frag dann noch einmal nach bzw. lies die Doku bzw. lies das hiesige Archiv.

                Alles, was Du hier fragst, ist hier schon gefragt worden.
                Oder anders formuliert:
                Du kannst noch so doof sein, hier, im Forum, findet sich immer noch einer, der ist doefer.

                Man beachte den Komparativ. Muesste es nicht doewer heissen?

                1. Hallo,

                  und was bringt mir der PK auf der POSTIG_ID?
                  Die werde ich doch nie Abfragen?

                  Gruß

                  P.S.: Ich schau mich mal um...^^

                  1. und was bringt mir der PK auf der POSTIG_ID?
                    Die werde ich doch nie Abfragen?

                    Wenn ich Dich richtig verstehe meinst Du den Selbstbezug des Postings. Also ein Posting steht entweder alleine, wenn jemand einen neuen Beitragsstrang aufgemacht hat oder verweist auf ein anderes Posting. Wenn letzteres der Fall ist, ist ein Fremdschluessel einzurichten, damit sichergestellt ist, dass ein Posting nicht "ins Nichts" zeigt.

                    1. Hallo,

                      ok...thx..ganz vergessen...diese ist dann also die POSTING_ID, auf die sich dan die REF_ID beziehen kann...

                      Gut und nochmal Danke!

                      Und wo muss/kann/soll ich dann noch Indexes setzen?

                      Gruß

                      1. Und wo muss/kann/soll ich dann noch Indexes setzen?

                        Erst einmal gar nicht, setz die Primaer- und Fremdschluessel und sei happy. Wenn es dann bei bestimmten Abfragen messbare, also echte Performance-Engpaesse gibt, dann frag noch mal nach oder lies Dir einfach was zu Indizes und Volltext-Indizes an.

                        1. Hallo,

                          ...und ich dachte immer man muss vor füllen der Tabelle wissen wo man welche Indexes setzt...danke für den Hinweis, dass man die auch später noch hinzufügen kann...

                          Und dieser Fremdschlüssel, wie setze ich den wohl in phpMaAdmin, weißt du das zufällig, denn ich finde nichts...

                          Der Fremdschlüssel ist doch auch ein Art Index, also müsste des da irgendwie gehen...

                          Gruß