Toms Posted August 18, 2005 Report Share Posted August 18, 2005 Ir lietotāju tabula un online tabula. Lietotāji: id vards uzvards Online: id u_id Kad lietotājs ielogojas, viņa ID tiek ierakstīts iekš online tabulas. Lai kāds cits varētu redzēt, kas ir onlainā, notiek šādi: 1)SELECT no online tabulas (noskaidro visus, kas onlainā) 2)SELECT no lietotāju tabulas (dabū vārdus, uzvārdus pēc ID, kas saņemti no online tabulas) VARIANTS #2: Online tabula šāda: id u_id vards uzvards Lai redzētu, kas onlainā: 1)SELECT un uzreiz parādam visus ar vārdiem, uzvārdiem. TĀTAD: 1)Notiek divi select (viens mazāks, otrs lielāks pēc informācijas daudzuma.) 2)Viens selects (online tabulā glabājas visa lietotāja info, kad viņš onlainā) Pieņemot, ka onlainā ir *) 1000 *) 4000 lietotāji. Kurš variants labāks? Link to comment Share on other sites More sharing options...
bubu Posted August 18, 2005 Report Share Posted August 18, 2005 (edited) A kāpēc neiztikt ar vienu tabulu? lietotaji (id, vards, uzvards, online CHAR(1)) Kad lietotājs ielogojas: UPDATE lietotaji SET online='Y' WHERE id=$id Kad izlogojas: UPDATE lietotaji SET online='N' WHERE id=$id Kad vajag uzzināt visus tos, kuri online: SELECT * FROM lietotaji WHERE online='Y' Neredzu jēgu taisīt citu tabulu 1:1 relācijai šitik maziem datiem. Ja nu tomēr gribi lietot savu 1-o variantu, tad jau arī var iztikt ar vienu selektu: SELECT lietotaji.* FROM lietotaji JOIN online ON lietotaji.id = online.u_id Edited August 18, 2005 by bubu Link to comment Share on other sites More sharing options...
des Posted August 18, 2005 Report Share Posted August 18, 2005 Kad lietotājs ielogojas: UPDATE lietotaji SET online='Y' WHERE id=$idKad izlogojas: UPDATE lietotaji SET online='N' WHERE id=$id Kad vajag uzzināt visus tos, kuri online: SELECT * FROM lietotaji WHERE online='Y' Šim risinājumam ir viena problēma. Lietotājs ielogojās un aizver browseri. Šis lietotājs pēc tam visu laiku rādās online. Ir vajadzīgs vēl kaut kāds timestamps, kurš jāupdeito pie katra lietotāja klika. Un tad jāselektē lietotāji, kuri ir kaut ko darījuši pēdējās x minūtēs. Link to comment Share on other sites More sharing options...
bubu Posted August 18, 2005 Report Share Posted August 18, 2005 Nu a šī pati problēma nav arī tavā risinājumā? Tur arī neredzu nekādu timestampu. Bet pēc būtības - jā tev taisnība, piemet klāt kautkādu timestmapu, kurā glabāsi pēdējo laiku, kad lietotājs pieprasījis kautkādu lapu un viss būs ok. Link to comment Share on other sites More sharing options...
Grey_Wolf Posted August 18, 2005 Report Share Posted August 18, 2005 vienkaarshi 3 pieprasijumi 1. nodzeesh visus lietotaajus kuriem pagaajis noteikts laiks teiksim 3 - 5 min 2 pievieno ierakstu par lietotaaju un tekosho laiku (katram savs identifikaators) - teiksim lietotaaja ID vai niks vai....... 3 paraada visus lietotaajus (raadot tikai tos kuri neatkartojas) (skaitu utt) -------- vissa tabula tiek glabaata atminjaa (nav jeegas glabaat uz diska) P.S. shii probleema jau ir daudzreiz apspriesta...... meklee tepat forumaa Link to comment Share on other sites More sharing options...
Analgiins Posted August 18, 2005 Report Share Posted August 18, 2005 (edited) vareetu tabulaa lietotaaji pielikt veel vienu lauku expire, un to expire vajadzeetu updeitot pie katra klika (uzstaadiit tekosho laiku - time()), un peec tam atlasiit lietotaajus online ar shaadu vaicaajumu: $query = sprintf("SELECT * FROM lietotaji WHERE online='Y' AND expire + %s >= %s", 360, time()); Edit: tjip 360 - 6 min Edited August 18, 2005 by Analgiins Link to comment Share on other sites More sharing options...
Venom Posted August 18, 2005 Report Share Posted August 18, 2005 1. nodzeesh visus lietotaajus kuriem pagaajis noteikts laiks teiksim 3 - 5 min - reizi X sekundēs/minūtēs 2 pievieno ierakstu par lietotaaju un tekosho laiku (katram savs identifikaators) - teiksim lietotaaja ID vai niks vai....... šeit būtu vēlams tabulā glabāt lietotāju unikālos ID un uzlikt uz to unikalitātes indeksu, bet pievienojot jaunu ierakstu izmantot REPLACE ... DELAYED- tādejādi par konkrētu lietotāju tiks turēts tikai viens jaunākais ieraksts, ar ko atkrīt papildus noslogošana ar 3 tālāk - rezultātus kešot, e.g. sessijā (protams, tur arī nevajadzētu dzīt kādus 2mb info, tikai kādus 10 "pēdējāko" jūseru id un info, bet tālāk rādīt ar atsev. linku "skatīt visus ūserus online", online liet. skaitu un vēl ko visnoderīgāko) Link to comment Share on other sites More sharing options...
Grey_Wolf Posted August 18, 2005 Report Share Posted August 18, 2005 sadaam lietaam velams tabulas tips HEAP resp visi dati glabaajas op atminjaa :) tas dos krietni aatraaku pieejas laiku un nenoslogos disku ---- taapat tie dati vajadziigi tikai tad kad serveris straadaa un 3-5 min :) - nav liela nelaime ja pie servera parstarteeshanas dati pazuud ;) Link to comment Share on other sites More sharing options...
Aleksandrs Posted August 18, 2005 Report Share Posted August 18, 2005 Vienā tabulā neieteiktu visu glabāt, jo ja piemēram citur sistēmā pēc ID ir nepieciešams izvilkt vārdu, uzvārdu ļoti bieži un blakus vēl ir timestamp, tad tabula vislaik tiks atjaunota, tādā gadijumā mysql cache nevarēs uzlabot ātrumu.. jo tabulas dati tiks atjaunināti teju vai katru sekundi. Link to comment Share on other sites More sharing options...
Toms Posted August 18, 2005 Author Report Share Posted August 18, 2005 teju vai katru sekundi. 21156[/snapback] Tieši par šo arī domāju. tāpēc negribas vienā tabulā visu. Laikam palikšu pie sava varianta #2, lai mazāk pieprasījumi lieotāju tabulai (atkritīs apskatīšanās, kas tieši ir onlainā, apdeitošana timestamp un atmešana visu, kas nav bijuši ilgāk par 10 min...) Link to comment Share on other sites More sharing options...
Kaitnieks Posted August 18, 2005 Report Share Posted August 18, 2005 Parasti shaadas atbildes necenshas izziist no pirksta (vai prasiit baram PHP praktikantu) bet noskaidrot, reaali notesteejot uz kaut kaadiem testa datiem. Link to comment Share on other sites More sharing options...
eglitis Posted August 18, 2005 Report Share Posted August 18, 2005 1. nodzeesh visus lietotaajus kuriem pagaajis noteikts laiks teiksim 3 - 5 min - reizi X sekundēs/minūtēs Ir pāris reizes bijusi līdzīga situācija. Ja lietotāju nav pārāk daudz, šo "tīrīšanu" var veikt nevis ik pēc noteikta laika, bet veicot pieprasījumu par tiešsaistē esošajiem lietotājiem. Kaut gan katrai situācijai savs risinājums Link to comment Share on other sites More sharing options...
v3rb0 Posted August 18, 2005 Report Share Posted August 18, 2005 vareetu tabulaa lietotaaji pielikt veel vienu lauku expire, un to expire vajadzeetu updeitot pie katra klika pie katra klicka nevajag nemaz updeitot, pietiek ar glabasanu sessijaa pedeejo pielogosanas laiku un updeitosanu ieks db tikai ja ir pagajusas X laika vienibas kops pedeejas pielogosanas. Kaitnieks: kas vainas uzprasiit kaa citi dara un paarliecinaaties ka pats daru vispareizaak :D Link to comment Share on other sites More sharing options...
Analgiins Posted August 18, 2005 Report Share Posted August 18, 2005 Parasti shaadas atbildes necenshas izziist no pirksta (vai prasiit baram PHP praktikantu) bet noskaidrot, reaali notesteejot uz kaut kaadiem testa datiem. 21173[/snapback] runaajot un kontakteejoties arii ar baru praktikanti var ieguut labas idejas Link to comment Share on other sites More sharing options...
Recommended Posts