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 |
#3 · Zasláno: 29. 8. 2015, 14:28:24
- 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 |
#5 · Zasláno: 29. 8. 2015, 15:09:58
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 |
#6 · Zasláno: 29. 8. 2015, 18:33:16
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. |
||
Časová prodleva: 9 let
|
0