[ nenadst @ 02.10.2010. 00:43 ] @
Nije da se bas ne razumem u SQL, ali nije mi jasno kako da napravim sledece:

Imam naprimer tabelu sa nekim sertifikatima!
kako da napravim da jedan sertifikat kao preduslov za ucenje mora da ima dva vec uspesno zavresna sertifikata...
dakle ovako nekako sam ja to zamislio
Broj(primary) | Ime | preduslov (foreign key)
1 | Obican | null
2 | normalni server| 1
3 | normalni sql | 1
4 | master | (e sad ovde nemogu da napisem dva(2 i 3) sertifikata, koja su preduslov da bi se uradio taj master sertifikat)
kako da napravim to najbolje?
[ Zoran.Eremija @ 02.10.2010. 14:19 ] @
Ja bih Vas problem postavio na sledeci nacin
[ Zidar @ 02.10.2010. 21:19 ] @
Ovo nikako nije 'problemcic'. Situacija je ozbiljna, to jest imamo ozbiljan problem. A po Marfijevom zakonu za svaki ozbiljan problem postoji garantovano jednostavno ocigledno resenje, koje je nazalost pogresno. Zoran je ovoga puta nazalost delimicno potpao pod udar marfijevog zakona

Problem je u tome sto dobijanje novog sertifikata X zavisi od prethodno dobijenih sertifikata (A,B,C....). FK moze samo da propise koji su sertifikati dozvoljeni, ali ne i da proveri da li su svi prisutni. Zoranovo resenje jeste u stvari pola resenja. Potrebno ali ne i dovoljno za resenje.

a nije i dovoljno jer treba obezbediti da se novi sertifikat moze dodeliti samo kad su vec dodeljeni svi prethodno zahtevani. Zanci, ne smem da unesem novi red, ako prethodno ne postoje vec redovi definisani u Zoranovoj tabeli SertifikatPreduslov.

Za neke specijalne slucajeve, mogli bi da napisemo FK, ali u opstem slucaju nema resenja. Taj specijalni slucaj je kad svaki sertifikat zavisi od tacno jednog, a taj jedan moze biti iz neke grupe. Na primer, da bi polagao Beton moras imati polozene ili Statiku, ili otpornost materijala ili Matematiku, znaci bilo koji bar jedan od ova tri. Resenje za takav slucaj je interesantno, ali mislim da ovde to nije slucaj.

Za opsti slucaj nema druge nego pisati CHECK constraint koji gleda u prethodne redove iste tabele (minimlan uslov) a moze da zatreba i gledanje u druge tabele (opsti slucaj). Normano, CHECK constraints, za sada, u vecini RDBMS to ne mogu da rade, iako SQL standard to propisuje. Mislim da to moze da uradi PostgresSQL ili Firebird, ne znam tacno, neka me Chachka dopuni ovde, baza koju on koristi mislim da moze da radi ovakve stvari.

Dakle, ako radis na sistemu koji podrzava CHECK constraints koje vide celu tabelu, a i sire, onda idi tim putem. Ako si na MS SQL i slicno, postoji 'workaround'.. Napise se UDF funkcija, koja radi ono sto CHECK ne moze, pa onda CHECK pozove UDF. Imas jedan ili dva napisa o tome i na srpskom jeziku, ovde http://www.baze-podataka.net/2...-funkcija-u-check-constraints/ i ovde http://www.baze-podataka.net/2...nstraint-sql-rezervacija-soba/.

Treba nam vise detalja da bi ti konkretno pomogli. Generalno, trebaju ti verovatno dve tabele:
OsvojeniSertifkati (PolaznikKursa as osoba, OsvojeniSertifikat as sertifikat)
Uslovi (Sertifikat as sertifikat, Preduslov AS sertifikat) (Zoranova tabela)

U tabeli Uslovi, za svaki sertifikat X definises skup sertifikata (A,B.C,D...) koji treba da se osvoje da bi se dobio sertifikat X. Moguce je da za svaki sertifikat X postoji tacno jedan skup preduslova. A moguce je i da se trazi da od recimo 5 prethodnih treba imati bilo koja 3, sto je lako upisati u tabelu Uslovi, ali poprilicno komplikuje pisanje kvarija koji proverava da li je bat jedan uslov ispunjen.

Uslov za insertovanje novog reda u tabelu OsvojeniSertifikati je da u tabeli Sertifikati za posmatrani par (PolaznikKursa , OsvojeniSertifikat ) postoji u tabeli Sertifikati, za istog tog Polaznikakursa, skup serifikata koji se pokalpa sa bar jednim od uslova za sertifikat X u tabeli Uslovi. Ovo je tesko i da se procita, a kamo li da se jos i kveri napise. A kveri ce biti od vrste 'relaciono deljenje' i nisam pametan u ovom momentu da kazem sta ce biti dole a sta gore u 'razlomku'

Zato sam rekao da ovo nije 'problemcic' nego 'ozbiljan problem'. Nivo znanja potreban da se ovo resi, prevazilazi 'standardno SQL znanje, pa nemoj da se osecas manje vrednim sto te ovakav problem muci. Ovakvim problemima tek pocinju da se bave i veliki SQL mozgovi, kalibra Chris Date, Joe Chelko i Iztik Ben Gan, i jos uvek nemaju generalno resenje. Mi naravno ne mozemo da cekamo da nam oni razviju teoriju i resenje, mozemo nesto isami valjda da se pomucimo i uradimo.

Ovo bi mogla da bude prilicno zapetljana mozgalica, samo da vidimo precizno sta se trazi.



[ nenadst @ 03.10.2010. 13:23 ] @
momci hvala puno stvarno
pogotovo za dobre linkove, sve je lepo objasnjeno, nisam ni znao da postoji takav domaci sajt ;)
i koristicu CHECK U svakom slucaju, imam SQL 2008,