Imam problem jedan.
Imam ovakvu bazu, pojednostavljena je, sa nekim podacima
ID | potomak | otac | majka
1_____X ______Y _____Z
2 Z______A B
Znači u principu, potomak ima oca i majku, ta majka isto ima oca i majku, no to su njihove šifre, ne imena.
I recimo netko se zabunio i mora editirati majka=Z i stavi da je majka=W, odnosno da ima tu drugu šifru
Red 1, stupac majka se promijanio iz Z u W, ali ta majka je ista i dalje ima istog oca i majku, odnosno njhive šifre, no u 2. redu ima oznaku Z.
Kako da napravim da kada izmjeni podatak majka u prvom redu da se promjena dogodi i u 2. redu ili bilo kojim redovima gdje se nalazi ta majka sa prvobitnom oznakom Z.
Ovi pot_ID, ota_ID i maj_ID bi bili foreign keyevi koji bi se odnosili na ID (koji je unique) osobe koja je u pitanju.
ID | potomak | otac | majka | šifra |
1______2______3_____4______Z
2______4______5_____6______X
Ovako bi ti izgledala popunjena tablica:
osoba koja ima ID 1 (a čija šifra je Z) ima potomka sa ID-jem 2 (čija šifra je X).
I sad, ako promjeniš vrijednost šifre za ID 2, i dalje ti u tablici stoji da ID 1 ima potomka s ID-jem 2.
Kad ovako dizajniraš bazu, ispada da ti je polje potomak sasvim suvišno.
Prvo, imaš problem kako upisati ako netko ima 2 potomka.
Drugo, jednostavnim upitom možeš provjeriti tko sve ima određeni ID u polju otac i tako dobiješ potomke te osobe.
(Da bi dobio baš sve potomke nekog ID-a, trebao bi provjeriti tko sve ima taj ID i u polju majka, možda je isti ID nekome otac, a nekome majka, ako je u međuvremenu promjenio spol)
I treće, izbjegavaš grešku, koju sam napravio u ovom primjeru.
Greška je u tome da sam naveo pod ID 1 da mu je potomak onaj sa ID 2.
To bi značilo da sam u ID 2 trebao navesti ID 1 ili kao oca ili kao majku, a nisam.
Pitanje još jedno, jel bi mogao napraviti nešto sa Triggers. Recimo da kada se izmjeni neko polje da pogleda gdje u tablici ima neko polje sa istim podatkom pa da ga izmjeni?
Mislim da ćeš već pomoću prvog primjera uspjeti složiti ono što ti treba.
ps - nije se još nitko javio tko zapravo zna raditi s bazama
ja sam tek počeo učiti osnove dizajniranja baze (relacionih modela) i ne znam napamet složiti ni jedan upit
Aj da probam pomoći. Polje potomak ti je viška. Imaš polje ID i to je identifikator reda.
Znači osoba sa ID=1 ima oca i majku. Polja otac i majka u isto IDjevi koji pokazuju na druge redove u istoj tablici.
Znači ono što trebaš je struktura tipa: ID, ime osobe, otac_id, majka_id.
Da bi napravio automatski update redova prva stvar je da ti tablica mora biti tipa InnoDB, a ne MyISAM. Razlog - MyISAM ne podržava referncijalni integritet.
SQL za kreiranje tablice je ovaj:
CREATE TABLE IF NOT EXISTS table1 ( id INT UNSIGNED NOT NULL AUTO_INCREMENT , ime VARCHAR(200) NOT NULL , otac_id INT UNSIGNED NOT NULL , majka_id INT UNSIGNED NOT NULL ,
PRIMARY KEY (id) ,
INDEX FK_otac (otac_id ASC) ,
INDEX FK_majka (majka_id ASC) ,
CONSTRAINT FK_otac
FOREIGN KEY (otac_id )
REFERENCES table1 (id )
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT FK_majka
FOREIGN KEY (majka_id )
REFERENCES table1 (id )
ON DELETE SET NULL
ON UPDATE CASCADE)
ENGINE = InnoDB;
Dio koji se brine za automatski update redova je ovaj:
CONSTRAINT FK_otac
FOREIGN KEY (otac_id )
REFERENCES table1 (id )
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT FK_majka
FOREIGN KEY (majka_id )
REFERENCES table1 (id )
ON DELETE SET NULL
ON UPDATE CASCADE
Ovime ti govoriš sistemu da polje ‘otac_id’ pokazuje na polje ‘id’. u slučaju brisanja nekog reda sistem će sam u redu gdje u polju ‘otac’ postoji taj ID vrijednost tog polja postaviti na NULL budući više ne pokazuje na ništa (ON DELETE SET NULL)
U slučaju da netko promjeni ID nekog reda sistem će automatski napraviti update svih redova gdje je stari ID u polju otac i postaviti će novi ID u polje otac (ON UPDATE CASCADE).