mmofacts.com

Forenimplementierung

gepostet vor 17 Jahre, 6 Monate von Todi42
Hallo,
ich bin gerade dabei, ein Forum zu implementieren. Ähnlich wie bei jedem anderen Bulletin Board habe ich eine Gliederung: Ein Forum hat mehrere boards, ein board hat mehrere threads (Themen) eine thread hat mehrere entries (Beiträge). Ich finde das feature, zu sehen, welche Beiträge man schon gelesen hat sehr nützlich, möchte ich also auch haben. Meine erste Idee ist nun, den Baum aus boards, threads und entries zu versionieren, ähnlich wie subversion es macht. Ändere ich an einem Knoten (boards, threads) oder an einem Blatt (entries) etwas, so wird die Version der Wurzel und alle Knoten zwischen Wurzel und dem geänderten (inkl.) Knoten oder Blatt auf die Version der Wurzel gesetzt:
b1, b2 sind boards, t1, t2, sind threads in einem board. r ist die Wurzel. v bezeichnet die jeweilige Version. Der letzte Eintrag wurde im Beispiel also im thread t2 des board b2 gemacht.

r;v=6
b1;v=5
t1;v=5
t2;v=3
b2;v=6
t2;v=6
t1;v=1
Die Kenntnis eines Benutzers kann dann notiert werden als die Menge der bekannten Blätter mit der Version. Sind alle Blätter oder Knoten einer Ebene bekannt, kann man es zusammen fassen, auf die Version der da drüber liegenden Ebene.
Wenn alle Beiträge gelesen wurden, wird pro Benutzer also nur die Version der Wurzel gespeichert. Wird nun irgend wo Etwas geändert, ändern sich Knoten von der Wurzel zum Blatt auf eine neue Version und überall dort, wo die Version größer ist als der gespeicherte Wert, gibt es etwas neues zu lesen. Man erkennt also recht schnell, das es was neues zu lesen gibt, ohne den Baum großartig zu durchsuchen.
Das funktioniert glaube ich ganz gut. Nun möchte ich aber auch noch, das der Benutzer Themen ignorieren kann (ihr wisst schon, diese wo andauern etwas geschrieben wird, aber nicht dazu kommt) und zusätzlich wird es boards geben, die nicht von allen Spieler lesbar sein sollen. Änderung in den Teilen des Baumes, für den sich der Spieler nicht interessiert, würden auf unterster Ebene des Baums aussehen, wie ungelesene Änderungen. Erst wenn der Baum weiter oben mit der Liste der nicht lesbaren Knoten verglichen wird, wird klar, das die Änderungen in der Forenübersicht nicht dargestellt werden sollen.
Hat jemand eine ergänzende, alternative Lösung für das Problem. Die Lösung sollte natürlich recht Speichereffizient sein ;-)
schon mal Danke im Voraus für eure Antworten,
Todi
gepostet vor 17 Jahre, 6 Monate von None
Da ich annehme das du gewichtige Gründe hast bestehende Forensystem nicht einzusetzen, überspringe ich diesen Diskussionspart einmal.
Tip: Sieh dir die Funktionalität der bestehenden Forenlösungen an. Das hilft mehr, als wenn wir jetzt hier eine lange Diskussion über die Technischen Möglichkeiten beginnen.
gepostet vor 17 Jahre, 6 Monate von Todi42
Original von MrMarco
Da ich annehme das du gewichtige Gründe hast bestehende Forensystem nicht einzusetzen, überspringe ich diesen Diskussionspart einmal.

Ah, danke ;-)
Original von MrMarcoTip: Sieh dir die Funktionalität der bestehenden Forenlösungen an. Das hilft mehr, als wenn wir jetzt hier eine lange Diskussion über die Technischen Möglichkeiten beginnen.

