[ zgas @ 19.06.2007. 15:45 ] @
Nisam neki strucnjak za baze. Doduse napravio sam vise baza i to dosta velikih.

Malo me muci sto nigde nisam koristio Foreigne Key! Imao sam baze sa mnogo tabela koje su logicki povezane, ali ja nikada skoro nisam koristio Foreigne Key.

Koja je svrha upste Foreigne Key-a!?

Oprostite na pitanju, ali ja nisam nikada imao potrebu da ga koristim iako su mi tabele bile logicki povezane.

Sada pravim vecu bazu pa me interesuje... da ne propustim Foreigne Key ako je bitan.
[ Dejan Topalovic @ 19.06.2007. 16:19 ] @
MyISAM engine ne podrzava Foreign Key, tako da nisi nista propustio. :)

Jedino ako budes koristio InnoDB, onda mozes ubaciti foreign keys ...
[ kostas_bgd @ 24.09.2009. 06:51 ] @
Svrha foreign keya (spoljnog ključa) u sistemu za upravljanje bazama podataka jeste obezbeđenje referencijalnog integriteta. Šta to znači? Dakle, pomoću spoljnih ključeva, definišemo relacije između tabela u bazi, odnosno kako su te tabele međusobno povezane. Referencijalni integritet se odnosi na operacije UPDATE i DELETE. On nam omogućava da pri brisanju nekog zapisa iz jedne tabele ne narušimo integritet zapisa u drugoj tabeli. Na primer, imamo dve tabele:

Film (filmid, nazivFilma, reziserid)
Reziser (reziserid, imeRezisera, prezimeRezisera)

Tabela Film je povezana sa tabelom Reziser pomoću spoljnog ključa reziserid. Ako želimo da dodamo film "Jurassic Park" koji je režirao Steven Spielberg, najpre dodajemo režisera u tabelu Režiser:

Code:
INSERT INTO Reziser (reziserid, imeRezisera, prezimeRezisera) VALUES (100, 'Steven', 'Spielberg')


Sada dodajemo novi film u tabelu Film:

Code:
INSERT INTO Film (filmid, nazivFilma, reziserid) VALUES (1, 'Jurassic Park', 100)


Ovde problem nastaje ako želimo da izbrišemo Spielberga iz tabele Reziser. Ukoliko sistem za upravljanje bazom podataka ne podržava spoljni ključ, tada
će brisanje Spielberga uspešno proći. Problem će se ispoljiti u samom programu (ili web aplikaciji) koji koristi bazu. Recimo, pri listanju filmova, u koloni Reziser ćemo umesto Spielbergovog imena dobiti poruku o grešci.

Ukoliko pak sistem za upravljanje bazom podataka podržava spoljne ključeve, moguće mu je zadati na koji način da rešava problem referencijalnog integriteta pri izvršavanju operacije UPDATE i DELETE. To može biti CASCADE (brisanje oba povezana zapisa, u našem primeru će se izbrisati i Spielberg i Jurassic Park), RESTRICT (neće se dozvoliti brisanje Spielberga ukoliko u povezanoj tabeli Film postoji makar jedan film koji je on režirao) i SET NULL (Spielberg će se izbrisati, ali će vrednost atributa reziserid za zapis Jurassic Park biti postavljen na NULL vrednost, umesto nekadašnje vrednosti 100).

Kod MySQL sistema za upravljanje bazom, samo InnoDB engine podržava spoljne ključeve, ostali engine-i to ne podržavaju. Međutim, i u tom slučaju se može rešiti problem referencijalnog integriteta, ali taj problem rešava programer aplikacije, postavljanjem dodatnih uslova za brisanje i ažuriranje zapisa. Naravno, to znači i više posla za programera.

Prednost InnoDB engine-a jeste prisustvo spoljnih ključeva, ali su njegov glavni nedostatak performanse, koje su neuporedivo bolje kod engine-a MyISAM (koji za sada ne podržava spoljne ključeve). Razlika u performansama se neće primetiti kod malih baza podataka, ali kod većih baza, sa mnoštvom tabela i zapisa to može predstavljati veliki problem.