Junior
Ako sa nastavujú vzťahy medzi tabuľkami v relačných databázach?
sobes.tech AI
Odpoveď od AI
V relačných databázach sú vzťahy medzi tabuľkami nastavované pomocou cudzích kľúčov (Foreign Keys).
Cudzí kľúč je stĺpec alebo súbor stĺpcov v jednej tabuľke, ktorý odkazuje na primárny kľúč (Primary Key) inej tabuľky. Tým sa vytvára logické spojenie medzi záznamami v dvoch tabuľkách.
Pri nastavovaní vzťahu:
- Určí sa primárny kľúč v "rodičovskej" (Parent) tabuľke. Tento primárny kľúč jednoznačne identifikuje každý záznam.
- V "dcérskej" (Child) tabuľke sa vytvorí stĺpec (alebo súbor stĺpcov), ktorý bude slúžiť ako cudzí kľúč.
- Tento stĺpec sa prepojí s primárnym kľúčom "rodičovskej" tabuľky.
- Nastavia sa obmedzenia integrity dát (Constraints):
- REFERENCES: Ukazuje, na ktorú tabuľu a ktorý stĺpec (primárny kľúč) sa odkazuje cudzí kľúč.
- ON UPDATE behavior: Určuje, čo sa stane s záznamami v "dcérskej" tabuľke pri zmene primárneho kľúča v "rodičovskej". Varianty:
CASCADE: Zmeny sa kaskádovo aplikujú na záznamy v "dcérskej" tabuľke.SET NULL: Hodnoty cudzích kľúčov v "dcérskej" tabuľke sa nastavujú na NULL.RESTRICT: Zmena je zakázaná, ak existujú s týmto odkazom súvisiace záznamy.NO ACTION: Podobne ako RESTRICT vo väčšine DBMS.SET DEFAULT: Hodnoty cudzích kľúčov sa nastavujú na predvolenú hodnotu.
- ON DELETE behavior: Určuje, čo sa stane s záznamami v "dcérskej" tabuľke pri vymazaní záznamu v "rodičovskej". Varianty sú rovnaké ako pre
ON UPDATE.
Príklad SQL syntaxe pre vytvorenie vzťahu:
CREATE TABLE Customers (
customer_id INT PRIMARY KEY, // Primárny kľúč v tabuľke Customers
customer_name VARCHAR(255)
);
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT, // Cudzí kľúč odkazujúci na customer_id v tabuľke Customers
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
ON UPDATE CASCADE // Pri zmene customer_id v Customers, sa zmení aj tu
ON DELETE CASCADE // Pri vymazaní Customer, sa vymažú aj súvisiace Orders
);
Typy vzťahov medzi tabuľkami:
| Typ vzťahu | Popis | Príklad |
|---|---|---|
| One-to-One (1:1) | Jeden záznam v prvej tabuľke zodpovedá jednému záznamu v druhej a naopak. Zriedkavé v relačných databázach. | Používateľ a jeho profil. |
| One-to-Many (1:N) | Jeden záznam v prvej tabuľke zodpovedá viacerým záznamom v druhej, ale každý záznam v druhej zodpovedá iba jednému v prvej. | Zákazník a jeho objednávky. |
| Many-to-Many (N:M) | Mnoho záznamov v prvej tabuľke zodpovedá mnohým v druhej a naopak. Implementuje sa cez sprostredkovaciu (prepojovaciu) tabuľku. | Produkty a kategórie. |
Pre vzťah Many-to-Many sa vytvorí tretia tabuľka, ktorá obsahuje cudzie kľúče odkazujúce na obe tabuľky, ktoré treba prepojiť.
CREATE TABLE Products (
product_id INT PRIMARY KEY,
product_name VARCHAR(255)
);
CREATE TABLE Categories (
category_id INT PRIMARY KEY,
category_name VARCHAR(255)
);
CREATE TABLE ProductCategories ( // Prepojovacia tabuľka
product_id INT,
category_id INT,
PRIMARY KEY (product_id, category_id), // Zložený primárny kľúč
FOREIGN KEY (product_id) REFERENCES Products(product_id),
FOREIGN KEY (category_id) REFERENCES Categories(category_id)
);