Forum/Thema gelesen, ungelesen - Anzeige

BartTheDevil89

Devilution Media
ID: 87739
L
2 Mai 2006
3.960
103
Hallöchen,

bin mal wieder an ner kleinen Arbeit dran...diesmal ist es ein Forum. Grundsätzlich läuft das ding auch schon mit dem Grundaufbau. Also ich kann Kategorien/Foren erzeugen, Themen erstellen, bearbeiten, löschen , Post erstellen, bearbeiten , löschen. Auch das letztes Thema anzeigen, etc. läuft schon.
Ich steh jetzt nur vor einem Problem. Und zwar das letzte Thema anzeigen:

Ich brauch noch ne Anzeige, ob in einem Forum ein neues Thema oder Antwort ist. Bzw. in nem Thread dann neue Antworten vorhanden sind.
Dazu hab ich im Netz schon bisschen rumgeschaut aber noch nicht so ganz das richtige gefunden, bzw. ne Idee. Eine Idee war ja das:

Idee 1 mit Datenbank
Grundidee:
Wenn in User ein Thema betrachtet, wird ein Datenbank-Eintrag erstellt, der User, Thread, Last_Visited beinhaltet.

Anzeige ob neue Antwort auf ein Thema:
Würde ja dann einfach so laufen, dass ich überprüfe, ob ein DB-Eintrag vorhanden ist für dieses Thema.
Wenn nein, dann ist das Thema unglesen.
Wenn ja, dann check ich, ob das Datum der letzten Änderung mit höher ist wie das Datum vom letzten Besuch. Wenn ja, dann ist das Ding auch unglesen.

Anzeige, ob Forum neue Antworten enthält:
Hier müsste ich solang diesen Check für alle Themen in dem Forum machen bis ich eins gefunden hab, das eine neue Antwort hat. Wenn ich das gefunden hab, dann hat das Forum auch was ungelesenes.

Meine Probleme, die ich seh
Problem ist hier vor allem die Serverlast. Denn erstens erstell ich für jedes gelesene Forum einen neuen Datenbankeintrag für jeden User. Würde also bedeuten bei 1000 Usern und 5000 Themen = im schlimmsten Fall 5000000 DB-Einträge.
Und natürlich die Checks. Auf Forenebene gehts wahrscheinlich noch. Bei 20 Themen/Seite sind das halt 20 Checks.
Aber auf Foreneben müsste ich ja alle Themen überprüfen.


Wie würdet ihr das lösen? Eventuell lieber über Cookies um die DB-Last zu nehmen? Oder ne Mischung aus DB und Cookies?

Bin auf Ideen gespannt...:roll:;)
 
Cookies? Was nen Quatsch :ugly:

Wenn ein Forum sich in dem Zustand befindet, dass alle Einträge gelesen wurden benötigst du gar nicht mehr für jeden Thread die Information, dass er gelesen wurde, du kannst einen Eintrag speichern der sagt, dass bis zu dem Zeitpunkt X im Forum Y alles gelesen wurde.
Wenn du nun den globalen Zeitstempel + additive für einzelne zusammen in einen Entwurf packst, hast du ein schön Datenbank schonendes Modell.
 
Cookies? Was nen Quatsch :ugly:
vB unterstützt Cookies zu diesem Zweck.

Und ich kenn auch mindestens ein Forum, was diese Einstellung verwendet. Is genial, weil man immer die Hälfte der Beiträge verpasst, weil das nie 100%ig zuverlässig is und nach ner gewissen Zeit der Keks abläuft :evil:

P.S. Irgendwo gibts schon einen Thread hierzu :think:
 
Hmh...also anscheinend komm ich nicht um die Datenbank - Variante rum...meine Idee deswegen mal zusammengefasst:

Tabelle
thread | forumid | user

Thema lesen
Ich trage in die Tabelle einen Eintrag ein, dass er das Ding gelesen hat.

Neue Antwort oder Thema wird gelöscht
Wenn ne neue Antwort zu einem Thema kommt (oder das Ding gelöscht wird), lösch ich einfach Alle Tabellen-Einträge in dieser Tabelle mit thread = ID

Thema gelesen / ungelesen
Einfach überprüfen, ob ein Tabelleneintrag für diesen Thread vorhanden ist.

Forum gelesen / ungelesen
Hier hab ich eh die Anzahl an Posts in dem Forum gespeichert. Dazu überprüf ich einfach, wie viele Einträge passend zu diesem Forum in der Tabelle sind. Wenn die Anzahl gleich ist, dann sind alle gelesen.

Müsste doch soweit dann eine genaue Übersicht darstellen. Oder seht ihr irgendwo Lücken?
Aber wie würdet ihr vielleicht noch dieses "Forum als gelesen markieren" und "Komplettes Forum als gelesen markieren" mit reinbringen? Denn klar ich könnte einfach für alle Themen nen Eintrag in die DB machen, aber vielleicht habt ihr ja ne Idee, die Ressourcensparender ist.
 
neija es ist schon arg dämlich den gesamte gelesen-Status zu löschen, wenn ein neuer Post in einem Thread kommt, ich möchte eigentlich doch genau wie hier im vBulletin direkt zu dem neuesten Post eines Threads springen.
 
neija es ist schon arg dämlich den gesamte gelesen-Status zu löschen, wenn ein neuer Post in einem Thread kommt, ich möchte eigentlich doch genau wie hier im vBulletin direkt zu dem neuesten Post eines Threads springen.

