Lekce 2.1

Relační databáze a datový model

K čemu slouží relační databáze, jak se čte datový model a jeho vazby, co je primární a cizí klíč a k čemu je index.

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_at

Cizí 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), points

Je 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, price

Jednomu řá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 e-shopu. Tabulka customers má sloupce id (PK), name, email a city. Tabulka orders má id (PK), customer_id (FK) a created_at. Tabulka order_items má order_id (PK, FK), product_id (PK, FK), quantity a price. Tabulka products má id (PK), name a price. Čáry vedou z customers do orders, z orders do order_items a z products do order_items, vždy s 1 u tabulky s primárním klíčem a N u tabulky s cizím klíčem.

Datový model se čte ve třech krocích:

  1. U každé tabulky řekneme, co znamená jeden její řádek. Jeden řádek order_items je jeden produkt v jedné objednávce.
  2. Najdeme primární a cizí klíče a u cizích klíčů, kam ukazují.
  3. 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.

Bonus

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“.