Relační databáze

SQL databáze

SSŠVT


Relační databáze

Úvod

Relační databáze je databáze, ve které její základní stavební prvky (tabulky) mají mezi sebou vztahy, tzv. relace.

Typickým případem relace je relace one-to-many (např. hlavička faktury - položky faktury).

Tabulky mají řádky a sloupce. Jednotkou dat je jeden řádek, který se dále dělí na jednotlivé údaje (pole), kterým se nepřesně říká sloupce.

Každý řádek tabulky je jednoznačně určen tzv. primárním klíčem. To je hodnota uložená v jednom ze sloupců tablulky. Hodnota primárního klíče musí být v každém řádku unikátní, aby bylo možné jednotlivé řádky od sebe rozeznat.

Pokud mezi dvěma tabulkami existuje relace one-to-many (případně zrcadlově many-to-one), musí být na straně many sloupec, který obsahuje hodnoty korespondující s hodnotami v (typicky) sloupci s primárním klíčem na straně one. Sloupci na straně many říkáme cizí klíč.


Příklad

Definice tabulek

Ukažme si tedy relaci one-to-many na jednoduchém příkladu faktury a jejích položek.

Faktura (Invoice) bude mít třeba tyto vlastnosti (sloupce):

Invoice
Vlastnost Typ dat Popis
ID celé číslo Primární klíč (jednoznačná identifikace)
InvoiceNo text Číslo faktury
CustomerName text Název zákazníka
IssueDate datum Datum vydání faktury
DueDate datum Datum splatnosti
TaxableEventDate datum Datum uskutečnění zdanitelného plnění
TotalPrice desetinné číslo Celková částka

Položka faktury (InvoiceItem) bude mít následující strukturu:

InvoiceItem
Vlastnost Typ dat Popis
ID celé číslo Primární klíč (jednoznačná identifikace)
InvoiceID celé číslo Cizí klíč do tabulky Invoice (ke které faktuře tato položka náleží)
ItemOrdinal celé číslo Pořadové číslo položky na faktuře
Description text Popis položky
Amount desetinné číslo Fakturované množství u této položky
UnitPrice desetinné číslo Jednotková cena
Unit text Jednotka
ItemPrice desetinné číslo Cena za tuto položku faktury

Data

Nyní tedy uvedeme několik řádků, které by mohly být obsahem výše zmíněných tabulek Invoice a InvoiceItem.

Invoice
IDInvoiceNoCustomerNameIssueDateDueDateTaxableEventDateTotalPrice
1001-2022Řezáč & Řezáč, Pelhřimov2022-01-102022-01-242022-01-0111887.80
2002-2022Nováček, s.r.o.2022-01-122022-01-262022-01-013657.20
3003-2022Nový eshop na kraji lesa2022-01-152022-01-292022-01-0228399.60
4004-2022Nováček, s.r.o.2022-01-152022-01-292022-01-13618.80
5005-2022Kolkovna2022-02-032022-02-172022-02-02366.60
6006-2022Škoda Auto a.s.2022-02-052022-02-192022-02-012187.64
7007-2022Střízlík, Střízlíková a Střízlata, Pelhřimov2022-02-072022-02-212022-02-052083.65
8008-2022OSRAM, s.r.o.2022-02-202022-03-062022-02-152110.10
9009-2022Kolkovna2022-02-202022-03-062022-02-188799.40

InvoiceItem
IDInvoiceIDItemOrdinalDescriptionAmountUnitPriceUnitItemPrice
111Plastická hmota10.5100.00kg1050.00
212Lepidlo vteřinové3.012.60ks37.80
313Barvy časuodolné45.0240.00ks10800.00
421Vařečka kuchyňská2.032.20ks64.40
522Sada příborů 6x1.02500.00ks2500.00
623Hrnec "Papinův"1.0850.00ks850.00
724Naběračky3.065.30ks195.90
825Mělký pekáč1.046.90ks46.90
931Stůl1.018000.00ks18000.00
1032Kancelářská židle4.02599.90ks10399.60
1141Lžičky čajové10.037.00ks370.00
1242Talíře ⌀ 25 cm6.027.80ks166.80
1343Misky malé4.015.00ks60.00
1444Palička na maso1.022.00ks22.00
1551Popelníky10.016.70ks167.00
1652Pivní tácky40.04.99ks199.60
1761Plastový díl k palubní desce1.0355.00ks355.00
1862Násada na řadicí páku3.0610.88ks1832.64
1971Nit režná10.560.00m630.00
2072Nit modrá6.35110.00m698.50
2173Nit karmínová6.35105.00m666.75
2274Náprstek4.022.10ks88.40
2381Kovové šroubení2.05.15ks10.30

Relace

Na datech z obou tabulek, Invoice a InvoiceItem, je barevným rozlišením pozadí zvýrazněno to, které řádky z tabulky InvoiceItem patří ke kterým řádkům z tabulky Invoice.

Vidíme tedy např., že faktura č. 001-2022 (ID této faktury je 1, zvýrazněno růžovou barvou) má 3 položky (Plastická hmota, Lepidlo vteřinové a Barvy časuodolné), zatímco faktura č. 002-2022 (žlutá) má položek 5.

Jinými slovy, každému řádku z tabulky Invoice odpovídá několik řádků z tabulky InvoiceItem. Řádky z InvoiceItem, které náleží k určitému řádku z Invoice, poznáme tak, že hodnota (číslo) ve sloupci InvoiceID v tabulce InvoiceItem je stejná jako hodnota ve sloupci ID v tabulce Invoice. Tedy že si odpovídá cizí klíč v tabulce InvoiceItem s primárním klíčem v tabulce Invoice.


Jazyk SQL

SQL, neboli Structured Query Language, je jazyk, který byl vyvinut pro dotazování (query) nad relačními databázemi. Je strukturovaný, protože nejtypičtější dotaz v tomto jazyce (SELECT) má následující strukturu:

SELECT
  <vybírám sloupce>
FROM
  <vybírám kategorii dat>
WHERE
  <vybírám řádky>
        

Když si data v relační databázi představíme jako obrovskou 3D matici, kde:

Je pak tedy SQL dotaz typu SELECT vlastně řezem v té trojrozměrné matici, kde klauzule FROM vybírá Z-ovou souřadnici (případně Z-ové souřadnice), klauzule WHERE vybírá Y-ovou souřadnici (souřadnice) a klauzule SELECT vybírá X-ovou souřadnici (souřadnice) v takové matici.