Topic: "Neperskaitytų žinučių" algoritmas

Gal kas padės, pasiųlys gera idėją kaip realizuoti tokį algoritmą.:)
Na, esme paprasta - turbūt daugelis lankosi forumuose ir susiduręs su tokiu dalyku, kaip "naujos žinutės", kurių dar neperskaitėt. Paspaudžiat tam tikrą mygtuką ir pamatot visas žinutes, kurias dar nesat perskaitę.

Tai va, reiktų panašios funkcijos, kurios optimalaus įgyvendinimo vis dar nesugalvoju, nes atsiranda vis kokių nors negerų niuansų.

2 (edited by Aleksandras 2007-04-27 14:21:48)

Re: "Neperskaitytų žinučių" algoritmas

štai ką pačiam pavyko primastyti šia tema.

Na, tarkim yra vartotojų (`tbl_users`) ir žinučių (`tbl_posts`) lentelės, jų struktūra nelabai esmė. Perskaitytų žinučių sąrašui, tikriausiai, prireiks dar vienos lentelės - `tbl_viewedposts` su laukais `user_id`, `post_id`.

Toliau. Pvz. jau yra 100 vartotojų sąrašas, ir yra 100 parašytų žinučių. Norint įdiegti minėtą funkciją, reiktų, kad visiems esamems vartotojams visos esamos žinutės jau būtų "perskaitytos". Todėl logiška būtų priimti, kad esant tuščiai `tbl_viewedposts` lentelei, visos žinutės yra "perskaitytos" pas visus vartotojus (šiuo atveju, `tbl_viewedposts` lentelei labiau tiktų vardas `tbl_unviewedposts`).

Tačiau, toks variantas nepatinka tuo, kad norint pridėti naują vartotoją, jam visos žinutės turi būtų "neperskaitytos". O tam reikia lentelėje `tbl_viewedposts` padaryti 100 įrašų (t.y. tiek, kiek yra žinučių). čia gal ir nebūtų bėdos, nes naujam sukurtam vartotojui galima daryti ir taip, kad visos senos žinutės jam būtų "perskaitytos".  Tačiau iš kitos pusės, kūriant naują žinutę, `tbl_viewedposts` taip pat reikia užpildyti tiek kartų, kiek yra vartotojų.


Kitas variantas, jei imti atvirkščiai - jei lentelė `tbl_viewedposts` tusčia, tada visiems vartotojams visos žinutės yra "neperskaitytos"/"naujos". Tačiau šiuo atveju yra panašios problemos. Pvz. norint, kad visiems seniems vartotojams visos senos žinutės būtų "perskatytos" reikia padaryti 100*100 įrašų (100 - vartotojų, 100 - žinučių). Kūriant naują vartotoją, kuriam visos žinutės būtų "perskaitytos", vėl gi reikia daryti tiek įrašų, kiek yra naujienų.


Vienu žodžiu, mano išmastyti variantai man kažkaip nelabai patinka ir atrodo neoptimalūs - po gana dažnai daromų veiksmų, vykdomos ilgos užklausos. Gal visas tas žinutes dar pagal laiką kaip nors žiūrėti, kad pavyzdžiui po 10 dienų visos žinutės pažymiamos kaip "senos" ir "perskaitytos", o jei būtų kokia nors svarbi žinutė, tai ją atitinkamai dar kaip nors pažymėti. Na, nežinau, norėtųsi tiesiog išgirsti šviežių idėjų šia tema, nes jau protas biški užsiciklino. ;)

Re: "Neperskaitytų žinučių" algoritmas

Pradžiai pamąstymas ta tema: jeigu tu tikrai nori, kad kiekvienas vartotojas galėtų matyti kiekvieną neperskaitytą žinutę, tada taip, reikės gamiti atskirą lentelę, kur galima talpinti tokią informaciją apie perskaitytas ar neperskaitytas žinutes ir atitinkamai pagal tuos duomenis formuoti informaciją. Kaip ir pats minėjai tokiu būdu duomenų kiekis lentelėjė pastoviai didėja ir daug niuansų su naujais vartotojais ir pan.

Norint viską supaprastinti reikia kažko atsisakyti. Pavyzdžiui galima atsisakyti tos minties, kad laikyti visą informaciją apie unikalias žinutes - gal galima laikyti tik datą, kada vartotojas paskaitė paskutinę žinutę, o žinutes atsiradusias forume po tos datos laikyti "naujomis". Jeigu pavaikščiotum po šitą forumą (punBB) pamatytum ir tokių užrašų kaip "paaryti visas neperskaitytas žinutes naujomis" ir pan. Gali parsisiųsti keletą pagrindinių internetinių forumų ir pasinagrinėti kaip jie realizuoja tokias funkcijas ;)

