Autor Zpráva
Trsak
Profil
Zdravím,
dělám na fóru a lámu si hlavu s tím, jaký je vlastně nejlepší způsob pro označování příspěvků za přečtené/nepřečtené.

Když uživatel otevře téma na fóru, tak se označí jako přečtená, jinak je nepřečtená. Jakmile se přidá do témy nějaký příspěvek, označí se zase jako nepřečtená.
juriad
Profil
To záleží na požadavcích, které na ten systém kladeš.
- Má si to pamatovat pro užívatele, nebo pro prohlížeč (tedy, když se uživatel přihlásí odjinud, má to stále vědět, která témata navštívil)?
- Má si to pamatovat přečtenost všech témat v historii, nebo to stačí řešit i rozumně nových (řekněme vše, co je starší než měsíc, je automaticky přečtené)
- Má se stav přečtenosti doplňovat do stránky na serveru nebo čistě v prohlížeči?
- Má mít uživatel možnost třídit podle přečtenosti?

Zkus si sepsat, co vše od toho požaduješ a vyplyne ti snad jednoznačné řešení.
Trsak
Profil
- Pamatovat pro uživatele
- Všech témat
- Na server
- Ne, ale aby měl možnost označit vše za přečtené
juriad
Profil
Jelikož cookie je omezená a localStorage je pruda pro tento účel, musíš si informace ukládat do databáze na serveru.
Asi bych vytvořil tabulku visits (user_id, topic_id, visited), kterou bych left joinoval k výpisu témat.
pokud existuje záznam:
 - pokud je čas návštevy větší než čas zaslání posledního příspěvku:
 - - navštívil a není nic nového
 - jinak:
 - - navštívil a je něco nového
jinak:
 - ještě nenavštívil

Označit vše jako přečtené je prostě jen INSERT INTO visits SELECT ... FROM topics ON DUPLICATE KEY UPDATE ....

Jen si dej pozor na množství dat. Tato diskuse má 157498 témat a 20586 uživatelů; datetime má 8 bytů, int má 4 byty. Pokud by každý uživatel oše označil jako přečtené, vygenerovalo by se 3 miliardy záznamů, které by sami o sobě zabíraly 48 GB + musíš počítat s nutnými indexy, protože jinak bys tu databázi zabil. Nemyslím si, že toto je v takovém rozsahu implementovatelné na hostingu.

Šlo by jinak implementovat funkci „označit vše za přečtené“. Přidat druhou tabulku visits_all (user_id, visited), kde by ale visited mělo význam pro všechna témata. Při „označit vše“ můžeš ale z tabulky visits odstranit všechny záznamy uživatele, které jsou starší než aktuální čas, což také dost pomůže. Toto zredukuje počet záznamů pří „označit vše“ z #témat na 1, ale nezabrání to uživatelům, aby zběsile klikali a záměrně nikdy tu funkcionalitu nepoužili. Jen o malinko to ztíži dotazování (přibyde jeden LEFT JOIN a pár podmínek).

O jakých množstvích témat a uživatelů se tady bavíme?
Trsak
Profil
No popravdě doufal jsem, že se nějakým "trikem" vyhnu tisícům řádkům v tabulce. Nejspíš nechám forum bez přečtene/nepřečtené, bude to nejlepší.
Alphard
Profil
Trsak:
že se nějakým "trikem" vyhnu tisícům řádkům v tabulce
Mně se zdá nevhodná ta rada insert ... select. Já bych si spíš k uživateli ukládat čas, kdy dal označit vše jako přečtené (to je jediný datetime a zároveň by se mohly smazat všechny předchozí záznamy uživatele). Tohle by mohlo hodně výrazně zredukovat ukládaná data.

Další trik je v tom, co juriad naznačoval. V praxi velkou část uživatelů tvoří mrtvé duše. Jedno vlákno většinou navštíví maximálně několik desítek registrovaných uživatelů. A mohla by se třeba oříznout historie. Za poslední rok tady bude tipuji tak 10 000 témat. 50 uživatelů na každé z nich a hned vychází mnohem lepší čísla.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: