ilch Forum » Ilch Clan 1.1 » Kritik und Verbesserungen » Anzahl der Foren-Posts eines Benutzers

Geschlossen
  1. #1
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.401
    Beitragswertungen
    389 Beitragspunkte
    Hallo,

    aufgrund eines kleinen Malheurs habe ich mich bisschen damit beschäftigt, wie Ilch die Anzahl der Foren-Posts eines Benutzers ermittelt bzw. speichert und habe nun paar Fragen, die ich hier loswerden möchte.

    Kurz zur Vorgeschichte:
    Vermutlich wurden die Foren-Kategorien versehentlich gelöscht. Damit verbunden war, dass das Forum komplett gelöscht war. Das partielle (:D) Einspielen eines Datenbank-Backups machte diesen Fauxpas rückgängig.
    Das Backup war (leider) nicht aktuell genug und so gingen zwei Foren-Posts verloren (tägliches Backup). Mir ist dann aufgefallen, dass die Anzahl der Posts des Benutzers dennoch unverändert geblieben ist (obwohl nachweislich zwei Posts weniger). Soweit ich weiß waren die Posts aller Nutzer auch nicht auf 0, obwohl das Forum komplett gelöscht wurde.

    Die Anzahl der Beiträge eines Benutzer werden in der Tabelle "prefix_user" in der Spalte "posts" abgelegt und vermutlich beim Erstellen eines Posts inkrementiert bzw. beim Löschen eines Posts dekrementiert. Das habe ich jetzt nicht im Code überprüft, sondern einfach ausprobiert.

    In der user_details.php und memb_list.php (include\contents\user\) wird dann unter anderem die oben genannte Spalte abgefragt, sowie im Falle von user_details.php noch die Posts pro Tag berechnet.

    user_details.php
    ...
    $abf = 'SELECT * FROM prefix_user WHERE id = "'.$uid.'"';
    $erg = db_query($abf);
    ...
    	$regsek = mktime ( 0,0,0, date('m'), date('d'), date('Y') )  - $row['regist'];
    	$regday = round($regsek / 86400);
    	$postpday = ( $regday == 0 ? 0 : round($row['posts'] / $regday, 2 ) );
    ...

    memb_list.php: Zeile 44-53

    In der Tabelle "prefix_posts" werden sämtliche Forenbeiträge abgelegt. Diesen Forenbeiträgen kann natürlich auch ein Benutzer zugeordnet werden (Spalte "erstid").

    Jetzt frage ich mich wieso überhaupt die Anzahl der Posts als "prefix_user"."posts" abgelegt wird?

    Es wäre ja auch möglich mit z.B. folgender Abfrage zu ermitteln, wie viele Posts ein Benutzer erstellt hat:
    SELECT count(*) FROM prefix_posts WHERE erstid=1;

    dev.mysql.com/doc/refman/5.1/de/counting-rows.html

    So wäre vielleicht die Spalte "posts" in "prefix_user" komplett überflüssig, sowie Code zum Inkrementieren und Dekrementieren der Anzahl an Posts.
    Wenn in der Tabelle "prefix_user" in der Spalte "posts" wirklich nur die Anzahl der Forenbeiträge hinterlegt sind, müsste man auch nicht dutzende Tabellen abfragen und dann zusammenrechnen, wie viele Posts ein Benutzer hat. Die eine SQL-Abfrage mit dem "count(*)" würde reichen.

    Oder gab es da bedenken betreffend der Performance bei größeren Datenbanken?
    stackoverflow.com/questions/6069237/fastest-way-to-count-exact-number-of-rows-in-a-very-large-table

    Ich habe jetzt nicht ausprobiert ob das unterm Strich Code-Zeilen und Komplexität reduzieren würde oder keinen negativen Effekt auf die Performance hat.

    Wie das in Ilch 2.0 ist, habe ich auch nicht nachgeschaut.

    Grüße
    blackcoder


    verwendete ilch Version: 1.1 P


    Zuletzt modifiziert von blackcoder am 11.10.2014 - 16:33:04
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    Outi77 Mitglied
    Registriert seit
    31.03.2013
    Beiträge
    1.337
    Beitragswertungen
    143 Beitragspunkte
    Vermutlich ist das Abfragen einer einzelnen Spalte (prefix_user) performanter als das Zählen aller Spalten zu einer bestimmten UserID (prefix_posts).
    Die richtige Formulierung eines Problems ist nicht selten bereits die halbe Lösung.
    »Albert Einstein«
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Rock@wulf Hall Of Fame
    Registriert seit
    03.06.2004
    Beiträge
    3.282
    Beitragswertungen
    239 Beitragspunkte
    Outi77 bringt es auf den Punkt.


    Wenn man die Post eines Users auf einer Count basierender Abfrage ermitteln würde, ginge das evtl für einen einzelnen ohne Probleme.

    Aber wenn man dann ein Forenthema ansieht müsste das ganze für n Benutzer x mal ablaufen. z.B.

    Ersteller
    Antworter 1
    Antworter 2
    Antworter 3
    Ersteller
    Antworter 1
    Ersteller

    =3 mal die gleiche Abfrage für den Ersteller, 2 mal für den Antworter 1 , je einmal für Antworter 2&3

    Macht im Ganzen 7 Mal Count DB.

    So wie es momentan Funktioniert wird die Datenbank einmal abgefragt und der wert nur bei Änderungen extra behandelt.


    Gruß
    Meine Postings repräsentieren meine Meinung wenn nicht anders gekennzeichnet.
    MFG Rock@wulf
    1 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.401
    Beitragswertungen
    389 Beitragspunkte
    Danke für die Antworten. lächeln

    Ist der Fall, dass die Anzahl der Posts der Benutzer unverändert bleibt, obwohl das komplette Forum gelöscht wurde so geplant?
    Könnte ja sein im Hinblick darauf, dass man wohl für jeden Benutzer Abfragen bräuchte. Z.B. 1x Select um die Anzahl zu bekommen und 1x Update um die Anzahl der Posts in der DB zu aktualisieren. traurig


    Zuletzt modifiziert von blackcoder am 12.10.2014 - 09:55:27
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    Siggi Hall Of Fame
    Registriert seit
    08.02.2007
    Beiträge
    6.558
    Beitragswertungen
    327 Beitragspunkte
    Dann muss du erst alle posts mit der forenid auslesen und die user dann die userids zusammen rechnen und das bei jeden User die in den Forum was geschrieben haben dann von den posts löschen
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu Kritik und Verbesserungen

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten