« 1 2 »
Autor Zpráva
tomek
Profil *
Potřeboval bych poradit, jak řešit to, že když jako přihlášený návštěvník vlezu na forum, tak se mi označí všechny nové příspěvky od mé poslední návštěvy. Jak tohle řešit?
i třeba něco takovéhoto
113014#2
mattyZEM
Profil
Budete si muset ukládat například čas navštívení tématu a poté zjišťovat, zda neexistuje náhodou příspěvek s novějším datem.
Taps
Profil
Já ještě dodám, že kontrolu nových příspěvků je možné učinit bud pomocí COOKIE nebo na úrovni databáze.
tomek
Profil *
takže jak nejlépe? teď jsem mimo. no cookie je myslím celkem nanic. když přejdu k jinému PC, tak je to jakoby se nic nestalo
co se týče toho času, tak jak to udělat? jako další tabulku kde bude ID toho postu a id uživatele? ale to bude šíleně velký
Taps
Profil
tomek:
každé z uvedených řešení má i své nevýhody.
tomek
Profil *
a kdybych to chtěl řešit nějak jako je na PHP BB?
Kcko
Profil
tomek:
Databáze.

ID vlákna | ID uzivatele | Cas posledniho navstiveni


Praktikuji to taky takto a problém jsem zatím během ročního působení fóra nezpozoroval.
tomek
Profil *
Kcko:
ale velikost je šílená ne?
Kcko
Profil
tomek:
Záleží na návštěvnosti, já tam mám za rok zatím 12 tisíc záznamů ...
tomek
Profil *
Kcko:
návštěvnosti? cca 105 návštěv denně a cca 30 registrovaných uživatelů
Kcko
Profil
tomek:
cca 800 UIP denne. Registrovanych asi 1500-2000
mattyZEM
Profil
tomek:
ale velikost je šílená ne?
Já měl tímto způsobem (vlastně jsem needitoval záznam, pokud existoval, ale vždy jsem vytvořil nový) přibližně 360 tisíc záznamů. Pár klíčů vyřešilo zátěž :)
joe
Profil
mattyZEM & Kcko

Proč tak zbytečně?

Lepší by bylo mít tabulku:

ID vlákna | ID uzivatele | Pocet prispevku


Dotaz by pak jen odčítal od aktuálního počtu příspěvků ve vlákně (to by měl být sloupec v tabulce s jednotlivými vlákny), nemusí se tak porovnávat data jednotlivých příspěvků ve vlákně.

tomek:
cca 105 návštěv denně a cca 30 registrovaných uživatelů
To nic není.
mattyZEM
Profil
joe:
Lepší by bylo mít tabulku
Nebylo. Kde bereš tu jistotu, že moderátor nějaký příspěvek nesmaže a někdo tam nenapíše jiný?

Prostě podle času je to nejlepší. Pak můžeš mít i funkci, kterou si označíš všechna témata jako přečtená (což se může řešit přes $_SESSION[], který bude mít čas označení).
joe
Profil
mattyZEM:
Nebylo. Kde bereš tu jistotu, že moderátor nějaký příspěvek nesmaže a někdo tam nenapíše jiný?

Proč bych ji měl někde brát? Po připsání příspěvku se počet zvýší, po smazání sníží. Kde je problém?

Pak můžeš mít i funkci, kterou si označíš všechna témata jako přečtená (což se může řešit přes $_SESSION[], který bude mít čas označení).

Pro to ti stačí ID vlákna a čas jeho posledního příspěvku a ten je také vhodný dát jako sloupec přímo do tabulky s vlákny. Je zbytečné pokaždé zjišťovat čas posledního příspěvku a počet reakcí.


PRO
- bude to rychlejší
- bude to bez zbytečného indexu na sloupci s datem EDIT: pokud by bylo požadované řazení podle počtu příspěvků, pak by index samozřejmě existoval na sloupci s počtem příspěvků taky
- bude to jednodušší

Máš nějaká zásádní PROTI, proč to tak nedělat? Navíc počet příspěvků bych zařadil mezi méně důležité údaje, takže i kdyby se to zobrazilo špatně, jak píšeš (i když k tomu není důvod), tak by se vůbec nic nestalo.
Taps
Profil
joe
Proč bych ji měl někde brát? Po připsání příspěvku se počet zvýší, po smazání sníží. Kde je problém?
Jasně ta hodnota se sníží u počtu příspěvků, které jsou v dané tabulce s diskusním tématem, ale jak vyřešíš snížení počtu u tabulky s takovou strukturou
ID vlákna | ID uzivatele | Pocet prispevku

Když nevíš zda daný uživatel si přečetl či nepřečetl příspěvek, který byl smazán. Tím pádem se můžeš dostat do situace, že výsledný počet nepřečetných příspěvků bude záporný.

