Neue und gelesene Themen

Radhad

Erfahrenes Mitglied
Hallo zusammen,

ich brauche nochmal ein paar Meinungen für mein Forum. Ich will jetzt umsetzen, dass neue & nicht gelesene Themen hervorgehoben werden. Dazu habe ich mir volgendes einfallen lassen:
  • wenn der User sich einloggt, wird "LetzterLogin" ausgegeben. Dieser wird danach bei jedem Seitenaufruf aktualisiert.
  • Themen mit neuen Beiträgen und nicht gelesenen Beiträgen sollen fett hervorgehoben werden sowie ein anderes icon haben
  • das selbe gilt für neue und ungelesene Beiträge
  • Beiträge die älter als der letzte Login ist (welcher in einer Session-Variable gespeichert wird) werden als gelesen markiert
  • beim erstellen eines Beitrages werden zu jeder UserID (außer der eigenen) ein Eintrag in einer Tabelle gemacht, wo PostID, ThreadID und UserID stehen. Wenn der Beitrag gelesen wurde, wird die Zeile aus der Tabelle gelöscht
  • Beim einloggen werden alle älteren Beiträge aus dieser tabelle gelöscht
Was denkt ihr darüber? Leidet da die Performance sehr drunter? Hat jemand gar eine andere, effizientere Idee?


Gruß Radhad
 
  • wenn der User sich einloggt, wird "LetzterLogin" ausgegeben. Dieser wird danach bei jedem Seitenaufruf aktualisiert.
  • Themen mit neuen Beiträgen und nicht gelesenen Beiträgen sollen fett hervorgehoben werden sowie ein anderes icon haben
  • das selbe gilt für neue und ungelesene Beiträge
  • Beiträge die älter als der letzte Login ist (welcher in einer Session-Variable gespeichert wird) werden als gelesen markiert
  • beim erstellen eines Beitrages werden zu jeder UserID (außer der eigenen) ein Eintrag in einer Tabelle gemacht, wo PostID, ThreadID und UserID stehen. Wenn der Beitrag gelesen wurde, wird die Zeile aus der Tabelle gelöscht
  • Beim einloggen werden alle älteren Beiträge aus dieser tabelle gelöscht
Ich denke, dass sich der erste und vierte Punkt nicht vertragen. Wenn bei jedem Seitenaufruf der Zeitpunkt des letzten Login aktualisiert wird und Beitraege die vor dem Zeitpunkt des letzten Logins automatisch als gelesen markiert werden sind automatisch immer alle Beitraege als gelesen markiert.
Ich handhabe das bei mir so:
Wenn ein Thread besucht wird wird dies in einer Tabelle festgehalten, ThreadID, UserID und Timestamp. Anhand dessen kann ich festmachen ob ein Post nach dem letzten Besuch in diesem Thread geschrieben wurde. Bei einem erneuten Besuch wird der Timestamp aktualisiert. So sind auch wirklich nur Threads als ungelesen markiert wo der User wirklich bisher nicht im Thread war nachdem der letzte Post geschrieben wurde.
Das bringt natuerlich bei wachsender User- und Threadzahl eine gewaltige Tabelle mit, darum ist mein naechster Schritt ein TimeOut fuer Posts einzubauen, sodass ein Post der nach einer Woche (mal so als Beispiel) automatisch als gelesen markiert wird ohne dass dafuer ein Eintrag in der Datenbank noetig waere. So koennen dann auch, durch eine eigene Garbage-Collection fuer diese Tabelle, alte Eintraege geloescht werden.
Das ganze ist jedoch bisher nur Ueberlegung, wie genau ich das angehe hab ich noch nicht ueberlegt, aber das wird wohl recht bald geschehen.
 
Bei Punkt eins habe ich mich falsch ausgedrückt: der Letzte Login als Timestamp wird in die Session-Variable geschrieben - beim einloggen! Danach wird bei jedem Seitenaufruf der Timestamp für den letzten Login in der Tabelle "user" aktualisiert. Gerade aus dem Problem heraus, dass die Tabellen so extrem anwachsen können, habe ich gedacht zu speichern, was noch nicht gelesen wurde. Allerdings ist das blöd bei Benutzern, die nie mehr vorbeischauen ...
 
