Tabellenlayout sinnvoll?

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

  • Tabellenlayout sinnvoll?

    Hi!

    Ich bin gerade dabei, ein Forum zu erstellen und wollte deshalb mal fragen, ob dieses Tabellenlayout für euch so sinnvoll erscheint:



    Erklärung der einzelnen Tabellen:

    forum_kategorien:
    In dieser Tabelle sind alle Kategorien meines Forums gespeichert. category_order (int) gibt die Reihenfolge der Kategorien an (Wie sie angezeigt werden)

    forum_themen:
    Alle Themen des Forums sind den Kategorien untergeordnet.
    category_id gibt an, welches Thema zu welcher Kategorie gehört.

    forum_threads:
    Jeder Thread ist einem Thema und damit auch einer Kategorie untergeordnet. thema_id gibt an, welches Thema zum Thread gehört.

    forum_post_info:
    Informationen zu Beiträgen wie z.B. IP, uhrzeit der Erstellung, User-ID des erstellers, usw....

    forum_post_text:
    Enthält die Beiträge selbst + die ID des Beitrags.

    phpbb_users:
    Die Usertabelle. user_id ist mit poster_id von forum_post_info verknüpft.

    Die roten Linien im Bild geben an, welche Felder in Verbindung stehen.

    Ich bin für jede Kritik und für jeden Verbesserungsvorschlag sehr dankbar, denn ich will ein leistungsstarkes und normalisiertes Forum erstellen ;-)

    MfG
    Seggl
    Zuletzt geändert von Seggl-hoch-drei; 27.03.2008, 14:00.
    Tempim.de - Dein kostenloser Bildhoster
    Tipps und Tricks für Webmaster

  • #2
    - Warum heißt die Benutzertabelle phpbb_users?
    - Der erste/letzte Post eines Threads leitet sich doch vom Postdatum ab
    - Posts haben offensichtlich keine Titel
    - Statt Thread-Name sollte der Titel des ersten Posts genommen werden

    Ansonsten für ein sehr simples Forensystem vermutlich brauchbar. Für eine wirkliche Beurteilung fehlt aber noch einiges.
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Original geschrieben von unset
      - Warum heißt die Benutzertabelle phpbb_users?
      - Der erste/letzte Post eines Threads leitet sich doch vom Postdatum ab
      - Posts haben offensichtlich keine Titel
      - Statt Thread-Name sollte der Titel des ersten Posts genommen werden

      Ansonsten für ein sehr simples Forensystem vermutlich brauchbar. Für eine wirkliche Beurteilung fehlt aber noch einiges.
      Danke für deine schnelle Antwort!

      Die Tabelle heisst phpbb_users, weil sie noch aus einer Zeit stammt, in der meine Community noch auf phpbb aufgebaut war. Wenn ich mal dazu komme, kriegt die nen anderen Namen.

      Hmm, warum sollen Posts einen Titel haben? Das hab ich noch nie verstanden :-D

      Der erste/letzte Post eines Threads leitet sich doch vom Postdatum ab
      Stimmt... Also könnte ich diese beiden Spalten entfernen, oder? (last_post_id und first_post_id)

      Was fehlt denn noch alles für eine Beurteilung? Werde die Informationen gerne posten!

      Mfg
      Seggl
      Zuletzt geändert von Seggl-hoch-drei; 27.03.2008, 14:05.
      Tempim.de - Dein kostenloser Bildhoster
      Tipps und Tricks für Webmaster

      Kommentar


      • #4
        Wo ist für dich der Unterschied zwischen einem Thema und einem Thread?

        Stimmt... Also könnte ich diese beiden Spalten entfernen, oder? (last_post_id und first_post_id)
        Also idr. erhält man diese beiden spalten, weil Sie die Erstellung der Forenübersicht erleichtern.

        Hmm, warum sollen Posts einen Titel haben? Das hab ich noch nie verstanden :-D
        Ich glaube das ist weniger für diese Threadansicht (wie hier im Forum relevant) als für Foren, du nicht nur auf einen Thread antworten kannst, sondern direkt auf einen Beitrag.

        Kommentar


        • #5
          Der Unterschied zw. einem Thema und einem Thread ist folgender:

          Kategorie 1
          --Thema 1
          --- Thread 1
          --- Thread 2
          --- Thread 3
          --Thema 2
          ---Thread 1
          ---Thread 2
          --Thema 3
          ---Thread 1

          Kategorie 2
          --Thema 1
          ---Thread 1
          ---Thread 2
          --Thema 2
          ---Thread 1

          usw.... usw...
          Im Thema werden also alle threads aufgelistet, auf die User antworten können. User können auch selber Threads erstellen. Themen können nur Admins erstellen.

          Also idr. erhält man diese beiden spalten, weil Sie die Erstellung der Forenübersicht erleichtern.
          Aber spricht das nicht gegen die Normalformen? Ich müsste ja bei jedem erstellen / löschen eines Beitrags diese IDs updaten.


          MfG Seggl
          Tempim.de - Dein kostenloser Bildhoster
          Tipps und Tricks für Webmaster

          Kommentar


          • #6
            Aber spricht das nicht gegen die Normalformen? Ich müsste ja bei jedem erstellen / löschen eines Beitrags diese IDs updaten
            Ja, tut es.

            Kommentar


            • #7
              Hmm
              die frage ist jetzt: Machen oder nicht machen? :-D

              Ich glaube, ich lass das erstmal drin. später kann ichs ja immernoch entfernen!

              Jetzt hab ich noch ein Problem mit meinem SQL-Query zur Forenübersicht:

              PHP-Code:
              SELECT kategorien.category_idkategorien.category_orderkategorien.category_name,
                     
              themen.thema_idthemen.category_idthemen.thema_name
                     
              threads.thread_idthreads.thema_idthreads.thread_namethreads.thread_last_post_id,
                     
              userdaten.user_iduserdaten.username,
                     
              info.post_idinfo.poster_idinfo.post_timeinfo.thread_id       
              FROM forum_kategorien 
              AS kategorien
                   INNER JOIN forum_themen 
              AS themen
                   INNER JOIN forum_threads 
              AS threads
                   INNER JOIN forum_post_info 
              AS info
                   INNER JOIN phpbb_users 
              AS userdaten
              ON   kategorien
              .category_id themen.category_id &&
                   
              themen.thema_id threads.thema_id &&
                   
              info.thread_id threads.thread_id &&
                   
              userdaten.user_id info.poster_id 
              Diese Abfrage liefert mir jeweils Kategorien, bei denen schon ein thread und ein thema existiert.

              Wie krieg ich das jetzt in EINER Abfrage hin, dass auch leere Kategorien und leere Themen angezeigt werden?

              Geht das überhaupt in einer einzigen Abfrage?

              Seggl
              Tempim.de - Dein kostenloser Bildhoster
              Tipps und Tricks für Webmaster

              Kommentar


              • #8
                Original geschrieben von Seggl-hoch-drei
                Wie krieg ich das jetzt in EINER Abfrage hin, dass auch leere Kategorien und leere Themen angezeigt werden?
                LEFT JOIN statt INNER JOIN
                Gruss
                H2O

                Kommentar


                • #9
                  Danke!
                  Das klappt soweit sehr gut.

                  Ich melde mich bei weiteren Problemen wieder ;-)

                  Hier mein aktueller Code:
                  PHP-Code:
                  SELECT kategorien.category_idkategorien.category_orderkategorien.category_name,
                         
                  themen.thema_id,  themen.thema_name
                         
                  threads.thread_idthreads.thema_idthreads.thread_namethreads.thread_last_post_id,
                         
                  userdaten.user_iduserdaten.username,
                         
                  info.post_idinfo.poster_idinfo.post_timeinfo.thread_id    
                  FROM forum_kategorien 
                  AS kategorien
                      LEFT JOIN forum_themen 
                  AS themen
                          ON   kategorien
                  .category_id themen.category_id 
                      LEFT JOIN forum_threads 
                  AS threads
                          ON themen
                  .thema_id threads.thema_id 
                      LEFT JOIN forum_post_info 
                  AS info
                          ON info
                  .thread_id threads.thread_id
                      LEFT JOIN phpbb_users 
                  AS userdaten
                          ON     userdaten
                  .user_id info.poster_id
                  ORDER BY kategorien
                  .category_order 
                  Tempim.de - Dein kostenloser Bildhoster
                  Tipps und Tricks für Webmaster

                  Kommentar


                  • #10
                    Neues Problem

                    Hallo,

                    es gibt ein neues Problem!
                    Ich möchte jetzt zusätlich noch die Anzahl der Beiträge und die Anzahl der Threads in den Themen ermitteln.

                    Mein bisheriger code für die Gesamtübersicht:

                    PHP-Code:
                    SELECT kategorien.category_idkategorien.category_orderkategorien.category_name,
                           
                    themen.thema_id,  themen.thema_name
                           
                    threads.thread_name,
                           
                    userdaten.user_iduserdaten.username,
                           
                    info.post_idinfo.poster_idinfo.post_timeinfo.thread_id    
                    FROM forum_kategorien 
                    AS kategorien
                        LEFT JOIN forum_themen 
                    AS themen
                            ON   kategorien
                    .category_id themen.category_id 
                        LEFT JOIN forum_threads 
                    AS threads
                            ON themen
                    .thema_id threads.thema_id 
                        LEFT JOIN forum_post_info 
                    AS info
                            ON info
                    .thread_id threads.thread_id
                        LEFT JOIN phpbb_users 
                    AS userdaten
                            ON     userdaten
                    .user_id info.poster_id
                    ORDER BY kategorien
                    .category_order ASCthemen.thema_id ASCinfo.post_time ASC 
                    Bei jedem Durchlauf von mysql_Fetch_object wende ich noch das an:

                    PHP-Code:
                    $anzahlen $connection->sql_query("
                    SELECT 
                    (
                    SELECT COUNT(*) FROM forum_threads WHERE thema_id="
                    .$row->thema_id."
                    ) AS themenanzahl, 
                    (
                    SELECT COUNT(*) 
                    FROM forum_post_info AS info 
                    INNER JOIN forum_threads AS threads 
                    ON info.thread_id = threads.thread_id 
                    WHERE threads.thema_id="
                    .$row->thema_id."
                    ) AS beitragsanzahl"
                    );                                        //ermitteln der themenanzahl und der beitragsanzahl
                        
                    $anzahlen mysql_fetch_array($anzahlen); 

                    Leider bedeutet das sehr viel DB-Belastung (36 Anfragen pro Seitenaufruf)

                    Kann ich das irgendwie mit in die JOINS einbauen? Wenn ja, wie?
                    Ich möchte am Schluss eine Gesamtübersicht über alle Kategorien und Themen haben, inklusive der Anzahl der Beiträge und Threads in den Themen!
                    Ich Gooogle shcon seit Stunden und finde nicht wirklich das, was ich brauche.


                    Mfg
                    Seggl
                    Zuletzt geändert von Seggl-hoch-drei; 27.03.2008, 23:11.
                    Tempim.de - Dein kostenloser Bildhoster
                    Tipps und Tricks für Webmaster

                    Kommentar


                    • #11
                      Re: Neues Problem

                      Original geschrieben von Seggl-hoch-drei
                      Kann ich das irgendwie mit in die JOINS einbauen? Wenn ja, wie?
                      Über JOINS geht das wahrscheinlich nicht. Aber versuch mal, diese Abfragen als Subselects einzubauen:
                      PHP-Code:
                      SELECT 
                          k
                      .category_id
                          
                      k.category_order
                          
                      k.category_name,
                          
                      t.thema_id,  
                          
                      t.thema_name
                          
                      tr.thread_name,
                          
                      u.user_id
                          
                      u.username,
                          
                      i.post_id
                          
                      i.poster_id
                          
                      i.post_time
                          
                      i.thread_id,
                          (
                              
                      SELECT
                                  COUNT
                      (*)
                              
                      FROM
                                  forum_threads tr2
                              WHERE
                                  tr2
                      .thema_id tr.thema_id 
                          
                      )    themenanzahl,
                          (
                              
                      SELECT
                                  COUNT
                      (*)
                              
                      FROM
                                  forum_post_info i2
                              INNER JOIN
                                  forum_threads tr3 USING
                      (thread_id)
                              
                      WHERE
                                  tr3
                      .thema_id tr.thema_id 
                          
                      )    beitragsanzahl
                      FROM 
                          forum_kategorien 
                      AS k
                      LEFT JOIN 
                          forum_themen 
                      AS t ON USING(category_id
                      LEFT JOIN 
                          forum_threads 
                      AS tr USING(thema_id)
                      LEFT JOIN 
                          forum_post_info 
                      AS i USING(thread_id)
                      LEFT JOIN 
                          phpbb_users 
                      AS u ON userdaten.user_id info.poster_id
                      ORDER BY 
                          k
                      .category_order ASC
                          
                      t.thema_id ASC
                          
                      i.post_time ASC 
                      Da ich schreibfaul bin, habe ich die Aliases etwas gekürzt. Ungetestet!
                      Gruss
                      H2O

                      Kommentar


                      • #12
                        Ich bedanke mich!
                        So klappt die Sache.

                        Hier mein Code für die Forenübersicht:

                        PHP-Code:
                        SELECT 
                            kategorien
                        .category_id
                            
                        kategorien.category_order
                            
                        kategorien.category_name,
                            
                        themen.thema_id,  
                            
                        themen.thema_name
                            
                        threads.thread_name,
                            
                        userdaten.user_id
                            
                        userdaten.username,
                            
                        infos.post_id
                            
                        infos.poster_id
                            
                        infos.post_time
                            
                        infos.thread_id,
                            (
                                
                        SELECT
                                    COUNT
                        (*)
                                
                        FROM
                                    forum_threads 
                        AS threads2
                                WHERE
                                    threads2
                        .thema_id threads.thema_id 
                            
                        )  AS  themenanzahl,
                            (
                                
                        SELECT
                                    COUNT
                        (*)
                                
                        FROM
                                    forum_post_info 
                        AS infos2
                                INNER JOIN
                                    forum_threads 
                        AS threads3 USING(thread_id)
                                
                        WHERE
                                    threads3
                        .thema_id threads.thema_id 
                            
                        )  AS  beitragsanzahl
                        FROM 
                            forum_kategorien 
                        AS kategorien
                        LEFT JOIN 
                            forum_themen 
                        AS themen USING(category_id
                        LEFT JOIN 
                            forum_threads 
                        AS threads USING(thema_id)
                        LEFT JOIN 
                            forum_post_info 
                        AS infos USING(thread_id)
                        LEFT JOIN 
                            phpbb_users 
                        AS userdaten ON userdaten.user_id infos.poster_id
                        ORDER BY 
                            kategorien
                        .category_order ASC
                            
                        themen.thema_id ASC
                            
                        infos.post_time ASC 
                        Alleine wär ich da nie drauf gekommen....

                        Jetzt bin ich gerade dabei, die Übersicht der Threads in den einzelnen Themen zu machen.
                        Da hab ich auch schon alles bis auf den Usernamen und die User_id des Autors und des Letzten Poster.

                        Meine bisherige Abfrage:

                        PHP-Code:
                        SELECT 
                            threads
                        .thread_namethreads.thread_id
                            
                        info.poster_id,  info.post_time,
                            
                        userdaten.username
                            
                        themen.thema_name,
                            (
                                
                        SELECT
                                    COUNT
                        (*)
                                
                        FROM
                                    forum_post_info 
                        AS infos2                    
                                WHERE
                                    infos2
                        .thread_id threads.thread_id 
                            
                        ) AS beitragsanzahl    
                        FROM forum_threads 
                        AS threads
                        INNER JOIN forum_post_info 
                        AS info
                            ON info
                        .thread_id threads.thread_id
                        INNER JOIN forum_themen 
                        AS themen
                            ON themen
                        .thema_id threads.thema_id
                        LEFT JOIN phpbb_users 
                        AS userdaten
                            ON info
                        .poster_id userdaten.user_id
                        WHERE threads
                        .thema_id ".$thema."
                        ORDER BY info.post_time DESC 

                        Ich habe schon versucht, eine Subquery in dieser Form einzubauen:

                        PHP-Code:
                        (
                                
                        SELECT
                                    userdaten2
                        .username
                                FROM
                                    phpbb_users 
                        AS userdaten2
                                INNER JOIN
                                    forum_post_info 
                        AS infos3
                                ON 
                                    infos3
                        .poster_id userdaten2.user_id
                                WHERE
                                    infos3
                        .poster_id = (SELECT poster_id FROM forum_post_info WHERE post_time = (SELECT MIN(post_timeFROM forum_post_info WHERE thread_idthreads.thread_id))
                            ) AS 
                        last_poster_name 
                        Hier sagt mir MySQL aber:
                        #1242 - Unterabfrage lieferte mehr als einen Datensatz zurück
                        Wie könnte man das machen?
                        Ich weiß, dass der erste poster immer die niedrigste, zur thrad_id gehöroge post_time hat und der letzte immer die höchste post_time.
                        Aber was ist, wenn jetzt 2 User zufällig genau zur gleichen Zeit einen Beitrag schreiben? Dann gehts ja nichtmehr, weil der Timestamp doppelt da ist.

                        Ich bin ratlos :-(
                        Zuletzt geändert von Seggl-hoch-drei; 28.03.2008, 13:30.
                        Tempim.de - Dein kostenloser Bildhoster
                        Tipps und Tricks für Webmaster

                        Kommentar


                        • #13
                          habs selbst gelöst:

                          PHP-Code:
                          SELECT 
                              threads
                          .thread_namethreads.thread_id
                              
                          info.poster_id,  info.post_time,
                              
                          userdaten.username
                              
                          themen.thema_name,
                              
                          erster_post.poster_id AS first_poster_idfirst_user_name.username AS authorname,
                              
                          letzter_post.poster_id AS last_poster_idlast_user_name.username AS last_poster_name,
                              (
                                  
                          SELECT
                                      COUNT
                          (*)
                                  
                          FROM
                                      forum_post_info 
                          AS infos2                    
                                  WHERE
                                      infos2
                          .thread_id threads.thread_id 
                              
                          ) AS beitragsanzahl
                          FROM forum_threads 
                          AS threads
                          LEFT JOIN     
                          (
                              
                          SELECT
                                  poster_id
                          post_idpost_timethread_id
                              FROM
                                  forum_post_info
                              WHERE
                                  post_id 
                          = (
                                                  
                          SELECT 
                                                      MIN
                          (post_id)
                                                  
                          FROM
                                                      forum_post_info 
                          AS p2
                                                  WHERE 
                                                      p2
                          .thread_id forum_post_info.thread_id
                                                  GROUP BY
                                                      p2
                          .thread_id                                    
                                              
                          )
                          ) AS 
                          erster_post 
                          ON erster_post
                          .thread_id threads.thread_id
                          INNER JOIN phpbb_users 
                          AS first_user_name
                              ON first_user_name
                          .user_id erster_post.poster_id
                          LEFT JOIN
                          (
                              
                          SELECT
                                  poster_id
                          post_idpost_timethread_id
                              FROM
                                  forum_post_info
                              WHERE
                                  post_id 
                          = (
                                                  
                          SELECT 
                                                      MAX
                          (post_id)
                                                  
                          FROM
                                                      forum_post_info 
                          AS p2
                                                  WHERE 
                                                      p2
                          .thread_id forum_post_info.thread_id
                                                  GROUP BY
                                                      p2
                          .thread_id                                    
                                              
                          )
                          ) AS 
                          letzter_post
                          ON  letzter_post
                          .thread_id threads.thread_id
                          INNER JOIN phpbb_users 
                          AS last_user_name
                              ON last_user_name
                          .user_id letzter_post.poster_id
                          INNER JOIN forum_post_info 
                          AS info
                              ON info
                          .thread_id threads.thread_id
                          INNER JOIN forum_themen 
                          AS themen
                              ON themen
                          .thema_id threads.thema_id
                          LEFT JOIN phpbb_users 
                          AS userdaten
                              ON info
                          .poster_id userdaten.user_id
                          WHERE threads
                          .thema_id ".$thema."
                          ORDER BY info.post_time DESC 
                          bei weiteren fragen komme ich wieder auf euch zurück :-D
                          nochmal danke an alle, die bisher geholfen haben!
                          Tempim.de - Dein kostenloser Bildhoster
                          Tipps und Tricks für Webmaster

                          Kommentar


                          • #14
                            Hehe, jetzt weißt du, was ich damit meinte:
                            Stimmt... Also könnte ich diese beiden Spalten entfernen, oder? (last_post_id und first_post_id)
                            Also idr. erhält man diese beiden spalten, weil Sie die Erstellung der Forenübersicht erleichtern.

                            Kommentar


                            • #15
                              ja, hätte ich nur auf dich gehört :-D
                              aber jetzt gehts ja auch so

                              und außerdem wars ne nette übung, um das wissen über subqueries und joins aufzubessern :-)
                              Tempim.de - Dein kostenloser Bildhoster
                              Tipps und Tricks für Webmaster

                              Kommentar

                              Lädt...
                              X