[ define @ 09.04.2005. 09:42 ] @
Interesuje me sledece.
Npr. imam jednu tabelu sa imenima i prezimenima ucenika jedne skole.
Sada u drugoj tabeli se nalaze predmeti koje ti ucenici imaju.
Kako da konstruisem bazu tako da se za svakog ucenika moze uneti ocena, znaci treba da bude povezano. (recimo da ima ukupno 3 predmeta)
Imam problem sa ovim primary key-om. Ako moze neko malo da mi pojasni ukoliko me je razumeo.

Napomena: Znam kako bih uradio da sve to smestim u jednu tabelu, ali zbog vece funkcionalnosti i licne prakse bih volio da vidim kako se to radi i na ovaj nacin.

// Edit by StRiPy: Izmijenjen naslov teme.

[Ovu poruku je menjao StRiPy dana 05.05.2005. u 01:46 GMT+1]
[ caiser @ 09.04.2005. 10:07 ] @
Trebalo bi kreirati jos jednu tabelu koja ce imati kolone id, ucenikId, predmetId i ocena. ucenikId i predmetId bi trebalo biti foreign keys-i na tabelu ucenik kolonu id i tabelu premet kolonu id, respektivno.
[ define @ 09.04.2005. 11:11 ] @
Mozes li da napises kako to ide cisto da vidim da se konsultujem u vezi nekih stvari.
Interesuje me kakva je tu uloga primary keya i foreign keya. Sta mi oni pomazu?
[ caiser @ 09.04.2005. 11:52 ] @
http://dev.mysql.com/doc/mysql...b-foreign-key-constraints.html
http://dev.mysql.com/doc/mysql/en/example-foreign-keys.html

[ define @ 09.04.2005. 23:23 ] @
ma sve je to ok, kontam ja povezivanje tabela, ali ne kontam sta ce mi primary key kada mogu i bez njega...
[ _owl_ @ 10.04.2005. 00:43 ] @
Svrha primarnog kljuca je da onemoguci pojavljivanje dva reda u tabeli sa istim vrednostima kolona koje cine primarni kljuc. Ako mislis da mozes bez primarnog kljuca onda samo napred.

@caiser
ucenikId i predmetId bi trebali da cine i primarni kljuc u toj tabeli.
[ caiser @ 10.04.2005. 08:17 ] @
U tabelama ucenik i premet ili u tabeli ocene?
[ _owl_ @ 10.04.2005. 13:38 ] @
U tabeli ocena (koja sadrzi kolone ucenikId, predmetId i ocena). Mada sada vidim da nigde ne pise da jedan ucenik moze imati samo jednu ocenu iz jednog predmeta (jbg. navika sa fax-a).
[ caiser @ 10.04.2005. 20:48 ] @
Zato me je i zacudio tvoj predlog. :) Moze i tako ako baza sluzi samo za maturski sto je verovatno i slucaj (3 predmeta), ali bolje da se ostavi mogucnost za 'nadogradnju'. ;)
[ define @ 11.04.2005. 13:41 ] @
Ovako
na jednoj strani se unose podatci za svakog novog ucenika

Code:

CREATE TABLE studenti(
    id        int PRIMARY KEY auto_increment,
    ime        char(15) not null,
    prezime        char(20) not null,
     username     char(16),
     passwd         char(16) not null,
    adresa        char(40) not null,
    grad        char(20) not null,
    telefon        char(20) not null,
    email        char(40) ,
    godina        char(10) not null
);

a u druga tabela je za ocene za fax
Code:

CREATE TABLE prva(
    id        int,
    tehnicke                 int,
    linearna                 int,
    fizika        int,
    logika        int,
    prog1        int,
    analiza        int,
    arhitektura    int,
    engleski    int,
    algoritmi    int
);

eh sada kada se unesu podatci za ucenika admin moze i da unosi ocene za svakog ucenika
Mislio sam da se unese id studenta i njegove ocene u ovu tabelu prva, medjutim javlja se problem sto se moze uneti vise ocena, a meni je potrebno da se unosti samo jedna. I da napomenem da mi treba takodje da moze ocena da se azurira jer na ovaj nacin je moguce uneti samo jednom ocene, dok meni treba da mogu da se unose ocene redom kako ucenik dobija ocene, znaci nesto kao update.
Znao bih da uradim sve u jendoj tabeli ali bih volio da odradim ovako jer ovako i stedim prostor.
[ caiser @ 11.04.2005. 13:46 ] @
Resenje ti je dato, na tebi je da odradis implementaciju. Ako hoces da neko to odradi umesto tebe zna se sta moras da uradis...
[ Dejan Topalovic @ 13.04.2005. 21:45 ] @
A da odvojis tabele? Evo pokusacu da ti pomognem koristeci visi nivo normalizacije...

