#60 Swarley
Jak už psala smiesek, M : N je vztah mezi entitami v databázi. Takový vztah se většinou v databázi velmi špatně udržuje, vede k redundanci a někdy k porušování normálních forem, proto se M : N vztahy dekomponuji na 1: N, N : 1 uvedením slabého entitního typu.
Snad již víš, že v entity v databázi mohou obsahovat cizí klíče. Například budeš mít entitu syn a entitu matka. syn může mít jen jednu matku, takže entita syn bude mít atribut třeba matka, který bude cizí klíč odkazující se na primární klíč entity matka. Zároveň bys tímto vyřešil i problém, že matka může mít více synů, protože aby sis zobrazil všechny syny například matky, jejíž primární klíč je ID s číslem 4, stačí použít velmi jednoduchý SQL dotaz
SELECT * FROM syn WHERE matka = 4;
Jiný případ je, že budeš mít třeba entity hracka a dite, hračku přitom může v průběhu času vlastnit více dětí (nebo dokonce více děti najednou) a dítě může mít více hraček. Dejme tomu, že si namodeluješ databázi následujícím způsobem:
CREATE TABLE dite
(
idDite SERIAL PRIMARY KEY,
jmeno TEXT NOT NULL,
prijmeni TEXT NOT NULL,
hracka INTEGER REFERENCES hracka(idHracka)
);
CREATE TABLE hracka
(
idHracka SERIAL PRIMARY KEY,
nazev TEXT NOT NULL,
cena DECIMAL NOT NULL,
dite INTEGER REFERENCES dite(idDite)
);
tak ti vznikne hned několik problémů.
1) Tabulky prostě nepůjdou vytvořit, protože když vytváříš tabulku dite a odkazuješ se na tabulku hracka, tak tabulka hracka ještě neexistuje.
2) Jak si můžeš všimnou, i kdyby tabulky vytvořit šli, tak v atributech hracka nebo dite může být vždy uložená jenom jedna hodnota, takže můžeš evidovat pouze jedno dítě jako vlastníka hračky a dítě může mít pouze jednu hračku. Což jsme ale nechtěli. Je tedy třeba tabulky upravit, uvést zmíněný slabý entitní typ a cizí klíče přesunout do něj.
CREATE TABLE dite
(
idDite SERIAL PRIMARY KEY,
jmeno TEXT NOT NULL,
prijmeni TEXT NOT NULL,
);
CREATE TABLE hracka
(
idHracka SERIAL PRIMARY KEY,
nazev TEXT NOT NULL,
cena DECIMAL NOT NULL,
);
CREATE TABLE vlastnictvi
(
dite INTEGER REFERENCES dite(idDite)
hracka INTEGER REFERENCES hracka(idHracka)
PRIMARY KEY (dite, hracka)
);
Co by tě mohlo zajímat: Normalizace databáze, Relační model