Kennst Du den ein Forum, bei dem es z.B. möglich ist nur einen Thread zu ignorieren?
Wenn wir mal GalaxyNews als Beispiel nehmen würde, wäre das als wenn ich dieses Thema ignorieren will und dann auf der ersten Foren Seite bei 'Umsetzung' kein blaues G sehen möchte, wenn in diesem Thread Beiträge kommen, aber sehr wohl, wenn in anderen Threads unter 'Umsetzung' Beiträge kommen.
Vielleicht weis aber auch jemand, wie die herkömlichen Boards das machen und erzählt es mir hier kurz :-)
gepostet vor 17 Jahre, 6 Monate von None
Interessante Frage und das Feature ist gar nicht mal so unnütz. Ich bin persönlich schon auf der Suche nach sowas. Wenn ich was finde, dann poste ich es natürlich.
gepostet vor 17 Jahre, 6 Monate von cherry
Hi,
auf den ersten Blick scheint deine Loesung ganz elegant. Ich denke aber nicht dass es besonders praktikabel ist. Ausserdem kann ich mir nicht vorstellen, dass die Methode die den Baum fuer jeden Benutzer aktuell haelt huebsch aussieht.
Ich finde du hast einen Fehler bei deiner Vorgehensweise gemacht:
Du hast dir eine Spezifikation ueberlegt die beinhaltet dass du folgende Hierarchie brauchst: Forum->Board->Threads->Postings. Ausserdem willst du dass ein Benutzer sieht was er schon gelesen hat und was neu ist. Dann hast du diese Anforderungen quasi implementiert indem du dir sogar die genaue Datenstruktur ueberlegt hast.
Was dir jetzt einfaellt ist dass du deine Spezifikation erweitern musst, Du willst naemlich dass Benutzer Postings ignorieren koennen und dass es verschiedene Rechte gibt. Da Du aber schon ne Implementierung hast wird das jetzt mit relativ hoher Wahrscheinlicheit ein fieser fieser Hack.
Darum mein Rat: erst komplett ueber die Anforderungen klar werden, dann erst an die Implementierung denken.
Die Ignorier-Funktion laesst sich womoeglich in deine Datenstruktur unterbringen. Ein Rechte-System wird vielleicht schwerer. Da darfst Du wohl nicht nur an den einzelnen Benutzer denken sondern du wirst Rollen benoetigen.
Achja, ich MUSS einfach fragen: Warum benutzt Du kein bestehendes Forensystem?
cherry
gepostet vor 17 Jahre, 6 Monate von Todi42
Original von cherry
...Ausserdem kann ich mir nicht vorstellen, dass die Methode die den Baum fuer jeden Benutzer aktuell haelt huebsch aussieht.

Der 'Baum' für den Benutzer wird nur aktualisiert, wenn der Benutzer einen thread ließt, niemals wenn neue Beiträge von einem anderen Benutzer geschrieben werden. Das ist das wesentliche, das der Baum (nicht der 'Baum' für den Benutzer) nur aktualisiert wird, wenn ins Forum geschrieben wird. Und in Ruby sieht übrigens jede Funktion zauberhaft aus ;-).
Original von cherry

Ich finde du hast einen Fehler bei deiner Vorgehensweise gemacht:
Du hast dir eine Spezifikation ueberlegt... Was dir jetzt einfaellt ist dass du deine Spezifikation erweitern musst
Da hast Du mich falsch verstanden. Ich habe zwei Anforderungen genannt und für die erste Anforderung habe ich eine Datenstruktur, die den Anforderungen gerecht wird. Meine zweite Anforderung bekomme ich damit nicht abgedeckt, daher meine Anfrage hier. Bis auf ne Stunde vor'm whiteboard ist davon noch nix umgesetzt. Ansonsten ist das Wasserfallmodel auch nicht mehr zeitgemäß. Ich möchte im übrigen das Ignorieren auf Themen- und nicht auf Beitragebene ermöglichen.
Original von cherry

Achja, ich MUSS einfach fragen: Warum benutzt Du kein bestehendes Forensystem?
Gerne, aber dann wo anders.
@MrMarco: Ich hab mir jetzt ca. 1/2 Dutzend Boards angeguckt aber keins, mit der Funktionalität gefunden.
gepostet vor 17 Jahre, 6 Monate von None
Wenn dir die vorhandenen phpBB Mods nicht genügen, wieso baust du nicht ein eigenes Mod?
gepostet vor 17 Jahre, 6 Monate von Todi42
Weil ich dazu einen geeigneten Algorithmus/Datenstruktur bräuchte, auf dessen Suche ich noch bin. Wenn ich das habe, wird es an der Umsetzung nicht scheitern :-)
gepostet vor 17 Jahre, 6 Monate von Todi42
Original von MrMarco
Wenn dir die vorhandenen phpBB Mods nicht genügen, wieso baust du nicht ein eigenes Mod?

Ich habe auch keinen passenden Mod gesehen. Der Punkt 'ignore thread' von Dir past am besten, lieferte aber auch keine Lösung.
gepostet vor 17 Jahre, 6 Monate von Todi42
Ich glaube, jetzt habe ich es: Man muß auf der board-Ebene noch mal gucken, ob es einen thread gibt, der eine größere Versionsnummer als die kleinste komplett bekannte Version des boards hat und nicht in der Liste der zu ignorierenden threads steht. Ist dieser thread dann nicht in der Liste gelesener threads für das board, dann gibt es etwas neues zu lesen.
Danke für's zuhören! ;-)
gepostet vor 17 Jahre, 6 Monate von Drezil
unter welche lizenz willst du dein forum stellen?
weil ich hätte evtl. interesse an einer koorperation (bin aber in ruby nur ein blinder mit nem krückstock ..) bzw. an einer api zur integration in mein spiel.
gepostet vor 17 Jahre, 6 Monate von Todi42
Das Forum nutzt einen von mir entwickelten Server und einen Sack JS-Libraries, ohne die wird es nicht funktionieren. Wenn ich damit durch bin, könnte ich mal versuchen, den Algorithmus etwas besser zu beschreiben, dann sollte ein Nachbau nicht schwierig sein.
gepostet vor 17 Jahre, 6 Monate von knalli
Ist die korrekte Ordnung nicht 1 Board > n Forum > m Thread > l Posting ?
gepostet vor 17 Jahre, 6 Monate von None
Jup. So kenne ich es auch.
Ich denke mal das er die gleiche implementation gewählt hat, hat es nur ein wenig anderster beschrieben.
gepostet vor 17 Jahre, 6 Monate von Todi42
Original von knalli
Ist die korrekte Ordnung nicht 1 Board > n Forum > m Thread > l Posting ?

