ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
MySQL (23) - relace 1:N a N:NCo znamenají zkratky 1:N a N:N? Jak souvisejí se psaním spojení a proč by nestačilo mít jen jeden typ spojení? To všechno se dozvíte v dnešním díle seriálu o MySQL. Zatím jsme v seriálu rozebírali taková spojení, při nichž šlo o dvě
tabulky. Napsal jsem ale rovněž, že principielně lze spojit i více
tabulek. Ačkoli to nepředstavuje žádný syntaktický zádrhel, pro
začátečníky v oblasti databází bývá někdy problém pochopit logiku
takových spojení. Proto se jim dnes budeme trochu věnovat. Spojení 1:NToto spojení jsme vlastně již probrali. Tajemnou zkratkou "1:N" se v
databázovém světě rozumí spojení, kde jeden záznam v "hlavní" tabulce
obsahuje teoreticky libovolný počet odpovídajících záznamů v
"podřízené" tabulce. (Teoreticky libovolný počet zahrnuje rovněž nulu).
Připomeňme také, že k vyjádření takového spojení se používá:
V praxi existuje celá řada situací, na níž lze toto schéma uplatnit.
Pro osvěžení si některá připomeňme:
Celá situace se dá poměrně snadno znázornit graficky. Na obrázku
níže můžete vidět, jak by vyladalo spojení mezi tabulkou faktur a
jejich položek. Kdybychom něco takového chtěli zapsat pomocí SQL, nebude to problém: select * from faktury
join polozky on faktury.id = polozky.faktura;
Spojení N:NCo je špatného na modelu 1:N, že potřebujeme vymyšlet něco dalšího?
Na modelu samotném není špatného nic. Problém spočívá v tom, že pro
reálný svět tento model zkrátka nepostačuje. Vraťme se na chvíli k naší
imaginární databázové aplikaci, která má mapovat provoz v knihovně. Jak
byste zmapovali proces půjčování knih? Je pravda, že jeden čtenář si
může půjčit více knih, ALE zároveň je pravda, že více čtenářů si může
půjčit stejnou knihu (dejme tomu v různém období). Vztah mezi knihami a
čtenáři tedy není 1:N, ale N:N. Realizovat něco takového pomocí dvou tabulek v reálné databázi
většinou nejde. Takový vztah se obyčejně programuje pomocí další, třetí
tabulky, která je spojena s oběma původními tabulkami. S každou
tabulkou má vztah 1:N a celé to dokáže simulovat spojení N:N. Protože
se to asi dá jen těžko představit, posloužím zase malým obrázkem: Je dobré si "prostřední" tabulku nějak smysluplně nazvat, i když to někdy nebude tak úplně jednoduché. My bychom si ji mohli nazvat například "výpůjčky". Z toho je krásně vidět, jak je relace N:N "rozbita" na dvě relace 1:N. Platí totiž:
V praxi to často bývá tak, že "prostřední" tabulka neslouží pouze
jako technický prostředek k realizaci spojení N:N, ale že obsahuje i
nějaké smysluplné informace. Například si dokážu představit, že by
tabulka výpůjček docela dobře mohla obsahovat datum půjčení a datum
vrácení každé publikace. To totiž nepatří logicky ani do tabulky knih,
ani do tabulky čtenářů. Pozn.: Vidíte mimochodem, jak nesmírně je toto řešení pružné? Umožňuje například postihnout situaci, kdy čtenář nevrátí všechny knihy, které má půjčené ve stejném termínu. Protože pro každou kombinaci kniha-čtenář existuje řádek v tabulce výpůjček, lze to pohodlně zapsat. V praxi bychom tedy mohli pomocí výše uvedené průpravy například sestavit seznam právě vypůjčených knih: select knihy.nazev,
ctenari.prijmeni from Poznámky ke spojenímZejména spojení N:N vyžadují určitou představivost ze strany
programátora. Během let, kdy jsem programoval databázové aplikace, jsem
si sestavil několik tipů, které se vám možná také budou hodit:
Související články
Předchozí Celou kategorii (seriál) Další
MySQL (1) - pestrý svět databází
MySQL (2) - Instalujeme databázi MySQL MYSQL (3) Instalujeme MySQL podruhé MySQL (4) - něco terminologie MySQL (5) - tajuplné SQL MySQL (6) - Ukládáme řetězce MySQL (7) - hrátky s čísly MySQL (8) - Ukládání datumů MySQL (9) - Další datové typy MySQL (10) - tvorba databáze. Základy DDL MySQL (11) - vytváříme tabulky MySQL (12) - tipy k tvorbě tabulek MySQL (13) - Vkládáme data MySQL (14) - Upravujeme data MySQL (15) - Odstraňujeme data MySQL (16) - Tipy a triky k manipulaci s daty MySQL (17) - vybíráme data MySQL (18) - Filtrujeme data MySQL (19) - Řadíme data MySQL (20) - spojení více tabulek MySQL (21) - klauzule JOIN MySQL (22) - tipy a triky ke spojování tabulek MySQL (24) - Seskupujeme záznamy MySQL (25) - hrátky se seskupenými záznamy MySQL (26) - Poddotazy MySQL (27) - Složitější dotazy MySQL (28) - Dotazy pro pokročilé MySQL (29) - Vracení nejvyšších záznamů MySQL (30) - průběžné součty MySQL (31) - Indexy MySQL (32) - ještě k indexům MySQL (33) - Příkaz UNION MySQL (34) - větvení kódu a pivotní tabulky MySQL (35) - vestavěné funkce MySQL (36) - Regulární výrazy MySQL (37) - použití fulltextového vyhledávání MySQL (38) - Fulltext a praxe MySQL (39) - typy tabulek v MySQL MySQL (40) - další typy tabulek MySQL (41) - Transakce MySQL (42) - ještě k transakcím MySQL (43) - Uložené procedury MySQL (44) - parametry uložených procedur MySQL (45) - větvení kódu uložených procedur MySQL (46) - Triggery MySQL (47) - Triggery a praxe MySQL (48) - UDF MySQL (49) - pohledy MySQL (50) - Pohledy podruhé MySQL (51) - Metadata MySQL (52) - A co zálohování? MySQL (53) - SELECT INTO OUTFILE MySQL (54) - zálohování MySQL z webu MySQL (55) - zálohování MySQL z pohledu správce MySQL (56) - Obnova zálohovaných dat MySQL (57) - Ach, ta čeština MySQL (58) - čeština v praxi MySQL (59) - české řazení MySQL (60) - řádkový klient MySQL (61) - Oprávnění MySQL (62) - Oprávnění podruhé MySQL (63) - jemné nastavení práv MySQL (64) - nad dotazy čtenářů MySQL (65) - Ladíme server MySQL (66) - Ještě k ladění serveru MySQL - (67) MySQL (68) - Závěr MySQL (69) - Prepared Statements Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |