Jump to content
  • 0

pomoc Přečtené příspěvky


Kudris

Dotaz

Ahoj, na jednom interním systému řeším aby se uživateli nepřečtené informace označili. Funkčnost chci podobně třeba jako zde na fóru kde jsou označené témata které jsem jako uživatel ještě nepřečetl případně příspěvky v konkrétním tématu. 

Moje otázka zní, jak je tahle funkce řešena? Kam a jak se údaje o přečtení článku ukládají? Jak dosáhnout co největší efektivity? 

Link to comment
Share on other sites

2 odpovědí na tuto otázku

Recommended Posts

  • 1
  • Globální moderátor

Zajímavej dotaz. 

Přemýšlel jsem jak co nejefektivněji toho dosáhnout. První dotaz je, máš SQL nebo noSQL databázi? Podle toho bych se odpíchnul dál. Vzhledem k tomu, že jsi nespecifikoval, tak počítám s SQL. (NoSQL by zde byla zrovna lepší).

Ujasněme si, že chceme označit příspěvky, které jsou nové od poslední návštěvy. Počítám s tím, že každý user má uid, každý topic má uid a každá příspěvek má čas vložení příspěvku. Aby se zabralo co nejméně místa a přístup byl co nejrychlejší, řešil bych to extra tabulkou tzv. M:N tabulkou, jež by vypadalo takto:

| uid | topic_id | user_id | timestamp |

uid = primární klíč
topic_id = index na vlákno. (Odkaz na primarní klíč topicu, například tento topic má id 56539 - viz url)
user_id = index na usera. (Odkaz na primární klíč usera)
timestamp = poslední zaznamenaná návštěva usera

 A teď funkčnost:

Uživatel vstoupí do vlákna příspěvků a načte si příspěvky. Pokud je funkce kterou chceš zapnutá. tak se dotáže na db:

SELECT uid, timestamp FROM last_activity WHERE topic_id = id_vlakna AND user_id = id_usera LIMIT 1

Pokud něco vrátí, znamená, že už tam byl. Pokud ne, uživatel ještě topic nenavštívil. 

Timestamp je poslední návštěva, podle toho můžeš označit příspěvky co uživatel ještě neviděl. Jakmile vleze na topic, voláš db a updatuješ tabulku:

UPDATE last_activity SET timestamp = now() WHERE uid = uid_predchoziho_vysledku

Pokud tam ještě nebyl, záznam vytvoříš...

 

Proč timestamp a ne ID příspěvku jako poslední přečtený: Příspěvek není něco, co tam vždy, můžeš být. Poslední příspěvek někdo může smazat a svým způsobem id příspěvku nemusí být vzestupný. Příspěvek id 1 může být novější než příspěvek id 2 - může být třeba přesunutý. 

Nevýhody SQL: navržená tabulka last_activity bude do nekonečna vzrůstající a velmi rychle. Čím více userů se podívá, tím více záznamů. 5 000 000 záznamů mi mysql už moc nedávalo.
Řešení: noSQL: U nosql by se tyto informace dali napsat přímo k záznamu topicu jako JSON, kde by byly informace o všech uživatelích, co topic navštivili.  
Řešení 2: Udělat s sql nosql. Přidat sloupec do tabulky seznamu topiců, kam se bude psát jako JSON informace o všech uživatelích jako řešení o řádek výše.

Nevýhody noSQL a řešení 2: Pokaždé když se někdo dotáže na informace kdy se naposledy podíval do topicu, tak se stáhnou všechny informace pro všechny usery. Nikoli jen pro jednoho konkrétního.

  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0
On 25. 11. 2022 at 18:45, Hip said:

Zajímavej dotaz. 

Přemýšlel jsem jak co nejefektivněji toho dosáhnout. První dotaz je, máš SQL nebo noSQL databázi? Podle toho bych se odpíchnul dál. Vzhledem k tomu, že jsi nespecifikoval, tak počítám s SQL. (NoSQL by zde byla zrovna lepší).

Ujasněme si, že chceme označit příspěvky, které jsou nové od poslední návštěvy. Počítám s tím, že každý user má uid, každý topic má uid a každá příspěvek má čas vložení příspěvku. Aby se zabralo co nejméně místa a přístup byl co nejrychlejší, řešil bych to extra tabulkou tzv. M:N tabulkou, jež by vypadalo takto:

| uid | topic_id | user_id | timestamp |

uid = primární klíč
topic_id = index na vlákno. (Odkaz na primarní klíč topicu, například tento topic má id 56539 - viz url)
user_id = index na usera. (Odkaz na primární klíč usera)
timestamp = poslední zaznamenaná návštěva usera

 A teď funkčnost:

Uživatel vstoupí do vlákna příspěvků a načte si příspěvky. Pokud je funkce kterou chceš zapnutá. tak se dotáže na db:

SELECT uid, timestamp FROM last_activity WHERE topic_id = id_vlakna AND user_id = id_usera LIMIT 1

Pokud něco vrátí, znamená, že už tam byl. Pokud ne, uživatel ještě topic nenavštívil. 

Timestamp je poslední návštěva, podle toho můžeš označit příspěvky co uživatel ještě neviděl. Jakmile vleze na topic, voláš db a updatuješ tabulku:

UPDATE last_activity SET timestamp = now() WHERE uid = uid_predchoziho_vysledku

Pokud tam ještě nebyl, záznam vytvoříš...

 

Proč timestamp a ne ID příspěvku jako poslední přečtený: Příspěvek není něco, co tam vždy, můžeš být. Poslední příspěvek někdo může smazat a svým způsobem id příspěvku nemusí být vzestupný. Příspěvek id 1 může být novější než příspěvek id 2 - může být třeba přesunutý. 

Nevýhody SQL: navržená tabulka last_activity bude do nekonečna vzrůstající a velmi rychle. Čím více userů se podívá, tím více záznamů. 5 000 000 záznamů mi mysql už moc nedávalo.
Řešení: noSQL: U nosql by se tyto informace dali napsat přímo k záznamu topicu jako JSON, kde by byly informace o všech uživatelích, co topic navštivili.  
Řešení 2: Udělat s sql nosql. Přidat sloupec do tabulky seznamu topiců, kam se bude psát jako JSON informace o všech uživatelích jako řešení o řádek výše.

Nevýhody noSQL a řešení 2: Pokaždé když se někdo dotáže na informace kdy se naposledy podíval do topicu, tak se stáhnou všechny informace pro všechny usery. Nikoli jen pro jednoho konkrétního.

Super, díky moc za přiblížení této funkce. Rozhodně si s tím pohraji a vyzkouším co mi bude nejvíce vyhovovat, pak dám nějaký feedback. 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...