Threads als "ungelesen" markieren

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Threads als "ungelesen" markieren

Beitrag von Xin » Mi Sep 12, 2012 3:21 pm

Ich würde gerne mal über folgendes Problem hier diskutieren.

Da wir ja an einem eigenen CMS arbeiten, stellt sich mir eine performancekritische Frage: Wer sich hier anmeldet, bekommt die Information, welche Threads und Boards Postings enthalten, die noch nicht gelesen sind. Also muss es irgendwo eine Datenbank geben, welche Threads von mir gelesen wurden und welche nicht.

Nehmen wir an, wir hätten 50'000 User, 500'000 Threads und 5'000'000 Postings. Nun melde ich mich an: habe ich jetzt 500'000 ungelesene Threads, also 500'000 Einträge in meiner Datenbank? Oder ist die DB leer, weil ich noch nichts gelesen habe?
Was passiert, wenn ein Posting erstellt wird? Bekommt jeder User (50'000 User...) einen Eintrag, dass er hier noch lesen soll?

Wie würdet ihr das performant lösen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Threads als "ungelesen" markieren

Beitrag von Kerli » Mi Sep 12, 2012 4:16 pm

Die Information welche Threads noch nicht gelesen worden sind müssen wohl für jeden Nutzer individuell gespeichert werden. An deren Menge kann man wohl nichts ändern. Nachdem man im Allgemeinen davon ausgehen kann das Beiträge entweder gelesen oder als gelesen markiert werden dürfte es weniger Speicher brauchen zu speichern was noch nicht gelesen wurde als umgekehrt.

Optimierungen fallen mir ein paar ein:

Man könnte den ungelesen Status vererben, heißt also es gibt global ungelesen (nur für neu registrierte Benutzer die noch nie etwas gelesen haben nützlich) und dann für jede Ebene in der Hierarchie. Das hilft Platz zu sparen für Benutzer die nichts oder nur aus ein paar Foren etwas lesen.

Um nicht bei jeden neuen Posting jede Menge Einträge in der Datenbank zu generieren könnte man zb. auch einzelne Postings oder Threads ab einem gewissen Posting als von niemanden (außer dem Ersteller) gelesen markieren. So lange es nur wenige gelesen haben könnte man eine Liste der Benutzer die es gelesen haben führen und erst ab einer gewissen Anzahl wechseln auf ungelesen.

Weiters könnte man auch das Änderungsdatum mit einbeziehen und alle Beiträge seit der letzten Aktion des Nutzers bei einer erneuten Aktion als ungelesen markieren.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Threads als "ungelesen" markieren

Beitrag von nufan » Mi Sep 12, 2012 7:41 pm

Ich hab mir grade nochmal die phpBB-Datenbank angesehen. Es gibt eine Tabelle phpbb_topics_track mit user_id, topic_id, forum_id und mark_time, was ganz logisch erscheint. Mich verwirrt nur etwas, dass diese Tabelle in meinem Test-Forum leer ist?! Vielleicht werden da nur alte Zustände archiviert, aktuelle Themen im Hauptspeicher gehalten.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Threads als "ungelesen" markieren

Beitrag von fat-lobyte » Mi Sep 12, 2012 7:53 pm

Ich würde die Idee mit dem Datum etwas weiterführen:

Für jeden Benutzer wird ein Datum gespeichert (time_all_read), ab dem alles als ungelesen angezeigt wird. Liest der User bestimmte Beiträge, werden diese der Datenbank hinzugefügt.

Hat er alle Beiträge einer Zeitperiode gelesen, die an das letztgespeicherte Datum anschließt, wird das Datum auf das Ende der Zeitperiode gesetzt und alle einträge der Periode entfernt. Außerdem kann der User mit "alle Beiträge als gelesen markieren" das Datum manuell aktualisieren und alle "gelesen"-Einträge löschen.

Also so ungefähr habe ich mir das vorgestellt:

Code: Alles auswählen

struct Post {
    unsigned int time;
    
    bool operator < (const Post& other) { return time < other.time; }

};

struct DataBase {
    std::set<Post> all_posts;
};

struct User {
    void readPost(const Post& p)
    {
        if (p.time < last_time) return;
        
        std::pair<XYZ, XYZ> mm = mismatch(read_posts.begin(), read_posts.end(), database->begin(), database->end())
        
        read_posts.delete(read_posts.begin(), mm.first());
        last_time = read_posts.begin()->time;
    }
    
    std::vector<Post> getUnreadPosts()
    {        
        Post first_read = read_posts.front();
        
        auto since_post = std::find(database->begin(), database->end(),first_read);        
                
        std::vector<Post> unread_posts(database.end() - since);
        auto it = unread_posts.begin();        
        it = std::set_difference(since, database.end(), read_posts.begin(), read_posts.end());
        
        unread_posts.resize(it - unread_posts.begin());        
        return std::move(unread_posts);
    }
    
private:
    DataBase* database;
    unsigned int last_time;
    std::set<Post> read_posts;
};
Haters gonna hate, potatoes gonna potate.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Threads als "ungelesen" markieren

Beitrag von canlot » Do Sep 13, 2012 4:55 pm

Wenn ein User sich registriert hat hat er kein ungelesene Postings. Wenn ein User ein Posting nicht gelesen hat dann wird er in die Datenbank geschrieben. Wenn er dann gelesen hat wird es aus der Datenbank wieder gelöscht.
Unwissenheit ist ein Segen

XinQuadrat

Re: Threads als "ungelesen" markieren

Beitrag von XinQuadrat » Do Sep 13, 2012 4:59 pm

Tatsache... habe mich gerade neu angemeldet und keine ungelesenen Beiträge... hätte ich anders erwartet, ist aber mal ein Implementierungsindiz.

Ich gehe mich dann mal wieder löschen... ^^

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Threads als "ungelesen" markieren

Beitrag von Kerli » Do Sep 13, 2012 5:23 pm

XinQuadrat hat geschrieben:Tatsache... habe mich gerade neu angemeldet und keine ungelesenen Beiträge... hätte ich anders erwartet, ist aber mal ein Implementierungsindiz.
Wenn du es gleich machen möchtest kannst dir auch einfach den Quellcode anschauen. Ist vielleicht etwas einfacher als das Verhalten zu studieren ;)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Threads als "ungelesen" markieren

Beitrag von Xin » Do Sep 13, 2012 5:25 pm

Kerli hat geschrieben:
XinQuadrat hat geschrieben:Tatsache... habe mich gerade neu angemeldet und keine ungelesenen Beiträge... hätte ich anders erwartet, ist aber mal ein Implementierungsindiz.
Wenn du es gleich machen möchtest kannst dir auch einfach den Quellcode anschauen. Ist vielleicht etwas einfacher als das Verhalten zu studieren ;)
Erstens denke ich gerne selbst, zweitens kann ich mir den Quellcode notfalls immernoch anschauen, drittens kostet es vermutlich mehr Zeit, den Quellcode von phpBB zu verstehen, als ihn neu zu schreiben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten