Roberts Zariņš Posted November 4, 2012 Report Share Posted November 4, 2012 (edited) Labdien, Pašreiz izstrādāju forumu. Nepieciešama zīmīte pie foruma raksta, vai to attiecīgais lietotājs ir izlasījs vai vēl ne. Kāds varētu būt servera resursu ziņā vislabākais veids, kā to izdarīt? Vai izveidot tabulu ar user_id, topic_id, timestamp un tur likt iekšā/atjaunot datus par katru apskatīto rakstu būtu prāta lieta? Paldies, Roberts Zariņš Edited November 4, 2012 by Roberts Zariņš Quote Link to comment Share on other sites More sharing options...
F3llony Posted November 4, 2012 Report Share Posted November 4, 2012 Vislabākais veids ir šādus datus glabāt NoSQL vai atmiņas tabulā (memory table). Tikai neaizmirsti par datu saglabāšanu un ielādi ja kaut kas salūzt. Ja izmantosi RDBMS, tad select id, whatever, whatever, (select count(id) from read_registry where topic_id = id) as read from topiki Quote Link to comment Share on other sites More sharing options...
daGrevis Posted November 5, 2012 Report Share Posted November 5, 2012 Roberta variants ir slikts un es neiesaku tā darīt. Performance kaut vai php.lv lieluma forumam būtu graujoši slikta. Ir jāpieiet problēmai ar saprātu: http://stackoverflow.com/a/5554731 . Quote Link to comment Share on other sites More sharing options...
F3llony Posted November 5, 2012 Report Share Posted November 5, 2012 E.g lietotājs ielogojas, izlogojas, ielogojas pa jaunu un viss "atzīmējas kā izlasīts". Interesanti, kā tu šādu funkcionalitāti atrakstītu akceptos? "Lai atzīmētu visu saturu kā izlasītu, ielogojieties pa jaunu".... ??? Jā, problēmai pa tiešām jāpieiet ar saprātu - eg. jāreģistrē tikai lasītie topiki (TOPIKI, nevis POSTI) un izmaiņas foruma saturā, t.sk. izmaiņas kā jauni komentāri topikos, kā arī izmaiņu laiks - last updated. Vari iebāzt savu "performējošo" risinājumu kur saule neiespīd, stakoverflowa koderi... Quote Link to comment Share on other sites More sharing options...
daGrevis Posted November 5, 2012 Report Share Posted November 5, 2012 Tad kad tevi pieladīs pie lielais sistēmas, nevis kkādām vizītkartēm tikko atvērtām traktoristu firmām... varbūt sapratīsi. Quote Link to comment Share on other sites More sharing options...
Roberts Zariņš Posted November 5, 2012 Author Report Share Posted November 5, 2012 Jā, runa ir par topikiem, nevis postiem jeb komentāriem; paldies arī par atbildēm. Tā kā piedāvātie varianti bija ļoti pretrunīgi, varbūt ir vēl kāds, kas varētu dalīties pieredzē šajā sakarā? Quote Link to comment Share on other sites More sharing options...
Faks Posted November 5, 2012 Report Share Posted November 5, 2012 Teorija ir sada lietotajs atver temu vala un lai vina vinam butu izlasita liec vinu ieksa db tiko vins vinu atver vai ari liec auto insert pec kaut kada laika kads vins atvera to temu un glaba pienemsim db tabula sada aptuveni lietotajs pecis,izlasija = ja,foruma grupas id = xxx,foruma tema = id xxx,cikos = 17:20:16 ja tas izpildits tad izvadi ar if parbaudem izlasits vai tamlidzigi nekas ipas nau vienkarsi visu var realizet bez ipasam noslodzem. Quote Link to comment Share on other sites More sharing options...
daGrevis Posted November 5, 2012 Report Share Posted November 5, 2012 Jā, un tas būs ļoti lēni. Vismaz tad izmanto NoSQL (kā jau Roberts minēja). Quote Link to comment Share on other sites More sharing options...
spainis Posted November 5, 2012 Report Share Posted November 5, 2012 un ar ko noSQL's uzreiz būs labāks, ja nu vien protams Redis vai kāds cits memory store risinājums Quote Link to comment Share on other sites More sharing options...
F3llony Posted November 5, 2012 Report Share Posted November 5, 2012 (edited) http://pastebin.com/E87UJPU5 prasīja man savas 15 minūtes lai uzrakstītu un pie kafijas notestētu uz nouta - pie 10 000 lietotājiem, 200 000 topikiem un 50 000 000 reģistrētiem lasījumiem reģistrā (diez vai ir iespējams ar šādu struktūru) vaicājums pēc 100 topikiem (diez kādā forumā ir 100 topiki vienā lapā?) izpildījās vidēji 0,003188s. Nav tas elegantākais risinājums, bet refinējot - doma ir skaidra. Kverijs SELECT `id`,`forum_id`,`title`,`last_update`, (SELECT COUNT(`topic_id`) FROM `registry_topics_read` WHERE `user_id` = 1 AND `read_date`>=`last_update` AND `topic_id`= `id`) as `read` FROM `forum_topics` ORDER BY `id` DESC LIMIT 9999,100; Varbūt esmu nolaidis greizi izpildes loģikā, bet izskatās, ka darbojas. Nav ne vēlmes, ne iemesla pārbaudīt. Par noSQL - Couchbase + cache ar pēdējiem 1000 topikiem un lasījumu informāciju. Ja info nav CB, no DB. Vēl protams kešu var dublicēt arī memory tabulā - statiska rakstīšanai un bck, ar trigeriem ievietojam memā un nolasam no turienes. To gan neesmu pārbaudījis. Ja esi multivalodu-fags: ņem aiz rociņas C un raksti PHP ext ar api pie DBA vai NoSQL, sliktākajā gadījumā - indekss ar kešu džabā. Edited November 5, 2012 by F3llony Quote Link to comment Share on other sites More sharing options...
codez Posted November 5, 2012 Report Share Posted November 5, 2012 Glabājam katram lietotājam pēdējo laiku, kad topiks lasīts. Nelasītie būs - visi, kuriem ir izmaiņas vēlākas par lietotāja pēdējo apskates laiku (ja nav apskatīts vispār, tad laiku pieņem par 0) un nav senākas par 3 dienām. Apmeklējumu tabula būs vidējais lietotāju apmeklēto topiku skaits * lietotāju skaits. Bet no šīs tabulas var tīrīt ārā visus apmeklējumus, kas vecāki par 3 dienām. Tādā veidā tabulas izmērs būs vidējais lietotāja apmeklēto topiku skaits pēdējās 3 dienās * lietotāju skaits. Šāda sistēma bez problēmām vilks pāris miljonu lietotāju forumu. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.