Pak je jediná možnost, že cyklem projdeš všechny uživatele a přepočítáš u nich počet přečtených příspěvků.
joe
Profil
Taps:
Věc se má asi takhle:

- v praxi se taková data, jako jsou např. odpovědi, neodstraňují doslova, ale dává se jim příznak, že jsou smazané (v db však stále jsou)

- v diskusi je vždy lepší zobrazovat i smazanou reakci, kde místo zprávy bude text, že byla odstraněna a z jakých důvodů

- pokud výsledný počet nepřečtených příspěvků bude záporný (k tomu ale na základě předchozích bodů dojít nemůže), můžu uživateli dát vědět, že došlo ke smazání příspěvku

- po smazání příspěvku z vlákna lze snížit i hodnotu počtu příspěvků (zase jednoduchý dotaz na db) v té tabulce (ID vlákna | ID uživatele | Počet příspěvků). Navíc tenhle krok je zbytečný.

- pokud bych chtěl záznamy opravdu mazat z databáze (i když k tomu není žádný důvod), tak bych si přidal ještě například sloupec Počet_smazaných_příspěvků (v tabulce s vlákny), pomocí této hodnoty bych to spočítal bez záporné hodnoty.
Kcko
Profil
joe:
Lepší by bylo mít tabulku:

ID vlákna | ID uzivatele | Pocet prispevku


Z jakého důvodu? Datově je stejně náročná jako ta moje.

Pro to ti stačí ID vlákna a čas jeho posledního příspěvku a ten je také vhodný dát jako sloupec přímo do tabulky s vlákny. Je zbytečné pokaždé zjišťovat čas posledního příspěvku a počet reakcí.
Na to stačí 1 optimalizovaný SQL dotaz ...


Máš nějaká zásádní PROTI, proč to tak nedělat? Navíc počet příspěvků bych zařadil mezi méně důležité údaje, takže i kdyby se to zobrazilo špatně, jak píšeš (i když k tomu není důvod), tak by se vůbec nic nestalo.

Nevím no, jak se řeklo, musíš pamatovat na mnoho věcí jako je smazání příspěvku, přesunutí příspěvku , smazání celé kategorie atd ... Navíc Tobě je možná jedno, že se nezobrazí přesné údaje, mně nikoliv.
Já na to potřebuji 1 SQL dotaz (který je rychlý ...), na zjištění nových příspěvků a o nic víc se starat nemusím.
Ty naopak budes potřebovat promyslet všechny možné případy okolo co se s příspěvkem může stát.

Jinak můj nápad nikoho nenutím (vlastně to není můj nápad, okoukal jsem to z PHPBB nebo podobného molochu ...).
joe
Profil
Kcko:
Z jakého důvodu?
Datově je stejná, rozdíl je v tom, že mám hned k dispozici počet příspěvků, které naposledy v diskusi měl. Na rozdíl od tvého postupu to musím vždy, po každém načítání stránky počítat.

Na to stačí 1 optimalizovaný SQL dotaz ...
Stačí, ale je zbytečný. Například při výpisu více vláken na stránku to musíš ke každému zjišťovat, pokud to máš ale ve sloupci, stačí ho jen vybrat.

vlastně to není můj nápad, okoukal jsem to z PHPBB nebo podobného molochu ...
Možná proto je ten moloch tak pomalý :-) Když ho někdo dělal a nemyslel při tom.
Kcko
Profil
joe:
Možná proto je ten moloch tak pomalý :] Když ho někdo dělal a nemyslel při tom.

Tak kvůli tomuhle určitě pomalý není. Prohlížel sis někdy útroby PHPBB nebo jiného fóra? Jsou tam tuny zbytečných dotazů, ale rozhodně to nebrzdí toto.

Jinak jsi opět vyzdvihl výhody, dle tvého mínění "lepšího řešení". Já tam pořád vidím nevýhody v podobně hafo dalších zaopatření, aby to fungovalo korektně.
I když jsem zapomněl, že ty to nemusíš mít přesně :] [#15]

Uživatel si vybere určitě svojí cestu, dál to nemusíme rozpitvávat :-)
joe
Profil
Kcko:
Já na to potřebuji 1 SQL dotaz (který je rychlý ...)

To by mě zajímal ten tvůj dotaz.

