If you're seeing this message, it means we're having trouble loading external resources on our website.

Pokud používáš webový filtr, ujisti se, že domény: *.kastatic.org and *.kasandbox.org jsou vyloučeny z filtrování.

Hlavní obsah

Rozdělení dat do souvisejících tabulek

Zatím jsme pracovali vždy pouze s jednou tabulkou, ze které jsme dostávali zajímavá data. Ale ve skutečnosti budete většinu času pracovat s daty rozesetými v několika tabulkách, které vždy spolu nějakým způsobem souvisí.
Tak třeba mějme tabulku pro zaznamenávání výsledků testů studentů, ve které máme k dispozici i emaily těchto studentů pro případ, že bychom potřebovali napsat jejich rodičům, když by se nějaký student začal zhoršovat:
student_jmenostudent_emailtestbody
Petr Králíkpetr@kralik.czVýživa95
Alenka Udivenáalenka@rise-divu.czVýživa92
Petr Králíkpetr@kralik.czChemie85
Alenka Udivenáalenka@rise-divu.czChemie95
Také máme tabulku pro zaznamenání, jaké knihy naši studenti čtou:
student_jmenokniha_nazevkniha_autor
Petr KrálíkFlopsík a Chundelatý ocásekBeatrix Potter
Petr KrálíkŽvahlavLewis Carroll
Alenka UdivenáLovení SnárkaLewis Carroll
Alenka UdivenáŽvahlavLewis Carroll
Můžeme také mít tabulku s detailními informacemi o našich studentech:
idstudent_jmenostudent_prijmenistudent_emailtelefonnarozen
1PetrKrálíkpetr@kralik.cz555-66662001-05-10
2AlenkaUdivenáalenka@rise-divu.rd555-44442001-04-02
Co si o těchto tabulkách myslíš? Potřebují nějak pozměnit?
Musíme si uvědomit jednu věc - tyto tabulky obsahují vzájemně související data. Každá tabulka obsahuje data týkající se konkrétního studenta, a mnoho tabulek obsahuje stejná data. Pokud se stejná data objevují ve více tabulkách, může to mít zajímavé důsledky.
Tak například, co když si student změnil email? Kterou tabulku tak musíme upravit?
Potřebujeme změnit tabulku s detailními informacemi o studentovi, ale jelikož jsme tento údaj uvedli i v tabulce se známkami, musíme najít každý řádek, který se týká tohoto studenta, a email v něm upravit.
Často je tak výhodnější mít konkrétní sloupec s určitými daty uložen pouze na jednom místě, takže poté se musí upravovat data na méně místech a také je menší riziko, že budeme mít neshodující se data na různých místech. Pokud to tak uděláme, musíme znát způsob, jak spojovat vzájemně odpovídající si data napříč tabulkami. K tomu se dostaneme později.
Rozhodli jsme se tedy odstranit email z tabulky se známkami, protože jsme si uvědomili, že je zbytečné mít emaily uvedeny i zde, když je máme v tabulce s detailními informacemi o studentech. Vypadá to tedy takto:
student_jmenotestbody
Petr KrálíkVýživa95
Alenka UdivenáVýživa92
Petr KrálíkChemie85
Alenka UdivenáChemie95
Jak ale zjistíme email každého studenta? Můžeme najít řádek v tabulce s detailními informacemi, který nese to samé jméno studenta. Co když ale budou mít dva studenti stejné jméno? (Věděli jste, že na Bali má každý člověk na výběr pouze ze 4 jmen?). Při vyhledávání studentů se tak nemůžeme spoléhat na jméno. Vlastně nikdy bychom neměli spoléhat na jména, když chceme určit něco jednoznačně.
Takže nejlepší možnost je odstranit sloupec student_jmeno a nahradit ho sloupcem student_id, jelikož to je zaručeně jedinečný identifikátor:
student_idtestbody
1Výživa95
2Výživa92
1Chemie85
2Chemie95
Tu samou změnu provedeme i pro naši tabulku se čtenými knihami, kdy opět použijeme sloupec student_id místo sloupce student_jmeno:
student_idkniha_nazevkniha_autor
1Flopsík a Chundelatý ocásekBeatrix Potter
1ŽvahlavLewis Carroll
2Lovení SnárkaLewis Carroll
2ŽvahlavLewis Carroll
Můžeme si všimnout, že se nám kniha Lewise Carolla Žvahlav opakuje dvakrát. To je další důvod pro to, abychom tvořili související tabulky. Jinak bychom změnu informace o této knize museli provádět na více místech.
Můžeme mít tabulku pouze pro knihy:
idkniha_nazevkniha_autor
1Flopsík a Chundelatý ocásekBeatrix Potter
2ŽvahlavLewis Carroll
3Lovení SnárkaLewis Carroll
Potom bude naše tabulka student_books, která zaznamenává právě čtené knihy, vypadat takto:
student_idbook_id
11
12
23
22
Jistě, tato tabulka není tak snadno čitelná, jako když obsahovala všechny údaje v každém řádku. Tyto tabulky ale nejsou většinou určeny pro lidi - spíše mají co nejlépe ukládat data, být jednoduše udržovatelné a nebýt náchylné k chybám. Ve spoustě případech je tak nejlepší data rozdělit do několika souvisejících tabulek, čímž vzniká méně zbytečných dat, a také musíme tyto data upravovat na méně místech.
Je důležité vědět, jak používat SQL pro dotazování dat rozdělených mezi více souvisejících tabulek, a musíme umět tato data zpětně zobrazit, když je potřebujeme. A k tomuhle právě potřebujeme příkazy JOIN, které si ukážeme příště.