|
SQL baze podataka - Sponzor: Baze-Podataka.net MySQL, MSSQL, Oracle, Access, ODBC. Ako imate problem brže i preciznije ćete dobiti odgovor ako priložite strukturu tabela ili skript koji kreira tabele i puni ih test podacima umesto što to problem opisujete samo rečima. Sponzor: Baze-Podataka.net - Blog o bazama podataka |
![]() |
|
Alati teme | Način prikaza |
|
![]() |
#1 |
Direktor Kombinata
Invented the damn thing
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
![]() ![]() |
![]() Model je prilično jednostavan. Imamo korisnike, zadatke i zaduženja gde na jedan zadatak može da bude stavljeno više korisnika:
users -< assignmnets >- tasks Gde je assignments klasična vezna tabela: user_id task_id Ono što kvari jednostavnost rešenja je to da ako zadatak nema direktno dodeljene korisnike onda se smatra svačijim i treba da se nađe u listi svih korisnika (Assigned to Anyone). Ovo lako mogu rešiti, ali rešenja koja mi padaju na pamet nisu baš najsjajnija - ili zahtevaju više upita ili keširanje ili slične gluposti. Da li je moguće jednim upitom izvući sve zadatke dodeljene korisniku uključujući i one koji nemaju nikog dodeljenog zadacima ili? Svaka ideja je dobrodošla ![]() |
![]() |
![]() |
![]() |
#2 |
novi član
Na probnom radu
Datum učlanjenja: 20.08.2005
Poruke: 13
Hvala: 0
0 "Hvala" u 0 poruka
![]() |
![]() Ako sam dobro skapirao problem, možda ti nešto od ovoga pomaže:
SELECT * FROM Tasks WHERE Id IN (SELECT id_task FROM ass WHERE id_user = 1) OR Id NOT IN (SELECT id_task FROM ass) SELECT * FROM Tasks LEFT JOIN ass ON Tasks.Id = ass.id_task WHERE ass.id_user = 1 OR ass.id_user IS NULL Pozdrav ps. eh, ovo mi je prva poruka ovde, pa kako je red i običaj: POZDRAV SVIM FORUMASHIMA! ![]() |
![]() |
![]() |
![]() |
#3 |
Goran Pilipović
Sir Write-a-Lot
|
![]() A da probaš da za taskove koji nemaju assigned users dodaš sve jedno key (task_id, 0) u tabelu assignments, i kada čitaš čitaš:
SELECT * FROM assignments WHERE user_id = $user_id OR user_id = 0; i tako dobiješ sve njegove taskove + one koji su dodeljeni svima? Možda nije rešenje by the book, ali bi moglo da radi. Pri tome bi morao da radiš proveru kada god dodeljuješ assignments, recimo ovako: - kada se kreira task, ako nije uneo user id - automatski se dodeljuje svima i kreiraš (task_id, 0) - ako kasnije dodeli nekome assignment, odmah obrišeš (task_id, 0) jer više nije "svačiji" - ako kasnije opet obriše taj assignment, proveriš da li ima još neko kome je dodeljen isti task, ako nema opet kreiraš (task_id, 0)
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman I don't always know what I'm talking about but I know I'm right! |
![]() |
![]() |
![]() |
#4 | |
Domagoj Horvat
Expert
|
![]() Citat:
__________________
postoje ludosti bez kojih je nemoguce ljudsko dostojanstvo |
|
![]() |
![]() |
![]() |
#5 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Glasam za LEFT OUTER JOIN koji je sasas pomenuo, umesto budževina. Trigeri? O gospode...
Pozdrav novom korisniku! ![]() |
![]() |
![]() |
![]() |
#6 |
Python Ambassador
Master
|
![]() Još jedan glas za rešenje sa LEFT OUTER JOIN - školski primer mesta za njegovu upotrebu
![]()
__________________
Python Ambassador of Serbia |
![]() |
![]() |
![]() |
#7 |
Goran Pilipović
Sir Write-a-Lot
|
![]() Sto volite da komplikujete stvari, strasno... samo da bude knjiski - bez obzira sto se radi 3 subselect-a i sto ce taj query da se vuce za sve sto ima preko 100 recorda. Ali mi razmisljamo drugacije, vi razmisljate "by the book" (zato sam i rekao ono gore) a ja razmisljam odmah o sajtu gde ima 50 000 clanova i u svakom trenutku bar 500 online. Ovde je situacija negde blize vasem slucaju, ali se najezim kada vidim da pored jednostavnog resenja neko preferira subselect-ove
![]() Pored toga, mysql po defaultu konvertuje OUTER joinove u dva JOIN-a, tako da to sto vama izgleda "semanticki lepo" i mozes za rever da okacis u stvari je pravi mali genocid za mysql server.
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman I don't always know what I'm talking about but I know I'm right! Poslednja izmena od bluesman : 25. 08. 2007. u 20:52. |
![]() |
![]() |
![]() |
#8 |
novi član
Na probnom radu
Datum učlanjenja: 20.08.2005
Poruke: 13
Hvala: 0
0 "Hvala" u 0 poruka
![]() |
![]() Ne razmišljam(o) "by the book" nego "by the myrphy", pa na primer:
INSERT INTO Tasks (...) <-- UPS, SOME ERROR... --> INSERT INTO Assigments (id_task, 0) ti bazu dovodi u bezveze stanje, ili što bi knjiški moljci rekli "nekonzistentno" ![]() Imho, treba koristiti sve elemente koje jezik (sql ili neki drugi) pruža, pogotovo što su megaherci svaki dan sve jeftiniji ![]() pozz ps. svakako bi bilo najbolje meriti rezultate za svaki konkretan primer, bez toga je bez'ze išta pričati. |
![]() |
![]() |
![]() |
#9 | |||
Python Ambassador
Master
|
![]() Citat:
Kôd:
SELECT * FROM Tasks LEFT JOIN ass ON Tasks.Id = ass.id_task WHERE ass.id_user = {{USER_ID}} OR ass.id_user IS NULL Citat:
![]() Drugo, verujem da si čuo za izreku "premature optimization is the root of all evil". Daleko od toga da ne treba misliti o njoj u fazama projektovanja i implementacije, ali da razmišljamo samo o sirovoj brzini dan-danas bismo programirali u asembleru (u najboljem slučaju). Treće, ne vidim kako ti je jednostavnije da sam brineš o integritetu podataka pored mehanizama koje ti sam sistem pruža. Citat:
U zaključku - uvek sam za jednostavna rešenja koja provereno rade a od mene zahtevaju minimalna ulaganja. Tek ako nastane problem analiziram ga, biram osobine za poređenje, optimizujem (refaktorišem ili menjam rešenje), merim osobine, poredim dobijene rezultate, i na kraju donosim odluku. Nemogućnost merenja osobina, a samim tim poređenja rezultata svodi optimizaciju na čistu masturbaciju - radiš nešto čija je korist u najmanju ruku (excuse the pun) diskutabilna. ![]()
__________________
Python Ambassador of Serbia |
|||
![]() |
![]() |
![]() |
#10 |
Direktor Kombinata
Invented the damn thing
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
![]() ![]() |
![]() Sad sam baš ubacio LEFT OUTER JOIN. Tabela trenutno ima samo 1000 rekorda (query izvlači oko 160) i ne primeti se da je upit nešto spor.
Mogu postovati konstrukciju i EXPLAIN ako ćemo da zalazimo u detalje. Meni je to prilično nova priča pa možda ne bi bilo loše da prodiskutujemo na konkretnom primeru... Btw - u pitanju je nova verzija activeCollaba, ne skript community kalibra gde ima 500 posetilaca istovremeno. |
![]() |
![]() |
![]() |
Alati teme | |
Način prikaza | |
|
|
![]() |
||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
'multiple' ispis iz baze | eclipse | Sva početnička pitanja | 13 | 16. 12. 2010. 00:26 |
Programeri vs Korisnici | bluesman | Programiranje | 35 | 21. 03. 2010. 18:56 |
Huawei HG510 Multiple Vulnerabilities | Ivan | Opušteno | 4 | 18. 02. 2010. 21:59 |
[REŠENO] multiple image upload? | dootzky | Web aplikacije, web servisi i software | 6 | 03. 10. 2007. 13:35 |
vTiger CRM Multiple Vulnerabilities | Ivan | Opušteno | 0 | 04. 09. 2006. 12:58 |