Kreiras tabelu za godine:
Code:

CREATE TABLE godina (
    godinaID tinyint(1) NOT NULL,
    nazivSmjera VARCHAR(30),
    PRIMARY KEY(godinaID)
);


Kreiras tabelu sa popisima predmeta:
Code:

CREATE TABLE predmeti (
    predmetID tinyint(2) NOT NULL AUTO_INCREMENT,
    nazivPredmeta VARCHAR(100) NOT NULL,
    PRIMARY KEY(predmetID)
);


Zatim kreiras agregatnu (lookup) tabelu za predmete sa odredjene godine:
Code:

CREATE TABLE godina_predmet (
    godinaID tinyint(1),
    predmetID tinyint(2),
    PRIMARY KEY(godinaID, predmetID)
);


Dalje, kreiras tabelu za ocjene (1-5 ili 6-10; Da li se moraju zapisati i podaci kada student padne na ispitu?):
Code:

CREATE TABLE ocjene (
    ocjenaID int(11) NOT NULL AUTO_INCREMENT,
    ocjena tinyint(1) NOT NULL,
    datum DATETIME, -- komentar: ili uzmes samo DATE ...
    PRIMARY KEY(ocjenaID)
);


Kreiras tabelu za studente:
Code:

CREATE TABLE studenti(
    studentID mediumint(8) auto_increment,
    ime varchar(20) not null,
    prezime varchar(40) not null,
    username char(16),
    passwd char(16) not null,
    adresa char(40) not null,
    grad char(20) not null,
    telefon char(20) not null,
    email varchar(100),
    PRIMARY KEY(studentID)
);


Povezes studente sa godinom na kojoj studiraju:
Code:

CREATE TABLE godina_student (
   godinaID tinyint(1) NOT NULL,
   studentID mediumint(8) NOT NULL,
   PRIMARY KEY(godinaID, studentID)
);


Povezes studente sa dobijenom ocjenom:
Code:

CREATE TABLE predmet_student_ocjena (
   predmetID tinyint(2) NOT NULL,
   studentID mediumint(8) NOT NULL,
   ocjenaID int(11) NOT NULL,
   PRIMARY KEY(predmetID, studentID, ocjenaID)
);


Kada zelis npr. saznati koje je ocjene student prve godine Marko Markovic (studentID = 35) dobio iz predmeta algoritmi ( predmetID = 9), koristices npr. ovaj query (pod uslovom da imas aplikaciju koja pretrazuje po imenu, prezimenu, nekom studentskom identifikacijskom broju ili slicno ... Ja sam uzeo za primjer da trazis po studentID, koji unosis interaktivno ili putem dinamicke skripte iz baze):
Code:

SELECT o.ocjena
FROM ocjena o, studenti s, predmeti p, predmet_student_ocjena pso
WHERE
o.ocjenaID = pso.ocjenaID
AND
pso.studentID = s.studentID
AND
pso.predmetID = p.predmetID
AND
p.predmetID = 9
AND
s.studentID = 35;


Ako zelis da dobijes sve studente prve godine, imaces query:
Code:

SELECT s.*
FROM godina g, studenti s, godina_studenti gs
WHERE
s.studentID = gs.studentID
AND
gs.godinaID = g.godinaID
AND
g.godinaID = 1;



Ufff, naporno je ovo :)
Nisam provjeravao ovo i radio sam napamet iz glave, tako da je moguce da negdje ima greska ... Vjerovatno bi nesto valjalo i denormalizovati, ali to prepustam tebi...
[ Dejan Topalovic @ 14.04.2005. 12:35 ] @
Zaboravio sam nesto. :(

Tabelu godine mozes prepraviti i izbaciti kolonu nazivSmjera.
Umjesto toga, mozes kreirati dodatnu tabelu za nazive smjerova:
Code:

CREATE TABLE smjerovi (
    smjerID tinyint(2) NOT NULL AUTO_INCREMENT,
    nazivSmjera VARCHAR(50),
    PRIMARY KEY(smjerID)
);


Naravno, moras povezati tabele godine i smjerovi:
Code:

CREATE TABLE godina_smjer (
    godinaID tinyint(1) NOT NULL,
    smjerID tinyint(2) NOT NULL,
    PRIMARY KEY(godinaID, smjerID)
);


Mislim da sad imas kompletan dizajn baze za svoju aplikaciju. Osim ako nemas jos neke potrebe za tu aplikaciju?