Přejít na obsah

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:

TabulkaAtributDatový typVýznam
Hryid_hryINTEGERprimární klíč
HrynazevVARCHARnázev hry
Hryrok_vydaniINTEGERrok vydání
Hryid_vyvojareINTEGERcizí 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ě:

hrazanry
Minecraftsurvival, 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.

V tomto kurzu nejsou povoleny komentáře.