Ist Geschmackssache würde ich sagen. Da Forum deutsch und Board englisch ist, kann man das eh nicht mixen. Der Überschriften in GN nach, wäre es Forum->Foren->Thema/en.
gepostet vor 17 Jahre, 6 Monate von knalli
Da ich meine, das es keine Geschmackssache war, habe ich mich mal erkundigt: Vorausgesetzt, man vertraut Wikipedia: de.wikipedia.org/wiki/Webforum#Gemeinsamkeiten_von_Foren_und_Boards
So habe ich das auch mal woanders gelesen, und das macht in meinen Augen so auch Sinn. Vor allem in Deutschland verwenden das viele als Synonym - das ist aber ja keine Legitimation
Kurzum: War wohl doch gut, die kleine Frage in den Raum zu werfen, denn das ist eine Frage, die tief in das Konzept eingreift.
gepostet vor 17 Jahre, 6 Monate von Todi42
Original von knalli
Kurzum: War wohl doch gut, die kleine Frage in den Raum zu werfen, denn das ist eine Frage, die tief in das Konzept eingreift.

Ups, die Benamung der einzelnden Ebenen in einem Forum, kann doch nicht tief in das Konzept eingreifen. Besten Falls, die Anzahl der Ebenen, das würde ich aber auch keine tiefgreifende Konzeptenderung sehen, wenn man da später noch eine Ordnungsebene mehr hat.
gepostet vor 17 Jahre, 6 Monate von None
Mal ehrlich.. mehr als 3 Ordnungsebenen sind die Hölle für den User dann.
Du hast das Forum, die Forenbereiche und die Threads. Wenn du das jetzt noch weiter in die Tiefe treibst...
Also mir ist es zu Zeiten vom UseNet doch ab und an schwergefallen den Diskussion zu folgen wenn sie sich weiter unten dann in mehrere Subthreads gespaltet haben.
Das trägt nicht gerade zur Lesbarkeit bei.
gepostet vor 17 Jahre, 6 Monate von knalli
Also wenn ich das nicht falsch verstanden habe, dann ist das hier - galaxy-news.de/forum - auch ein Board, un kein Forum. Und damit hast du die drei Ebenen hier auch locker.
[list=1][*]Galaxy-News Forum aka Board
[*]Browsergame-Entwicklung aka Forum-Gruppe (Kategorie)
[*]Umsetzung aka Forum
[*]Forenimplementierung aka Thread
[*] Antwort erstellen aka neues Posting[/list]
Was heißt tief ins System - wenn die gesamte Spezifikation davon ausgeht, dass Forum über Board kommt, und dann alles geändert wird - das macht sich durchaus bemerkbar.
gepostet vor 17 Jahre, 6 Monate von Todi42
Original von MrMarco

Ja, das hast Du denke ich recht. Man könnte aber z.B. an ein Forum für mehrere Spiele denken, dann gäbe es halt noch eine Ebene dadrüber, die der Anwender aber auch erst dann sieht, wenn er vom Spiel in eine Portal wechselt.
gepostet vor 17 Jahre, 6 Monate von Todi42
Original von cherry
Ausserdem kann ich mir nicht vorstellen, dass die Methode die den Baum fuer jeden Benutzer aktuell haelt huebsch aussieht.

Ja, wirklich hübsch ist sie nicht aus, aber wirklich grausam sieht es auch nicht aus:

def mark_thread_read thread_id, thread_version, board_id, glob_board_version, glob_root_version, user_id
boards[board_id] ||= {:v => 0}
return false if root_version >= glob_board_version
return false if root_version >= thread_version
return false if boards[board_id][:v] >= thread_version
return false if boards[board_id][thread_id] && boards[board_id][thread_id] >= thread_version

# insert this thread into the board list and colapse
boards[board_id][thread_id] = thread_version
unknown_threads = BoardThread.find_unknown_thread_ids board_id, boards[board_id][:v]
ignored_threads = BoardThread.find_ignored_thread_ids board_id, boards[board_id][:v], user_id
ignored_threads.merge! boards[board_id]
ignored_threads.delete :v
if unknown_threads == ignored_threads
boards[board_id] = { :v => glob_board_version }
unknown_boards = Board.find_unknown_board_ids(root_version)
known_boards = {}
boards.each {|key, value| known_boards[key] = value[:v] }
write_attribute :data_text, {:v => glob_root_version, :b => {}} if unknown_boards == known_boards
end

true
end

Auf diese Diskussion antworten