PostgreSQL nameće integritet podataka kroz ograničenja — pravila nad podatcima tablica. Osim standardnih (, , , , , ), Postgres nudi moćne opcije poput ograničenja i fleksibilnih izraza.
PostgreSQL nameće integritet podataka kroz ograničenja — pravila nad podatcima tablica. Osim standardnih (, , , , , ), Postgres nudi moćne opcije poput ograničenja i fleksibilnih izraza.
PRIMARY KEYFOREIGN KEYUNIQUENOT NULLCHECKDEFAULTCHECKCREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- unique identifier
room_id INT NOT NULL REFERENCES rooms(id), -- foreign key (referential integrity)
email VARCHAR(255) UNIQUE NOT NULL, -- unique + required
guests INT CHECK (guests > 0 AND guests <= 10), -- value constraint
status TEXT DEFAULT 'pending' -- default value
);
PRIMARY KEY → unique row identifier
FOREIGN KEY → references another table (referential integrity, with ON DELETE options)
UNIQUE → no duplicate values
NOT NULL → must have a value
CHECK → value must satisfy a condition
DEFAULT → default value when not provided
CHECK (price > 0)
CHECK (end_date > start_date) -- logical consistency between columns
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- regex validation
Postgres CHECK ograničenja mogu primjenjivati bogata poslovna pravila, uključujući uvjete između stupaca i regex obrasce.
-- prevent OVERLAPPING bookings for the same room (impossible with UNIQUE alone!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- a time range
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- no two rows where room_id is
); -- equal AND time ranges OVERLAP
EXCLUDE ograničenja (značajka specifična za Postgres) sprječavaju redove koji su u sukobu prema prilagođenom operatoru — najpoznatije, sprječavanje preklapajućih vremenskih raspona (dvostruke rezervacije), što UNIQUE ograničenje ne može učiniti.
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
Ograničenja su esencijalna za integritet podataka — nameću pravila podataka na razini baze (zadnja linija obrane, uvijek nametana bez obzira na kod aplikacije), pa je razumijevanje podrške PostgreSQL-a za ograničenja važno za dizajniranje robusnih baza podataka.
Znanje standardnih ograničenja (PRIMARY KEY, FOREIGN KEY s referencijalnim integritetom, UNIQUE, NOT NULL, CHECK, DEFAULT) i što svako od njih nameće je temeljno za dizajn sheme, pružajući garancije na razini baze (jedinstvitost, valjani referenti, obavezne vrijednosti, valjani podatci) koja štite od grešaka, race conditions i neusklađenih podataka na načine koje sama koda aplikacije ne može.
Postgres-eva CHECK ograničenja su posebno sposobna, nameću bogata poslovna pravila uključujući uvjete između stupaca (logička konzistentnost kao end_date > start_date) i čak regex obrasce — omogućujući vam kodiranje pravila domene direktno u shemi.
Zasebno vrijedna je Postgres-specifična EXCLUDE ograničenja, koja sprječavaju konfliktne redove prema prilagođenim operatorima — najznačajnije sprječavanje preklapajućih vremenskih raspona (dvostruke rezervacije za sobu/resurs), moćna mogućnost koju standardno UNIQUE ograničenje ne može pružiti i koja elegantno rješava čest problem iz stvarnog svijeta (zakazivanje, rezervacije) na razini baze podataka.
Razumijevanje ograničenja — standardnih za integritet, Postgresovih fleksibilnih CHECK izraza i moćnog EXCLUDE-a za prevenciju sukoba — važno je za dizajniranje baza podataka koje automatski namjeću ispravnost.
Budući da je integritet podataka kritičan i ograničenja pružaju garancije koje kod aplikacije ne može, te budući da Postgres nudi moćne opcije (bogati CHECK, EXCLUDE za preklapanja) izvan osnova, razumijevanje podrške PostgreSQL-a za ograničenja je vrijedna, praktično relevantna znanja za gradnju robusnih baza podataka, pri čemu je EXCLUDE ograničenja posebno distinktivna, korisna Postgres mogućnost vrijedna znanja za sustave zakazivanja/rezervacija.