Lynx Posted July 21, 2005 Report Share Posted July 21, 2005 Man ir nepieciešams uztaisīt sistēmu, ka visi jaunie posti forumā tiek parādīti kā neizlasīti un te rodas jautājums, kā to vislabāk(serverim un db pēc iespējas mazāks noslogojums) izveidot? Pēc idejas katram lietotājam varētu glabāt neizlasīto postu id iekš datubāzes, bet ja viņš neielogojas, piemēram, 3 mēnešus tā db tiks īsā laikā izveidota milzīga. + katru reizi kādam pakustoties būs forumā jamaļ tā datubāze - imho sanāk galīgi garām. Vēl bija ideja, kas mazāk noslogotu: noteiktā datubāzes tabulā saglabāt pēdējā apmeklējuma laiku un tad skatīties, ja konkrētā posta laiks ir lielāks par pēdējo apmeklējumu tad uzrādam, ka posts ir neizlasīts. Tikai tagad jautājums kā nodrošināt, ka, ja cilvēks šajā apmeklējumā izlasa šo postu tad tas vairs netiek uzrādīts kā neizlasīts. Ir vēl citas idejas? Link to comment Share on other sites More sharing options...
hmnc Posted July 21, 2005 Report Share Posted July 21, 2005 vienkārši pārbaudi kad cilvēks ir pēdējo reizi ielogojies un ja datums tēmai ir pēc tā tad attiecīgi iekrāsojas kā svaiga tēma. Link to comment Share on other sites More sharing options...
sviesc Posted July 21, 2005 Report Share Posted July 21, 2005 ā) tā arī der tikai atliek vel vienu pārbaudi veikt ja dati iekš DB par kādu no usera id t.i. pēdējo parādīšanās laiku ir vēcāki kā 3 mēnešus plivini ārā (jo ja useris nav rādījies 3 mēnešus šaubos vai šim vel ir interese par forumu) un atzīmē tikai jaunos postus, tādā gadījumā nav ajatzīmē lasītie raxti, bet nelasīti un Db arī mazāka jo ja visi izlasījuši visus postus tad iekš Db nava neviena paša ierakta bē) es gan piefiksētu nevis ielogošanās, bet pēdējās darbības laiku, jo nebūtu cmuki rādīt ka jaunas ziņas tikai pēc ielogošanās Link to comment Share on other sites More sharing options...
bubu Posted July 21, 2005 Report Share Posted July 21, 2005 A var arī tikai ar tīru CSS iztikt: http://www.virieshi.lv/index.php?kat=n&id=371 Link to comment Share on other sites More sharing options...
Lynx Posted July 22, 2005 Author Report Share Posted July 22, 2005 Par to tīro CSS zināju, bet pilnībā izslēdzu šādu variantu, jo, ja tiek iztīrīts history visas tēmas uzrādīsies kā nelasītas un tas nu nebūs labi. Par hmnc bija tādi pati ideja, tikai problēma tāda, ka vajadzēs tad speciāli atzīmēt izlasītās tēmas pēc pēdējās ielogošanās, lai visas neuzrādītos, kā neizlasītas, kautgan cilvēks ir apskatījis. Un uz logout iztīrīt, bet tākā cilvēki reti izmanto logout iespēju db paliks netīrīta un būs jadomā kautkāds automatizēts skripts, kas tīra vecos ierakstus ārā. Sviesc bee) variantam arī mīnus, jo tikko kā mēs pakustamies visas tēmas tiek pārtaisītas par lasītām, jo pēdējās kustības laiks > tēmas pēdējā posta laiku. Datubāze ar neilzsītajiem postiem, liakam būtu vislabākais variants, bet pēc idejas nepatīk datubāze, jo nezinu kā operatīvi apvienot datus vadot ārā tēmas. Taisīt kādu Joinu? piemēram: SELECT teemas.id, teemas.kategorija, neizlasiitie.1aisneizlasiitaispoists, tas, velkautkastas, FROM teemas JOIN(kādu joinu vajag, lai nebļautu, ka nevar izvadīt no abām tabulām, ja tomēr tas posts ir izlasīts un nav ieraksts pie neizlasiitajiem.) neizlasiitie WHERE teemas.id = neizlasiitie.teema AND neizlasiitie.user_id = blabla Vēl man iešāvās prātā visu šo infu glabāt sessijā, īsti precīzi nezinu, bet laikam ieksh array() jāglabā un pēc tam meklēt iekš array vai tēma izlasīta un tad sanāk: Cilvēks ienāk, viņam tiek izveidots sessijas mainīgais ar visām neizlasītajām tēmām. Pēc tam vienkārši izvadot ārā tēmas salīdzinam ar id vai ir izlasīts vai nav. Un uz katru kustību papildināt šo sesijas mainīgo ar jaunām tēmam, ja tādas ir radušās. Hmm, cik labi tas ir glabāt daudz datus iekš sesijām? Vēlviens jautājums: sanāk ka mums katru reizi ir jamaļ datbuāze, kad cilvēks pakustās, lai noskaidrotu vai nav jauni posti. Bet jaunie posti ir pašās beigās tabulai, ir kautkā iespējams prasīt lai mysql meklē no tabulas beigām un, piemēram, uztaisīt LIMIT 100, lai nebūtu jaskrien katru reizi cauri pašreizējiem 160 000 postiem. Link to comment Share on other sites More sharing options...
bubu Posted July 22, 2005 Report Share Posted July 22, 2005 Ja tabula ir pareizi indeksēta, tad pofig cik tev tur ierakstu 10'000 vai 100'000. Atšķirība nebūs liela. Link to comment Share on other sites More sharing options...
Venom Posted July 22, 2005 Report Share Posted July 22, 2005 lietotājs kustās - updeitojam viņam last_timestamp plus ir tabula last_unread ar sekojošu struktūru: id|user_id|topic_id|tstamp|read kurā jūzerim ienākot selectojam tos topikus, kas nav izlasīti uz "šodienu" (ar SELECT INTO, bet jāpiedomā pie JOINa, lai no jauna neinsertotos tie paši), pirms tam uztaisot arī DELETE FROM last_unread WHERE tstamp<(00:01 AM iegūts no last_timestamp) kad lietotājs kaut ko izlasa, updeitojam last_unread bool-lauku "read" uz 1/true, tādejādi no SELECT * FROM last_unread WHERE user_id=$user_id AND timestamp>(00:01 AM timestamps no last_timestamp) iegūsim tos topikus, kas uz šodienu ir "jauni" + tiem būs atzīmēts, vai tie ir lasīti vai nau /me domā, ka šeit ir kautkas līdzīgs Link to comment Share on other sites More sharing options...
Lynx Posted July 22, 2005 Author Report Share Posted July 22, 2005 Tā sāku strādāt pie sistēmas pēc Venom padoma un uz doto brīdi īsti nevaru saprast vienā lietā kā labāk. Savadu iekšā visus datus ar INSERT INTO SELECT un viss strādā. Tagad sanāk, ka katram postam ir viens ieraksts un ieejot tēmā mēs tiem postiem, kas ir šajā tabulā pieliekam neizlasīts zīmi. Skatot tēmas atliek tikai salīdzināt vai kādam no ierakstiem nav tāds pats topic_id un parādam, ka neizlasīts. Ir vēl otrs sarežģītaks(bet vai labāks) variants uztaisīt GROUP BY topic_id tagad sanāk, ka katram topikam ir viens ieraksts un nav liela datubāze jakustina, un visiem postiem, kas ir pēc neizlasīto tabulas tstamp laika likt klāt neizlasīts zīmi. Tikai domāju, vai tas GROUP BY pārāk nepaildzina visu procesu un nenoslogo serveri? Šājā gadījumā nevaru arī izdomāt viltīgo Venom Joinu, lai netiktu pēc jaunu postu pievienošanas pievienots ieraksts ar tādu pašu tēmas ID, ja tāda tēma jau eksistē tabulā. Link to comment Share on other sites More sharing options...
Venom Posted July 22, 2005 Report Share Posted July 22, 2005 kaučkas uz šo pusi: DELETE FROM last_read WHERE tstamp<'$last_visited_morning' INSERT INTO last_read (user_id,topic_id) SELECT '$user_id',topics.topic_id FROM topics LEFT JOIN last_read ON last_read.topic_id=topics.id AND topics.create_time>'$last_visited_morning' WHERE last_read.topic_id IS NULL Link to comment Share on other sites More sharing options...
Klez Posted July 22, 2005 Report Share Posted July 22, 2005 (edited) vai tad iekš phpBB nav sistēma, kas rāda neizlasītos postus? Aizejam uz šejieni, novelkam jaunāko phpBB versiju un uzinstalējam un skatāmies un ķidājam :) Edited July 22, 2005 by Klez Link to comment Share on other sites More sharing options...
Lynx Posted July 22, 2005 Author Report Share Posted July 22, 2005 Eh neiet :/ Sākumā nepatika, ka bt_forum_unread tiek izmantots divās vietās un vajadzēja piešķirt citu nosaukumu. Tālāk met paziņojumu: INSERT TABLE 'bt_forum_unread' isn't allowed in FROM table list un tas rodas no ON sintakses. Eh, nav citu ideju, jo ar šitik sarežģitiem joiniem neesmu ņēmies. mysql_query("INSERT INTO bt_forum_unread (user_id, topic_id, time) SELECT '$usr[id]', bt_forum_posts.group_id, NOW() FROM bt_forum_posts LEFT JOIN bt_forum_unread AS tab2 ON tab2.topic_id = bt_forum_posts.id AND bt_forum_posts.publ_date > '$usr[last_login]' WHERE tab2.topic_id IS NULL AND '$usr[last_login]' > NOW() - INTERVAL 1 DAY GROUP BY bt_forum_posts.group_id") or die(mysql_error()); Pārējā forumā visu esmu sataisījis un pēc idejas varētu arī nemaz nelikties ne zinis par dubultiem ierakstiem, vienkārārši uz izvadi arī pievienot GROUP BY, jo tagad, cik tie dubultie ieraksti ir, tik lieki nevajadzīgi topiki tiek izvadīti. Postu apskatē - nekādu problēmu nav. Link to comment Share on other sites More sharing options...
bubu Posted July 22, 2005 Report Share Posted July 22, 2005 Tici man, šitais nav sarežģīts joins ;) Link to comment Share on other sites More sharing options...
v3rb0 Posted July 22, 2005 Report Share Posted July 22, 2005 tieši tā.. sarežģitie tiek rakstīti pus dienu un sākas no 200-250 rindiņām un uz augšu :) Link to comment Share on other sites More sharing options...
Kristabs Posted July 22, 2005 Report Share Posted July 22, 2005 tieši tā.. sarežģitie tiek rakstīti pus dienu un sākas no 200-250 rindiņām un uz augšu :) 19755[/snapback] un kaa 'pa cilveeciski' debugot shitaadu vaicaajumu? Link to comment Share on other sites More sharing options...
Klez Posted July 22, 2005 Report Share Posted July 22, 2005 Explain select :) Link to comment Share on other sites More sharing options...
Recommended Posts