Ich glaube sogar, dass Deine Variante, jeden ungelesenen Post zu speichern, noch viel mehr Daten aufwerfen duerfte als meine Variante wo festgehalten wird welche Threads besucht wurden.
Nehmen wir mal ein Beispiel:
Wir haben beide 10 User und jeder dieser User erstellt einen Thread, und antwortet auf einen anderen (der zuvor noch nicht beantwortet wurde). Das macht also insgesamt 20 Posts.
Das macht bei Dir ein theoretisches Maximum von 170 Eintraegen in der Datenbank (20 Posts, davon 3 gelesen, macht 17 ungelesene pro User, also 170), wenn ich mich grad nicht total verrechne.
Bei mir macht das 20 Eintraege (jeder User hat 2 Threads besucht, 10 User, also 20).
Wenn nun jeder User jeden Thread besucht hat und danach nicht mehr gepostet wurde schiess ich zwar auf 100 Eintraege hoch und Du wieder auf 0 runter, und in so einem kleinen Forum mag sowas noch recht moeglich sein, aber wenn sowas waechst wird sicher nicht jeder User jeden Thread besuchen, und auch nicht zwingen wiederholt, was bei Dir ja noetig waere um wieder neuere Eintraege loszuwerden.
Weiterhin muessen bei Deinem System bei jedem Post so viele Eintraege erstellt werden wie User existieren, was auch nicht gerade optimal ist wie ich finde.
Bei mir hingegen wird halt ein Eintrag erstellt (oder aktualisiert) wenn ein User einen Thread besucht.
Anhand des Beispiels wuerde ich also sagen dass mein System auf lange Sicht das bessere waere. Aber ob es wirklich optimal ist weiss ich auch noch nicht. In der aktuellen Fassung, ohne Ablauftermin fuer Posts, sicher noch nicht. Aber mit dem Ablauftermin fuer Posts duerfte sich auch die Groesse der Tabelle einigermassen in Grenzen halten.
 
Eines hast du nicht bedacht: ungelesene Posts, die vor dem letzten Login noch existieren, sollen gelöscht werden. Aber ich geb dir schon recht, deine Varainte ist besser als meine bisherige Überlegung. Wobei ich wie gesagt mit einbauen würde, zuvor nicht gelesene Threads als gelesen zu markieren. Allerdings versteh ich nicht, wie du realisieren willst, dass die Daten dann aus der Tabelle gelöscht werden.

Wäre es nicht sinnvoller, Themen die älter als > 6 Monate sind, und weder als "Wichtig" noch als "Ankündigung" markeirt wurden, automatisch in ein Archiv einzuordnen, wo man keine neuen Beiträöge erstellen darf? Dann könntest du zu den entsprechenden Themen die Daten der User löschen.


Gruß Radhad
 
Wie gesagt, genauere Gedanken zur Garbage-Collection hab ich mir noch nicht gemacht.
Aber das wird wohl naechste Woche dran sein. Ich denk mal, dass ich bis dahin all meine Scripts soweit ueberarbeitet hab (hab da noch ein paar Punkte auf meiner ToDo-Liste die ich vor dem Launch auf jeden Fall abarbeiten will) und anschliessend kann ich mir dann weitere Probleme ausdenken.
Ich werd die Garbage-Collection auf jeden Fall schonmal in meine ToDo-Liste aufnehmen damit ich auf jeden Fall dran denk mir da was einfallen zu lassen.
 
Ich speichere alle gelesenen Threads in der Sessions des Users bzw. alle, die nicht älter als 7 tage sind. Hat halt den Nachteil, dass alle alle gelesenen Threads nach nem logout wieder als ungelesen markiert werden, aber ich brauch halt keine Datenbanktabelle dafür die ja wie oben bereits erwähnt sehr groß würde.

Jemand ne Ahnung, wie es bei Burning Board oder so gemacht wird?
 
Hey, ich hole dieses Thema einfach mal aus der Versenkung weil ich gerade vor der selben Frage stehe. Ich habe hier leider nur dieses und ein weiteres Thema dazu gefunden.

Ich hatte den selben Gedanken wie Dennis, vielleicht kannst du dazu mittlerweile mehr sagen? Aber auch für andere Vorschläge und Tips bin ich offen. Vielen Dank.

Edit: Eine Lösung fällt mir sicher ein, mir geht es nur um die optimale Lösung, Performance wurde hier ja schon angesprochen.
 
Zuletzt bearbeitet:
Zurück