Ispravan naziv teme bi bio "SQL baze bez referencijalnih integriteta?" :)
Ne postoji valjano opravdanje da se ne koriste referencijalni integriteti (RI u nastavku)!
Praksa nekorišćenja RI je puko nasleđe iz vremena kada ih sistemi za upravljanje bazama podataka nisu podržavali. Veliki Oracle je tek od verzije 7 uveo podršku za RI. Popularni MySQL se muči sa RI - neki storage engini ih podržavaju, a neki ne.
Prvobitni razlog da se ne koriste RI je iz čisto tehničkih nedostataka sistema za upravljanje bazama podataka.
Zamislimo osobu koja je počela da koristi Oracle u verziji 4, 5, 6 nekada krajem osamdesetih godina. Ta osoba i nije mogla da koristi RI (fusnota 1) jer oni jednostavno nisu bili podržani. Ta osoba je RI simulirala kroz aplikaciju za pristup podacima. Aplikacija nije bila savršena i pravila je propuste u forsiranju integriteta podataka. Osoba iz priče je krpila aplikaciju i početkom devedesetih je aplikacija napokon radila savršeno! Više se nisu pojavljivale nelogičnosti u podacima.
Onda je Oracle izdao verziju 7 svog sistema za upravljanje bazama podataka. Ta verzija je napokon uvela podršku za RI putem REFERENCES ... ON DELETE ... ON CASCADE. Našoj osobi to više ništa neznači i ona razmišlja: "Baš me briga za te RI koje mi nudi Oracle, pa ja sam to već rešio prošle godine! Uložio sam toliko truda da sve doteram na svoje mesto, a sad bih ponovo trebao da se mučim da bih počeo da koristim te RI." I naša osoba nastavlja da ne koristi RI.
Prolaze godine, a naša osoba pravi nove i nove aplikacije ne osnovu aplikacije koja je nastala krajem osamdesetih godina. Koristi se copy-paste metoda programiranja, i nove aplikacije se štancaju velikom brzinom.
Početkom dvehiljaditih naša osoba prelazi na Windows platformu i na neki od alata za pravljenje Win aplikacija. Tu se naša osoba pomučila da stari kod prebaci na novi alat. "Stari kod mi je super radio, i pomučio sam se da ga prebacim na novi alat. Nemam sad vremena da čistim kod od nepotrebnih stvari, a pošto sam kopirao i logiku forsiranja integriteta podataka, sve će nastaviti da radi u najboljem redu. Nemam sad vremena da se posvetim tim RI."
Danas osoba iz priče ima dvadeset godina iskustva u pravljenju database aplikacija i drži časove programiranja novajlijama. Da li ta osoba može da ih nauči šta su to RI? Naravno da nemože. Ta osoba će reći: "Meni to nije trebalo dvadeset godina, verujte mi neće mi trebati ni narednih 20 godina, a isto tako neće trebati ni vama!"
Treba primetiti da je naša osoba svih 20 godina ipak koristila RI, ali ih je sama implementirala i forsirala kroz aplikaciju.
1992. godine je Java bila u povoju, PHP i .NET nisu postojali, a Oracle je izdao verziju 7 svog sistema za upravljanje bazama podataka. Tada je počela podrška za REFERENCES referencijalne integritete.
Od tada su se pojavile nove platforme, nove tehnologije i novi alati, a Oracle i dalje u verziji 11 podržava referencijalne integritete sa nepromenjenom osnovom.
Oni koji danas počinju da uče programiranje baza podataka nemaju tolika tehnička ograničenja i nemaju razlog da ne koriste moderne alate u svoj njihovoj snazi. A snaga baza podatak između ostalog i leži u CONSTRAINT klauzulama, bilo da su one NOT NULL, CHECK, UNIQE, ili kao u ovom slučaju REFERENCES.
Kreiranje referencijalnog integriteta između dve tabele u SQL bazi traje pola minuta, kao i njegovo uklanjanje. Kreiranje aplikacije koja simulira refeerencijalni integritet između dve tabele SQL baze traje koliko? Neznam, jer još od klipera nisam pisao takav kod, ali predpostavljam da je barem 20 puta sporije. Kreiranje RI između 100 tabela u bazi traje sat vremena, a isto to kroz pravljenje aplikacije traje 4 radna dana, i to veoma dosadna 4 dana.
Nesmete dozvoliti da vas loša knjiga, loš članak na internetu ili loš profesor spreče u korišćenju bogatstva alata. Moj glas ide za upotrebu RI, jer je to manje podložno greškama, brže i prirodnije. Što manje koda imate, manja je mogućnost greške.
Chachka
Fusnota 1: RI su mogli da se simuliraju upotrebom trigera. ERWin ima opciju da referencijalne integritete prevede u SQL ili upotrebom ON DELETE - ON UPDATE ili upotrebom trigera. Čak su i neki noviji alati od ERWina zadržali tu opciju.
"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