Potřebuješ vybrat všechny příspěvky z vlákna, seřadit a z prvního (nejnovějšího) vybrat. S indexy to zase tak pomalé nebude, to je pravda, hlavně když se jedná o diskuse s malým počtem příspěvků.
joe
Profil
Kcko:
Jen jsem napsal, že to není podstatná informace, že kdyby se zobrazila chybně, tak se nic neděje. Nikde nepíšu, že to tak dělám, když to může fungovat tak, jak má - viz [#17] ;)

Na fóra jsem se díval, stačí se podívat do návrhu db například na toto fórum miniBB. A co tam nevidím v tabulce minibbtable_topics? Sloupec posts_count a topic_last_post_time a topic_last_poster :-)
Kcko
Profil
joe:

				// new comments
				if (User::getInstance()->getUserId())
				{
					$articles_id_string = '0,' . implode(',', $articles_id);
					$new_posts = DIBI::query('
												SELECT COUNT( t1.id ) as new_unread_posts, 
												t1.vazba_id
												FROM komentare t1
												LEFT JOIN komentare_read t2 ON t2.vazba_id = t1.vazba_id  AND t2.user = %i and t2.typ = "clanek"
												WHERE (t2.dt is null OR t2.dt < t1.dt) AND t1.vazba_id IN ('.$articles_id_string.') AND t1.typ = "clanek"
												GROUP BY t1.vazba_id
											', User::getInstance()->getUserId())
											  
											  ->fetchPairs('vazba_id', 'new_unread_posts');

mattyZEM
Profil
joe:
Pořád píšeš, že musíme něco porovnávat. Jaký vidíš rozdíl mezi
if($novy['ncas']<$t['tcas'])

a
if($novy['npocp']<$t['tpocp'])

?

Věř mi. Naprogramoval jsem již hodně fór na to, abych již dávno zjistil, že podle TIME() posledního příspěvku je to jak nejpřesnější, tak nejlepší na MySQL příkazy + funkce fóra, které se běžně používají (například zmiňovaná fce Označit všechny příspěvky jako přečtené).
joe
Profil
Oproti něčemu takovému:

SELECT t.*, t.count_posts - tw.count_posts AS pocet_neprectenych FROM topics v LEFT JOIN topic_view tw ON tw.topic_id = t.id AND tw.user_id = UID


kde to mám i s výběrem všech témat.
joe
Profil
mattyZEM:
Na základě tohoto a tohoto příspěvku, usuzuju, že jsi toho moc nenaprogramoval, tedy kvalitně. ;-)
joe
Profil
mattyZEM:
Jaký vidíš rozdíl mezi

Rozdíl je jasný, v prvním případě nevíš počet příspěků a musíš ho zjistit. V druhém případě počítáš už s ním, což ti ušetří čas, tvorbu dotazu (které ti možná moc nejdou, když jsi se rozhodoval, jestli SQL nebo TXT) a zbytečný dotaz na db, kde do WHERE IN (...) nasypeš kupu IDček.
mattyZEM
Profil
joe:
Oproti něčemu takovému
kde to mám i s výběrem všech témat.
To jsi dobrý, ale stále se tě ptám - kde bereš jistotu, že si uživatel téma nepřečte když tam bude 30 příspěvků, moderátor pak jeden smaže a někdo tam napíše další? Zjistí, že téma zdánlivě přečtené je, ale není.

Na základě
Na základě tvého stylu zjišťování (ne)přečtených témat usuzuji, že jsi to fórum kvalitně nenaprogramoval. ;-)

zbytečný dotaz na db, kde do WHERE IN (...) nasypeš kupu IDček.
Prosím? Nic takového nedělám. Funkci IN() jsem nevyužil v praxi zatím vůbec.
Kcko
Profil
[#25] joe
Velký rozdíl tam nevidím, jistěže to moje bude o něco náročnější, než tvoje předpočítaná data, jenže ty už máš pouze výše popsané nevýhody. Mě už může být jedno co se s příspěvky děje.
Jsem rád, že jsme si takhle ukázali možné způsoby :)
Jdu pracovat. Cya.
joe
Profil
mattyZEM:

kde bereš jistotu, že si uživatel téma nepřečte...
To už jsem přece napsal, nepřímo, příspěvky takového typu se z databází nemažou, tzn. jejich počet se nemění. Mám 30 příspěvků, moderátor jeden smaže, ale příspěvků je stále 30. Proč by jich mělo být méně? Příspěvek je příspěvek, nevidím ani důvod jej odebírat.

Na základě tvého stylu zjišťování (ne)přečtených témat usuzuji, že jsi to fórum kvalitně nenaprogramoval. ;-)
To by mě zajímalo, jak jsi k tomu došel. Píšeš bludy a sám to dobře víš.

Prosím? Nic takového nedělám. Funkci IN() jsem nevyužil v praxi zatím vůbec.
To je reakce k dotazu, který se tu objevil od Kcka. Tvůj dotaz by totiž mohl vypadat nějak podobně.
« 1 2 »

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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