Eigenes Forum: Ungelesene Beiträge
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
array
attribut
benutzer
code
dank
darstellung
datenbank
datum
frage
glauben
idee
liste
optimieren
performance
problem
speichern
tabelle
umgang
vorliegen
wachsen
-
Hi,
Ich bin gerade dabei ein Forum für eine Community zu schreiben. Nun will ich auch ein Feature implementieren, dass der User sieht ob es ungelesene Beiträge in einem Thread gibt (also praktisch das selbe Feature wie bei phpbb wenn dieser Punkt vor dem Threadnamen rot wird.).
Meine Frage ist also wie man soetwas am ressourcenschonendsten Implementieren kann. Ich hab schon mal gegoolet, und dort hab ich folgende Variante gefunden:
Jeder Benutzer bekommt zu jedem Tread einen Timestamp wann er diesen Thread das letzte mal gelesen hat. Und wenn der Letzte Beitrag nach diesem Timestamp liegt ist gibt es logischerweise ungelesene beiträge.
Nun weiß ich nicht ob das wirklich die effektivste Möglichkeit ist, denn dazu müsste ich ja zu jedem Benutzer einen (immer grösser werdenden) assoziativen Array speichern, und alleine das umwandeln in einen String (damit ich es in eine Datenbank speichern kann) braucht schon eine gewisse Zeit.
Gibt es also noch effektivere Lösungen?
Danke schon mal.
Lg Ketchupfleck
P.S.: Nein die Programmiersprache wird nicht PHP, aber das ist auch für euch egal, denn ich will sowieso keinen Code sondern nur einen Denkanstoß. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hm du könntest jetzt für jeden Tread eine Tabelle anlegen in der User und letzter Besuch stehen, besucht der gleiche User den Tread ein 2. Mal wird der bestehende Eintrag mit der neuen Zeit überschrieben. Dann hättest du eine einfache Tabelle (die auch deutlich besser wachsen kann als ein Array und dabei ROM nicht RAM benötigt und eine zusätzliche Abfrage wobei das natürlich genauso gut langsamer sein kann als deine Lösung)
Bei der Anzeige der Forenübersicht(en) wird jetzt abhänig vom User und dem Timstamp des letzten Besuchs zum Timstamp der letzten Änderung die Darstellung beeinflusst.
Ich glaube aber das deine Idee gehen könnte ohne zu belastend zu werden, denn es ist ja so das die Timestaps nur für tatsächliche Besucher eines Treads von Interesse sind, für alle Anderen kann standardmäßig davon ausgegangen werden das ungelesene Beiträge vorliegen.außerdem kannst du das Feature optional einbauen das reduziert die zusätzlich benötigte Zeit und den zusätzlichen Speicher nochmals.
Beitrag zuletzt geändert: 8.8.2009 18:55:29 von fatfox -
Urlps... ne neue Tabelle für jeden Thread ist gar nicht gut... dann landen wir ja abseits aller Normalformen.
Wenn schon dann Tabelle á la
threadid userid timestamp
Aber, warum guckst du nicht einfach mal in die Datenbankstruktur von phpbb, da kann man sicher viel lernen... -
Danke schon mal für die Antworten.
@fatfox: Naja, Ich kann mir vorstellen, dass das sehr schnell sehr unübersichtlich wird. Ausserdem ist MySQL vermutlich auch mehr auf den Umgang mit vielen Datensätzen optimiert, anstatt auf den Umgang mit veilen Tabellen
@Nickic: Joa die Idee finde ich grundsätzlich mal nicht schlecht. Man muss nur beachten das diese Tabelle rießig wird (genau wie meine assoziativen Arrays für jeden Benutzer). Stellt sich also immernoch die Frage was nun schneller ist.
Was auch noch Interessant wäre ist wie man die einzelnen Methoden vielleicht optimieren könnte. Z.B. ein eindeutiger Vorteil an nikics Methode ist, das man geschlossene Threads relativ einfach von der Liste nehmen kann und so wieder ein bischen Performance hinzubekommt.
Was phpbb3 angeht: Ich wühle mich gerade durch den PHP-Code. -
Naja. Ich glaube das müsste klar gehen. MySQL kommt auch mit sehr großen Tabellen mit Einträgen in Millionenhöhe und Größen von mehreren Gigabyte klar. Das ist ja immerhin eine der Aufgaben von DBMS.
Was mir an der Idee des assoziativen Arrays nicht gefällt:
Ich habe jetzt verstanden, dass du solch ein Array in var_export/serialize-Form in der Datenbank speichern willst. Das wäre jedoch meiner Meinung nach schon ein Verstoß gegen die erste Normalform, die ja besagt, dass alle Attribute atomisch sind. Weiterhin glaube ich, dass die Anschließende Importierung der Daten in PHP, via eval oder unserialize langsam ist. Zudem lädst du dann immerdas gesammte Array, was bei älteren Benutzern auch mal mehrere zehntausend Einträge enthalten kann. -
Naja, ich habe glaube ich nicht so das Problem mit der Schnelligkeit von Unserialize/Serialize, da ich nach etwas Googlen festgestellt habe, das es dafür schnelle in C geschriebene Module für Python gibt. Dafür ist das andere von dir angesprochene Problem umso schlimmer. Ich habe nicht bedacht das wirklich tausende von Einträgen in diesem Array sein könnten (ist bei älteren benutzern durchaus realistisch). Die Menge an Ram die diese Lösung dann benötigen würde (im vergleich zu der größe des Problems) ist ja unverantwortlich. Zum glück habe ich nicht auf Google gehört und lieber noch mal nach Alternativen gefragt. Falls noch jemand eine revolutionäre Idee haben sollte, dann raus damit. Ansonnsten bedank ich mich vielmals, besonders bei nickic.
-
Mach doch einfach so eine Tabelle:
id......thema......user......zuletzt_gelesen
1..........6..............3............1249851217
Das geht sehr einfach, und es wird nur eine Tabelle benötigt.
mfg drafed-map
Beitrag zuletzt geändert: 9.8.2009 22:55:26 von drafed-map -
Wie schön das du den Thread gelesen hast *hust*
nikic schrieb:
Wenn schon dann Tabelle á la
threadid userid timestamp
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage