Jump to content
php.lv forumi

Neizlasītie posti


Lynx
 Share

Recommended Posts

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

ā) 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

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

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

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

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

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

 Share

×
×
  • Create New...