Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Neue Beiträge in Threads (https://www.delphipraxis.net/104021-neue-beitraege-threads.html)

Valle 26. Nov 2007 11:25


Neue Beiträge in Threads
 
Guten Morgen,

ich habe seit einiger Zeit ein eigenes Forum (in PHP) und möchte es jetzt ein wenig optimieren. Wir haben mittlerweile 3000 Posts in 250 Threads und man merkt, dass die Datenbank langsam aber sicher überfordert wird.
Mein Problem ist, die Anzeige von neuen Posts. Ich habe in der User-Tabelle eine Spalte hinzugefügt, in der jeder Thread mit seinem letzen Update (letzten Post) via CSV gespeichert ist. Sieht dann ungefähhr so aus:

Code:
ID:Timestamp,...
35:2735907,26:0873593,92:8620735
Prinzip sollte klar sein, wenn nicht, einfach fragen. Das ganze geht, wie ich es hätte vorher wissen sollen, enorm auf die Performance. Außerdem verlangen meine User nach einer Möglichkeit, alle Themen als "Gelesen" zu markieren, was aktuell natürlich etwas lastig für MySQL ist.
Wie kann ich das jetzt am besten anstellen? Wie hat es denn die DP oder andere Foren gemacht? Ich möchte mich jetzt nur extrem ungern in andere Forensysteme einarbeiten...

Danke für eure Hilfe!

Mit freundlichen Grüßen,

Valle

mkinzler 26. Nov 2007 12:19

Re: Neue Beiträge in Threads
 
bei richtigem Schema und Indizes sollte eine derartige Redundanz überflüssig sein

Phoenix 26. Nov 2007 12:20

Re: Neue Beiträge in Threads
 
Zitat:

Zitat von Valle
Wie hat es denn die DP oder andere Foren gemacht?

Unter der Haube der DP werkelt immernoch ein - wenn auch ziemlich aufgemotztes - phpBB.

generic 26. Nov 2007 12:30

Re: Neue Beiträge in Threads
 
Stichwört ist wohl Caching.

Ein Forum ändert sich eigendlich kaum. Es wir eigendlich fast nur lesend drauf zugegriffen.
Daher kannst du die Seiten prima Cachen.

Daniel 26. Nov 2007 12:47

Re: Neue Beiträge in Threads
 
hm.
Wenn ich das Problem richtig verstehe, geht es doch um die server-seitige Kennzeichnung, welcher Beitrag gelesen wurde und welcher nicht. Das ist doch gerade ein hoch-dynamischer Bereich in einem Forum.

Deine Architektur hierfür ist suboptimal. 3.000 Beiträge sollte jede Datenbank (die diesen Namen verdient) locker wegschnupfen. Rauf und runter.

Nach Deinem Ansatz musst Du mit jedem neuen Beitrag / Thema die komplette User-DB neu schreiben, um diesen Timestamp festhalten zu können. Aber warum? Halte doch einfach in jedem Thema den Zeitstempel der letzten Editierung / des letzten Beitrages fest. Und wenn es dann in der Themenliste um die Anzeige geht, vergleichst Du diesen Zeitstempel mit dem Datum des letzten Besuches des Users und hast das, was Du im Moment auch schon hast, deutlich einfacher erreichen können. Aber auch das ist nur eine grobe Abschätzung der gelesenen / ungelesenen Beiträge.


Insgesamt ist diese Angelegenheit ein wenig tricky, wenn sie mit wenigen Ressourcen auskommen soll, was bei Foren-Systemen fast immer der Fall ist. Greife Dir mal beispielsweise ein phpBB 3 und schaue, wie das dort gelöst ist. Du wirst auf eine nennenswerte Menge an Code stoßen, die sich um diese Aufgabe kümmert. Aber wenn Deine User ein zuverlässiges System haben wollen und Du etwas lernen möchtest, ist das Studieren von bereits existierenden Lösungen nicht verkehrt. Andernfalls nimm' einfach eine fertige Lösung und passe sie Deinen Erfordernissen an. Ich würde heute keine eigene Foren-Software mehr schreiben wollen.

JamesTKirk 26. Nov 2007 13:06

Re: Neue Beiträge in Threads
 
Sers!

Hast mich doch tatsächlich dazu gebracht in den Sourcen meines PHPBBs (mit installiertem Categories Hierarchy Mod) nachzuschauen... scheinbar is es dort so gelöst, dass die Daten, ob ein Topic schon gelesen wurde, in Cookies gespeichert werden (irgendwie abhängig vom letzten Besuchsdatum). Genauer hab ichs mir allerdings nicht angeschaut, da ich grad nicht schlau aus dem Code wurde... :roll:
Es würde aber erklären, warum mein Forum Probleme mit der Anzeige der ungelesenen Topics hatte, als ich die Einstellungen der Cookies verhunzt hatte :mrgreen:

Für genaueres würde ich dir - wie Daniel auch - empfehlen in den Sourcen fertiger Forensoftware zu schauen, wie die das gelöst haben...

Valle 26. Nov 2007 13:57

Re: Neue Beiträge in Threads
 
Zitat:

Zitat von Daniel
Deine Architektur hierfür ist suboptimal. 3.000 Beiträge sollte jede Datenbank (die diesen Namen verdient) locker wegschnupfen. Rauf und runter.

Irgendwie ist das in dem Zusammenhang etwas widersprüchlich. Die 3.000 Beiträge sind für die Datenbank natürlich nichts, das meinte ich damit auch nicht. Es ging mir um meine Art, zu speichern, ob ein Thread seit dem letzten lesen sich geändert hat. Dabei muss der String in einer bestimmten Spalte in der User-Tabelle mit 2 Explode's auseinander genommen werden. Das übernimmt PHP für mich. Ach, was rede ich, ein Code sagt mehr als 1000 Worte. :mrgreen:

Code:
if (!isset($_SESSION['id'])) return false;
$readen = explode("|", $_SESSION['threads_readen']);
foreach ($readen as $r) {
  $e = explode("-", $r);
  if ($e[0] == $thread) {
    return ($e[1] < $update);
  }
}
return true;
Dieses Prinzip kann auf Dauer nicht gut gehen. Ich werde eurem Vorschlag, mir mal andere Forensysteme genauer anzuschauen nachgehen, auch wenn ich schon ahne, auf was ich mich da einlasse. :|

Mit freundlichen Grüßen,

Valle

JamesTKirk 26. Nov 2007 14:18

Re: Neue Beiträge in Threads
 
Was hältst du davon das Datum des letzten Besuches zu speichern (bzw. des letzten Seitenaufrufs, bei dem man eingeloggt ist) (pro User natürlich ;) ) und dann dieses mit den Daten (hier: Mehrzahl von Datum) der Posts zu vergleichen. Wenn das Datum eines Posts jünger als das des Besuches ist, is der Beitrag neu bzw. in dem Topic was hinzugekommen.

Das müsste doch viel einfacher zu bewerkstelligen sein. Sicher is es nicht das Gelbe vom Ei, aber vermutlich schneller... :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz