Citat:
..Sad u realnosti ovo je prakticno nemoguce...
Ako je realnost takva da je nemoguce da jedn student polaze isti ispit kod dva profesora, onda tvoje relacije treba tu realnost verno da predstave.
Mislim da ti nedostaje nekoliko relacija:
Predikat Profesor [SifraProf] predaje predmet [SifraPred] ima relaciju definisanu ovako;
ProfesorPredmet:{SifraProf, SifraPred}, PK :{SifraProf, SifraPred},
Relacija ProfesorPredmet dozvoljavaa vise profesora predaje isti predmet.
Student slusa jedna predmet kod tacno jednog profesora (realnost o kojoj pricamo). Predikat bi bio:
Student [SifraStud] slusa predmet [SifraPred] kod profesora [SifraProf] , sto daje relaciju:
StudentSlusaPredmete = {SifraStud, SifraProf, SIfraPred},
PRIMARY KEY {SifraStud, SifraPred} -> svaki ispit student slusa tacno jednom
FOREIGN KEY (SifraProf, SifraPred) REFERENCES ProfesorPredmet(SifraProf, SifraPred) -> ispist slusa samo kod onog profesora koji taj ispit i predaje (vise profesora moze da predjae isti ispit, ali je samo jedan od njih dodeljen nasem studentu)
Ako hoces da kazes "Student moze da polozi ispit tacno jednom" onda brises profesora iz relacije Polozio, ovako:
POLOZIO= {(StudentID, int) , (PredmetID, int), (Datum_isp, date), (Ocena_pred, int)}
PRIMARY KEY = {StudentID, PredmetID}
FOREIGN KEY (StudentID, PredmetID) REFERENCES StudentSlusaPredmete (SifraStud, SIfraPred)
Na osnovu relacije POLOZIO znamo da je student polozio ispit [SifraIsp]. Iz relacije "StudentSlusaPredmete " znamo da predmet [SIfraPred] studentu predaje profesor [SifraProf], posto student slusa (i polaze) ispit samo kod jednog profesora.
Citat:
I samo da pitam kako bih napravili relaciju od kardinalnosti (1,1) <-> (1,1) posto nigde nisam video da je neko pravio relaciju sa
ovom kardinalnoscu. Obicno je to (0,1)<->(1,1)
Malo si nezgrapno napisao kardinalnosti. Pise se
1 : (0,1) = jedan prema nula ili jedan (postoji u tabeli "roditelj" ali ne mora da psotoji u tabeli "dete"
1 : 1 jedan prema jedan
1:1 imas na primer ako imas relacije
Radnici: { [SifarRadnika],[Ime],[Prezime],[DatumRodjanja]} PK (SifraRadnika)
i
Plate { [SifarRadnika], [Plata]} PK (SifraRadnika)
1:1 je logicki uslov. Fizicki, danasnji RDBM sistemi ne pruzaju mogucnost da se to izvede. Radnik prvo mora da postoji u tabeli Radnici, pa mu se onda dodeljuje plata. Ako je uslov da ne sme da bude ni jedan radnik u tabeli Radnici koji nema platu, onda se mogu spojiti relacije Radnici i Plate, ovako:
Radnici: { [SifarRadnika],[Ime],[Prezime],[DatumRodjanja],[Plata]}
Medjutim, razlog za razdvajanje relacija jest poverljivost podataka - ne zelimo da svi koji imaju pravo d avide tabelu Radnici vide i njihove plate. U praksi se obicno razdvoje tabele, aonda se zabrani pisanje (INSERT) direktno u tabelu Radnici. Zatim se napravi stored procedure kojoj se posalju parametri (@SifarRadnika,@Ime,@Prezime,@DatumRodjanja,@Plata} pa procedura odradi u jednoj transakciji
BEGIN TRANSACTION
INSERT INTO Radnici (@SifarRadnika,@Ime,@Prezime,@DatumRodjanja
ISERT INTO Plate (@SifarRadnika, @Plata)
COMMIT
Naravno da onaj ko treba da unosi podatke u tabele dobije pravo da izvrsava stored procedure.
Druga opcija je da se cuva plata u tabeli radnici, i da se svima zabrani citanje iz te tabele. Onda se naprave views, jedan koji pokazuje plate, drugi koji ne pokazuje, pa se daju permissions na views onima koji smeju da vide jedno ili drugo.