Tavs šīs stundas izaicinājums: Projektēt vairākas saistītas tabulas, izmantojot primārās un ārējās atslēgas.
Datubāze ir tikai tik laba, cik labi tā ir projektēta. Galvenie principi:
id SERIAL).-- Spēlētāji un viņu spēles (1 → daudzi)
CREATE TABLE speletaji (
id SERIAL PRIMARY KEY,
vards TEXT NOT NULL UNIQUE
);
CREATE TABLE speles (
id SERIAL PRIMARY KEY,
speletajs_id INTEGER NOT NULL REFERENCES speletaji(id) ON DELETE CASCADE,
punkti INTEGER NOT NULL,
spelets TIMESTAMP DEFAULT NOW()
);
ON DELETE CASCADE — ja izdzēš spēlētāju, automātiski tiek izdzēstas arī viņa spēles.
Izveido sistēmu spēlētājs → spēles.
DROP TABLE speletaji CASCADE;speletaji ar UNIQUE vārdu.speles ar speletajs_id INTEGER REFERENCES speletaji(id) ON DELETE CASCADE.Pārbaudi, ka FK ierobežojumi strādā.
speletajs_id: INSERT INTO speles (speletajs_id, punkti) VALUES (999, 100);DELETE FROM speletaji WHERE id = 1;SELECT * FROM speles; — vai automātiski izdzēstas viņa spēles?Izveido sarežģītāku struktūru: spēlētāji → komandas (m:n).
CREATE TABLE komandas (id SERIAL PRIMARY KEY, nosaukums TEXT NOT NULL);CREATE TABLE komandu_dalibnieki (speletajs_id INTEGER REFERENCES speletaji(id), komanda_id INTEGER REFERENCES komandas(id), PRIMARY KEY (speletajs_id, komanda_id));Izmēģini CHECK un NOT NULL ierobežojumus.
speles ierobežojumu: ALTER TABLE speles ADD CONSTRAINT pozitivi_punkti CHECK (punkti >= 0);NOT NULL ierobežojumu.CREATE TABLE speletaji (
id SERIAL PRIMARY KEY,
vards TEXT NOT NULL UNIQUE
);
CREATE TABLE speles (
id SERIAL PRIMARY KEY,
speletajs_id INTEGER NOT NULL REFERENCES speletaji(id) ON DELETE CASCADE,
punkti INTEGER NOT NULL CHECK (punkti >= 0),
spelets TIMESTAMP DEFAULT NOW()
);
INSERT INTO speletaji (vards) VALUES ('Anna'), ('Jānis');
INSERT INTO speles (speletajs_id, punkti) VALUES (1, 120), (1, 85), (2, 200);