Vazby a datový model
Cizí klíč spojuje dvě tabulky. Podle toho, kolik řádků na každé straně se může spojit, rozlišujeme tři druhy vazeb. Odborně se tomu říká kardinalita vazby.
Vazba 1:N
Jeden zákazník má mnoho objednávek, každá objednávka patří právě jednomu zákazníkovi. Taková vazba se jmenuje 1:N (jedna k mnoha) a v databázích je ze všech nejčastější.
customers: id (PK), name, email, city
orders: id (PK), customer_id (FK → customers.id), created_atCizí klíč leží vždycky na straně „mnoha“. Opačně to nejde: zákazník by potřeboval sloupec na každou svou objednávku, a do jedné buňky patří jen jedna hodnota.
Vazba 1:1
Každý řádek jedné tabulky má nejvýš jeden protějšek ve druhé. Zákazník může mít jednu věrnostní kartu a karta patří jednomu zákazníkovi:
loyalty_cards: id (PK), customer_id (FK → customers.id, UNIQUE), pointsJe to cizí klíč jako u vazby 1:N, jen s podmínkou UNIQUE: stejný zákazník se v tabulce nesmí objevit dvakrát. Vazba 1:1 je vzácná, protože data by se často dala dát rovnou do jedné tabulky. Vyplatí se, když se část údajů používá jen zřídka nebo je citlivá a má k ní mít přístup méně lidí.
Vazba M:N
Objednávka obsahuje víc produktů a stejný produkt se objeví ve spoustě objednávek. Kam teď dáme cizí klíč?
orders: id (PK), customer_id (FK → customers.id), created_at, ????Sloupec product_id v objednávce by unesl jen jeden produkt. Sloupec order_id v produktu by zase znamenal, že se produkt dá koupit jen jednou. Ani jedna tabulka to sama neunese, a tak přidáme třetí:
order_items: order_id (FK → orders.id), product_id (FK → products.id), quantity, priceJednomu řádku order_items se říká položka objednávky: jeden produkt v jedné objednávce. Tabulka, která spojuje dvě jiné, se jmenuje spojovací (junction table) a vazba M:N se v databázi vždycky rozloží na dvě vazby 1:N.
Primárním klíčem spojovací tabulky bývá dvojice order_id a product_id, protože stejný produkt nemá být v jedné objednávce dvakrát. Klíči z více sloupců se říká složený.
Spojovací tabulka navíc nese vlastní data. Počet kusů patří právě k dvojici objednávka a produkt. A proč je tu cena, když ji má i tabulka products? Cena produktu se časem mění, ale objednávka si musí pamatovat tu, za kterou zákazník skutečně nakoupil.
Datový model
Všechny tabulky aplikace a vazby mezi nimi dohromady tvoří datový model. Kreslí se jako diagram:
Datový model se čte ve třech krocích:
- U každé tabulky řekneme, co znamená jeden její řádek. Jeden řádek
order_itemsje jeden produkt v jedné objednávce. - Najdeme primární a cizí klíče a u cizích klíčů, kam ukazují.
- Každou čáru přečteme jako větu oběma směry: jeden zákazník má mnoho objednávek, každá objednávka patří právě jednomu zákazníkovi.
Nad databází e-shopu se stejnými tabulkami budeme v další lekci psát dotazy.
Nástroje na kreslení databází, třeba dbdiagram.io nebo draw.io, místo 1 a N často kreslí na konec čáry „vraní nožku“ (crow’s foot). Zjistěte, jak se v ní značí „právě jeden“, „nejvýš jeden“ a „žádný nebo víc“.