Jump to content
php.lv forumi

Raksts - lasīts vai nelasīts


Roberts Zariņš

Recommended Posts

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 by Roberts Zariņš
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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...

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by F3llony
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...