Projekt – Navrhni vlastní relační databázi
Navrhni vlastní relační databázi na téma, které si sám vybereš.
Můžeš vytvořit například databázi pro:
počítačovou hru,
knihovnu,
filmy a seriály,
hudbu,
sportovní klub,
školu,
autoservis,
e-shop,
restauraci,
hotel,
Minecraft server,
počítačové komponenty,
půjčovnu,
dopravu,
domácí mazlíčky,
nebo úplně jiné vlastní téma.
Cílem není vytvořit obrovskou databázi. Důležitější je, aby byl její návrh logický, správně rozdělený do tabulek a aby mezi tabulkami fungovaly správné vztahy.
1. Popiš, co bude tvoje databáze evidovat
Napiš krátce, k čemu bude databáze sloužit.
Stačí přibližně 3–5 vět.
Například:
Databáze bude evidovat počítačové hry, jejich vývojáře, žánry a hráče.
U hráčů budu evidovat hry, které vlastní. Jedna hra může patřit do více žánrů a jeden žánr může obsahovat více her.
Z popisu by mělo být poznat:
jaké entity v systému existují,
jaká data o nich potřebuješ ukládat,
jak spolu jednotlivé entity souvisejí.
2. Navrhni entity a tabulky
Navrhni minimálně 5 tabulek.
U každé tabulky napiš:
název tabulky,
její význam,
atributy/sloupce,
vhodný datový typ jednotlivých atributů.
Každá tabulka musí mít svůj primární klíč (PRIMARY KEY).
Příklad:
| Tabulka | Atribut | Datový typ | Význam |
|---|---|---|---|
| Hry | id_hry | INTEGER | primární klíč |
| Hry | nazev | VARCHAR | název hry |
| Hry | rok_vydani | INTEGER | rok vydání |
| Hry | id_vyvojare | INTEGER | cizí klíč |
Přemýšlej také nad tím, zda může být některá hodnota NULL, nebo zda musí být vždy vyplněna.
3. Vytvoř vztahy mezi tabulkami
V databázi musí být několik tabulek vzájemně propojeno.
Použij minimálně:
jednu relaci 1
jednu relaci M
Relaci M musíš převést pomocí spojovací tabulky.
Pokud to tvé téma umožňuje, můžeš použít také vztah:
1:1
Příklad
Vývojář může vytvořit více her:
Vyvojar 1 : N Hra
Jedna hra může mít více žánrů a jeden žánr může obsahovat více her:
Hra M : N Zanr
Proto potřebujeme spojovací tabulku například:
HraZanr
Každý vztah musí dávat v reálném světě smysl.
4. Urči primární a cizí klíče
V ER diagramu jasně označ:
PK – PRIMARY KEY
primární klíč jednoznačně identifikující záznam.
Například:
id_hry
FK – FOREIGN KEY
cizí klíč odkazující na záznam v jiné tabulce.
Například:
id_vyvojare
odkazuje na:
Vyvojari.id_vyvojare
U každého cizího klíče musí být jasné:
odkud → kam vede.
5. Nakresli ER diagram
Vytvoř ERD – Entity Relationship Diagram své databáze.
Použít můžeš například drawDB.
Diagram musí obsahovat:
všechny tabulky,
atributy,
datové typy,
primární klíče,
cizí klíče,
vztahy mezi tabulkami.
Z diagramu musí být možné pochopit strukturu databáze i bez dalšího vysvětlování.
6. Zkontroluj normalizaci databáze
Prohlédni si svůj návrh a zkontroluj, zda odpovídá principům:
1NF – první normální forma
V jedné buňce nesmí být několik různých hodnot.
Špatně:
| hra | zanry |
|---|---|
| Minecraft | survival, sandbox, adventure |
Lépe je žánry uložit samostatně a vytvořit mezi nimi vztah.
2NF – druhá normální forma
Údaje musí patřit k celému klíči tabulky.
Zamysli se hlavně nad spojovacími tabulkami a nad tím, zda do nich neukládáš informace, které patří jinam.
3NF – třetí normální forma
Do tabulky neukládej zbytečně údaje, které jsou závislé na jiném údaji a měly by být v samostatné tabulce.
Například není vhodné mít:
Hra
id_hry
nazev
id_vyvojare
jmeno_vyvojare
stat_vyvojare
pokud již existuje tabulka:
Vyvojari
Údaje o vývojáři patří do tabulky Vyvojari.
Ke svému návrhu napiš
1. Proč je databáze v 1NF?
2. Proč je databáze v 2NF?
3. Proč je databáze v 3NF?
Stačí stručné vysvětlení vlastními slovy.
7. Referenční integrita
U každého důležitého cizího klíče se zamysli nad tím, co se má stát, když odstraníme záznam, na který jiné tabulky odkazují.
Vyber vhodné chování.
Například:
RESTRICT / NO ACTION
Záznam nepůjde smazat, pokud se používá někde jinde.
CASCADE
Při odstranění hlavního záznamu se odstraní také související záznamy.
SET NULL
Odkaz se při odstranění změní na NULL.
U minimálně dvou vztahů napiš, jaké chování bys použil a proč.
Například:
Pokud odstraním hru, odstraním také její záznamy ze spojovací tabulky HraZanr.
Použil bych proto ON DELETE CASCADE.
Ale:
Vývojáře nechci odstranit, pokud jsou k němu stále přiřazené hry.
Použil bych RESTRICT.
Nejde pouze o napsání příkazu. Musíš vysvětlit, proč je toto chování pro tvoji databázi logické.
8. Vytvoř databázi v PostgreSQL / Neon
Podle svého návrhu vytvoř skutečné tabulky.
Použij SQL příkazy, které jsme probírali.
Například:
CREATE TABLE vyvojari (
id_vyvojare SERIAL PRIMARY KEY,
nazev VARCHAR(100) NOT NULL,
stat VARCHAR(50)
);
a tabulku s cizím klíčem:
CREATE TABLE hry (
id_hry SERIAL PRIMARY KEY,
nazev VARCHAR(150) NOT NULL,
rok_vydani INTEGER,
id_vyvojare INTEGER,
FOREIGN KEY (id_vyvojare)
REFERENCES vyvojari(id_vyvojare)
);
Nevytvářej pouze tabulky. Nastav také skutečné vazby pomocí FOREIGN KEY.
9. Naplň databázi testovacími daty
Do databáze vlož vlastní testovací data.
Použij:
INSERT INTO ...
Hlavní tabulky by měly obsahovat přibližně 3–5 záznamů.
Data nemusí být skutečná, ale musí dávat smysl.
10. Dokaž, že databáze funguje
Pomocí SQL proveď několik dotazů.
Minimálně:
A. Zobraz obsah jedné tabulky
SELECT * FROM ...
B. Vyber pouze některé sloupce
SELECT nazev, rok_vydani FROM hry;
C. Použij podmínku
SELECT * FROM hry WHERE rok_vydani > 2020;
D. Vytvoř alespoň jeden dotaz pracující s propojenými tabulkami
Výsledek musí využívat data alespoň ze dvou souvisejících tabulek.
11. Otestuj referenční integritu
Zkus provést operaci, která by měla porušit vztahy v databázi.
Například:
vložit neexistující id_vyvojare,
odstranit záznam, na který odkazuje jiná tabulka,
odstranit záznam s nastaveným ON DELETE CASCADE.
Popiš:
Co jsem zkusil:
Co se stalo:
Proč databáze operaci dovolila / nedovolila:
Tím ukážeš, že chápeš, co znamená referenční integrita, a nejen že umíš vytvořit cizí klíč.
Co musí výsledná databáze obsahovat
Minimální požadavky:
vlastní téma,
minimálně 5 tabulek,
vhodné datové typy,
PRIMARY KEY v každé tabulce,
několik FOREIGN KEY,
alespoň jednu relaci 1,
alespoň jednu relaci M,
spojovací tabulku pro M,
databázi odpovídající principům 1NF, 2NF a 3NF,
nastavenou referenční integritu,
zdůvodnění alespoň dvou způsobů chování při mazání,
ER diagram,
SQL vytvoření tabulek,
testovací data,
několik SELECT dotazů,
praktický test referenční integrity.
Co odevzdáš
1. ER diagram
Obrázek nebo PDF vytvořeného databázového modelu.
2. SQL soubor
Soubor například:
moje_databaze.sql
Obsahující:
CREATE TABLE
klíče a vztahy
INSERT INTO
testovací SELECT
3. Krátký popis
Napiš:
Téma databáze:
K čemu databáze slouží:
Použité entity:
Příklad vztahu 1:N:
Příklad vztahu M:N:
Jak je řešena M:N:
Jak jsem řešil normalizaci:
Příklad referenční integrity:
Důležitá otázka
Při práci si stále pokládej otázku:
Patří tento údaj opravdu do této tabulky, nebo by měl být uložen někde jinde?
Správně navržená databáze není ta, která má nejvíce tabulek.
Správně navržená databáze je ta, ve které mají data jasnou strukturu, neopakují se zbytečně a vztahy mezi nimi odpovídají skutečnosti.
Bonus ⭐
Pokud máš základní část hotovou, můžeš přidat:
další relaci M,
relaci 1:1,
více propojených tabulek,
složitější SELECT,
JOIN,
ORDER BY,
COUNT,
další omezení pomocí NOT NULL, UNIQUE nebo CHECK.
Bonus není náhradou za správně vytvořený základ databáze.