Re: "Neperskaitytų žinučių" algoritmas

Dėkui už idejas.
Kolkas tikriausiai ir apsistosiu ties Tavo pasiųlytos idejos su paskutinės perskaitytos žinutės data.
Nors ši ideja taip pat turi trukumų - pvz. jeigu "naujų" žinučių po paskutinės perskaitytos būtų daug, tai perskaičius naujausią iš "naujų", tada iškart visos naujos, kurios buvo parašytos anksčiau už paskutinę, taip pat bus automatiškai pažymėtos kaip perskaitytos.

Na bet, kaip jau ir pats įsitikinau, kažką tikrai reikia pasiaukoti, kažko labai tobulo čia kažin ar sugalvosi.;)

Re: "Neperskaitytų žinučių" algoritmas

//// INBOXO DB

CREATE TABLE `inbox` (
`id` int(11) NOT NULL auto_increment,

`stat` text( 1 ) NOT NULL ,
`siuntejas` text( 8 ) NOT NULL ,
`gavejas` text( 8 ) NOT NULL ,
`zinute` text( 200 ) NOT NULL ,
`kada` text( 20 ) NOT NULL ,
PRIMARY KEY  (`id`)
) ENGINE = MYISAM ;

//// suskaiciuojam ka gero turim inboxe ir isvedam perskaitytu ir neperskaitytu msg kiekius

$result = mysql_query("SELECT stat FROM inbox where gavejas='$f1'");
while ( $row = mysql_fetch_array($result) )
    {   
$zenklas = $row["stat"];
if ($zenklas=="+"){$naujas++;};
$in++;
};
if ($naujas==""){$naujas=0;};
if ($in==""){$in=0;};

echo "Tavo Zinutes [$naujas/$in]";

taigi, kaip matai pagal stat as nustatau ar zinute skaityta ar ne.
i "-" updeitinam, kai skaitom zinute, o "+" irasom, kai sukuriama nauja zinute.
na manau supratai.

cia skripta dar galima optimizuot, nes greit rasiau, bet tai palieku tau :)

Declare Batai Buvo(2); Begin Dingo(1); Batai.status := 'nerandu'; If Tureciau(batai) = 2 Then Keliauti_pas('vaikai'); Elsif Batai.status = 'nerandu' Then Niekur_eiti_negaliu; End If; While Rankytes = Iesko(batai) Loop Akytes_ji_pamato; End Loop; Apsimauti(batai, 2); Keliauti_pas('vaikai'); End;

Re: "Neperskaitytų žinučių" algoritmas

everx: čia buvo kalbama ne apie privačias žinites, o apie forumo žinutes...

Re: "Neperskaitytų žinučių" algoritmas

my bad.. neisigilinau i tema.

sutinku su minde, bet jei saugoti vien datai, tai as prisijunges ja atnaujinu, vadinasi iskart dingsta nauju zinuciu statusas.

cia buvo vienas dalykas, kitas-tarkim as perskautau viena is naujuju zinuciu ir kaip ja identifikuoti, kad jau skaityta? cia nera kito kelio kaip veikt su atskira lentele ir joje issaugant ne vien data, bet ir tarkim msg id ir nick

sorry, jei parasiau, ta patik ka cia kalbejot :)

Declare Batai Buvo(2); Begin Dingo(1); Batai.status := 'nerandu'; If Tureciau(batai) = 2 Then Keliauti_pas('vaikai'); Elsif Batai.status = 'nerandu' Then Niekur_eiti_negaliu; End If; While Rankytes = Iesko(batai) Loop Akytes_ji_pamato; End Loop; Apsimauti(batai, 2); Keliauti_pas('vaikai'); End;

Re: "Neperskaitytų žinučių" algoritmas

everx wrote:

sutinku su minde, bet jei saugoti vien datai, tai as prisijunges ja atnaujinu, vadinasi iskart dingsta nauju zinuciu statusas.

Galima tas žinutes padaryti "skaitytas" ne tik prisijungus, bet kai atsijungi (baigiasi sesija ar pan.).

Re: "Neperskaitytų žinučių" algoritmas

bet mazai kas atsijungineja...

Declare Batai Buvo(2); Begin Dingo(1); Batai.status := 'nerandu'; If Tureciau(batai) = 2 Then Keliauti_pas('vaikai'); Elsif Batai.status = 'nerandu' Then Niekur_eiti_negaliu; End If; While Rankytes = Iesko(batai) Loop Akytes_ji_pamato; End Loop; Apsimauti(batai, 2); Keliauti_pas('vaikai'); End;