Hmh ok...wäre halt zu schön gewesen um DB-Last zu sparen^^...aber hast Recht. Ansonsten über die last_post - Id arbeiten?

Tabelle
thread | forumid | user | last_post

Thema lesen
Variante 1: Kein DB-Eintrag vorhanden, also Thema noch nicht gelesen: DB - Eintrag mit last_post = 0 setzen.
Variaten 2: DB-Eintrag vorhanden, also Thema schonmal gelesen: last_post auf 0 setzen

Neue Antwort
Wenn zum Thema ne neue Antwort kommt, dann für alle DB-Einträge, die last_post "0" haben, die neue Post-Id eintragen.

Thema wird gelöscht
Beim Löschen einfach den DB-Eintrag löschen.

Thema gelesen / ungelesen
Einfach überprüfen, ob ein Tabelleneintrag mit last_post = 0 für diesen Thread vorhanden ist.
Wenn kein Eintrag vorhanden bzw. last_post nicht 0, dann ist das Thema ungelesen.

Forum gelesen / ungelesen
Hier hab ich eh die Anzahl an Posts in dem Forum gespeichert. Dazu überprüfe ich einfach, ob ich ich bei 10 Forenthemen auch 10 DB-Einträge mit der forenid habe, die alle last_post = 0 haben. Wenn das der Fall ist, dann sind alle gelesen, ansonsten nicht.

Alle Themen als Gelesen markieren

Alle Foren als Gelesen markieren

Soweit sollte es doch jetzt funktionieren und auch einigermaßen Ressourcenschonend sein, oder?

Allerdings, wie das Alle Themen als Gelesen markieren bzw. auf Foren - Ebene alle Foren als gelesen markieren?
Hab ich damit die Chance noch DB-Einträge zu sparen? ;)
 
Soweit sollte es doch jetzt funktionieren und auch einigermaßen Ressourcenschonend sein, oder?
nein ist es nicht, da du bei Thema gelesen immer einen Eintrag erzeugst, du also für jeden Nutzer für jeden Thread einen Eintrag erstellt hast, das ist höchst ineffizient, wenn der Nutzer einen Thread noch nicht gelesen hat gibt es keinen Db-Eintrag, fertig aus.
Wie das System effizient funktionieren kann habe ich bereits beschrieben, wenn du darauf nicht eingehen wirst, werde ich mich auch ausklinken, denn ich mach mir nicht die Mühe mir ein effizientes System zu überlegen, wenn es von dir so oder so ignoriert wird.
 
nein ist es nicht, da du bei Thema gelesen immer einen Eintrag erzeugst, du also für jeden Nutzer für jeden Thread einen Eintrag erstellt hast, das ist höchst ineffizient, wenn der Nutzer einen Thread noch nicht gelesen hat gibt es keinen Db-Eintrag, fertig aus.
Wie das System effizient funktionieren kann habe ich bereits beschrieben, wenn du darauf nicht eingehen wirst, werde ich mich auch ausklinken, denn ich mach mir nicht die Mühe mir ein effizientes System zu überlegen, wenn es von dir so oder so ignoriert wird.

Danke für das Feedback und ich hab deine Idee mit dem "Wenn alle gelesen wurden, dann gibts einen Eintrag" nicht vergessen, denn der kommt in meinen Augen halt dann bei "Alle Themen als gelesen markieren" bzw. "Alle Foren als gelesen markieren". Und genau der Punkt ist eben noch bisschen das Problem. Aber stimmt natürlich, dass ich da mit Timestamps arbeiten muss.
Dann nochmal mit nem Timestamp und hoffentlich allem, was da rein sollte ;):

Tabelle
thread | forumid | user | last_activity

Thema lesen
Variante 1: Kein DB-Eintrag vorhanden, also Thema noch nicht gelesen: DB - Eintrag mit thread, forumid, user und last_activity
Variaten 2: DB-Eintrag vorhanden, also Thema schonmal gelesen: last_activity setzen

Neue Antwort
nix tun außer datum des letzten Posts ändern, sodass sich der timestamp dran orientieren kann

Thema wird gelöscht
Beim Löschen alle alten DB-Einträge löschen

Thema gelesen / ungelesen
1. globalen Eintrag mit threadid = 0 und forenid überprüfen
2. Überprüfen ob ein last_activity - DB - Eintrag vorhanden ist, der neuer ist wie der letzten Post

Forum gelesen / ungelesen
1. globalen mit threadid = 0 und forenid = 0 überprüfen
2. globalen mit threadid = 0 und forenid überprüfen
3. ??? (alle Themen durchprüfen auf last_activity??)

Alle Themen als Gelesen markieren
Wenn ich alle Themen in einem Forum gelesen habe bzw. den Button nutze: Alle DB-Einträge mit forumid und user löschen -> 1 Eintrag mit threadid = 0 und forumid setzen

Alle Foren als Gelesen markieren
Wenn ich alle Foren als gelesen markiert habe oder eben Button, dann alle Einträge zum user löschen und einen mit forumid = 0 threadid = 0 zum user setzen.

Ich hoffe ich hab jetzt ungefähr das umgesetzt, wie du es gemeint hast. Wobei mir noch nicht ganz verständlich ist, wie ich manche Sachen programmiertechnisch am beste umsetze (zum beispiel Forum in der 3. Ebene, also auf Themenebene auf ungelesen überprüfen) ohne die Performance wieder richtig leiden zu lassen...

Danke auf jedenfall für die Hilfe