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íč.
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):
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:
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 |
Nyní tedy uvedeme několik řádků, které by mohly být obsahem výše zmíněných tabulek Invoice a InvoiceItem.
ID | InvoiceNo | CustomerName | IssueDate | DueDate | TaxableEventDate | TotalPrice |
---|---|---|---|---|---|---|
1 | 001-2022 | Řezáč & Řezáč, Pelhřimov | 2022-01-10 | 2022-01-24 | 2022-01-01 | 11887.80 |
2 | 002-2022 | Nováček, s.r.o. | 2022-01-12 | 2022-01-26 | 2022-01-01 | 3657.20 |
3 | 003-2022 | Nový eshop na kraji lesa | 2022-01-15 | 2022-01-29 | 2022-01-02 | 28399.60 |
4 | 004-2022 | Nováček, s.r.o. | 2022-01-15 | 2022-01-29 | 2022-01-13 | 618.80 |
5 | 005-2022 | Kolkovna | 2022-02-03 | 2022-02-17 | 2022-02-02 | 366.60 |
6 | 006-2022 | Škoda Auto a.s. | 2022-02-05 | 2022-02-19 | 2022-02-01 | 2187.64 |
7 | 007-2022 | Střízlík, Střízlíková a Střízlata, Pelhřimov | 2022-02-07 | 2022-02-21 | 2022-02-05 | 2083.65 |
8 | 008-2022 | OSRAM, s.r.o. | 2022-02-20 | 2022-03-06 | 2022-02-15 | 2110.10 |
9 | 009-2022 | Kolkovna | 2022-02-20 | 2022-03-06 | 2022-02-18 | 8799.40 |
ID | InvoiceID | ItemOrdinal | Description | Amount | UnitPrice | Unit | ItemPrice |
---|---|---|---|---|---|---|---|
1 | 1 | 1 | Plastická hmota | 10.5 | 100.00 | kg | 1050.00 |
2 | 1 | 2 | Lepidlo vteřinové | 3.0 | 12.60 | ks | 37.80 |
3 | 1 | 3 | Barvy časuodolné | 45.0 | 240.00 | ks | 10800.00 |
4 | 2 | 1 | Vařečka kuchyňská | 2.0 | 32.20 | ks | 64.40 |
5 | 2 | 2 | Sada příborů 6x | 1.0 | 2500.00 | ks | 2500.00 |
6 | 2 | 3 | Hrnec "Papinův" | 1.0 | 850.00 | ks | 850.00 |
7 | 2 | 4 | Naběračky | 3.0 | 65.30 | ks | 195.90 |
8 | 2 | 5 | Mělký pekáč | 1.0 | 46.90 | ks | 46.90 |
9 | 3 | 1 | Stůl | 1.0 | 18000.00 | ks | 18000.00 |
10 | 3 | 2 | Kancelářská židle | 4.0 | 2599.90 | ks | 10399.60 |
11 | 4 | 1 | Lžičky čajové | 10.0 | 37.00 | ks | 370.00 |
12 | 4 | 2 | Talíře ⌀ 25 cm | 6.0 | 27.80 | ks | 166.80 |
13 | 4 | 3 | Misky malé | 4.0 | 15.00 | ks | 60.00 |
14 | 4 | 4 | Palička na maso | 1.0 | 22.00 | ks | 22.00 |
15 | 5 | 1 | Popelníky | 10.0 | 16.70 | ks | 167.00 |
16 | 5 | 2 | Pivní tácky | 40.0 | 4.99 | ks | 199.60 |
17 | 6 | 1 | Plastový díl k palubní desce | 1.0 | 355.00 | ks | 355.00 |
18 | 6 | 2 | Násada na řadicí páku | 3.0 | 610.88 | ks | 1832.64 |
19 | 7 | 1 | Nit režná | 10.5 | 60.00 | m | 630.00 |
20 | 7 | 2 | Nit modrá | 6.35 | 110.00 | m | 698.50 |
21 | 7 | 3 | Nit karmínová | 6.35 | 105.00 | m | 666.75 |
22 | 7 | 4 | Náprstek | 4.0 | 22.10 | ks | 88.40 |
23 | 8 | 1 | Kovové šroubení | 2.0 | 5.15 | ks | 10.30 |
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.
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.