EDIT: Pretekao me Misko :)
Razlozi da kombinacija imena, prezimena i datuma rođenja nebude ključ:
1. Ključni atributi moraju da imaju vrednost (NOT NULL). Da li si siguran da znaš datume rođenja svih glumaca? Ja ne znam.
2. Ključni atributi moraju jedinstveno da identifikuju red u tabeli. Da li si siguran da ne postoje dva glumca sa istim imenom, prezimenom i datumom rođenja? Ja nisam. Marfijev zakon vreba :)
3. Ključni atributi bi trebali da imaju izvesnu meru stabilnosti. Imena to nemaju.
Ne mogu da se setim kada sam (i da li sam uopšte) upotrebio kompozitni ključ za
jak entitet.
-----------------------------
Iz predhodnog posta zaključujem da ti nije jasan koncept primarnog ključa u SQL-u. Pokušaću da ga objasnim.
Predpostavimo da imamo tabelu:
Code:
CREATE TABLE glumci (
sifra_glumca INTEGER NOT NULL CHECK (sifra_glumca > 0),
ime_glumca VARCHAR(15) NOT NULL,
prezime_glumca VARCHAR(30) NOT NULL,
datum_rodjenja_glumca DATE NOT NULL
);
Predpostavimo da imamo dva ključa:
1. (sifra_glumca),
2. (ime_glumca, prezime_glumca, datum_rodjenja_glumca).
Jedan od ova dva ključa možemo (ali nemoramo) da proglasimo primarnim ključem.
Proglašenjem jednog od ključeva za primarni ključ se samo kaže SQL sistemu: 'To ti je DEFAULT ključ za tu tabelu.' Ovo olakšava kasnije referenciranje jer sistem podrazmeva po kom ključu hoćemo da izvršimo referenciranje, pa referenciranje po primarnom ključu ne moramo eksplicitno navoditi.
Dodacemo jos jednu tabelu:
Code:
CREATE TABLE glumacke_ekipe (
sifra_filma INTEGER NOT NULL,
sifra_glumca INTEGER NOT NULL,
CONSTRAINT pk_gle PRIMARY KEY (sifra_filma, sifra_glumca)
);
I zelim da postavimo refernecijalni integritet koji ce spreciti da se u tabeli glumacke_ekipe pojavi glumac kojeg nemamo u tabeli glumaca.
Sada imamo dva slučaja.
Prvi slučaj
Recimo da proglasimo ključ (ime_glumca, prezime_glumca, datum_rodjenja_glumca) za primarni ključ.
Code:
ALTER TABLE glumci
ADD CONSTRAINT pk_glu
PRIMARY KEY (ime_glumca, prezime_glumca, datum_rodjenja_glumca);
CREATE UNIQUE INDEX ak_glu_s ON glumci(sifra_glumca);
Tada se spomenuti referencijalni integritet
mora napisati:
Code:
-- obavezno navodjenje referencirane kolone
ALTER TABLE glumacke_ekipe
ADD CONSTRAINT fk_gle_glu
FOREIGN KEY (sifra_glumca)
REFERENCES glumci (sifra_glumca);
Drugi slučaj
Recimo da proglasimo ključ (sifra_glumca) za primarni ključ.
Code:
ALTER TABLE glumci
ADD CONSTRAINT pk_glu
PRIMARY KEY (sifra_glumca);
CREATE UNIQUE INDEX ak_glu_ipd ON glumci(ime_glumca, prezime_glumca, datum_rodjenja_glumca);
Tada se spomenuti referencijalni integritet
može napisati:
Code:
-- bez navodjenja referencirane kolone
ALTER TABLE glumacke_ekipe
ADD CONSTRAINT fk_gle_glu
FOREIGN KEY (sifra_glumca)
REFERENCES glumci;
A
može se napisati i kao:
Code:
-- sa navodjenjem referencirane kolone
ALTER TABLE glumacke_ekipe
ADD CONSTRAINT fk_gle_glu
FOREIGN KEY (sifra_glumca)
REFERENCES glumci (sifra_glumca);
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming." - Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo