Sobes.tech
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:

  1. Určí sa primárny kľúč v "rodičovskej" (Parent) tabuľke. Tento primárny kľúč jednoznačne identifikuje každý záznam.
  2. V "dcérskej" (Child) tabuľke sa vytvorí stĺpec (alebo súbor stĺpcov), ktorý bude slúžiť ako cudzí kľúč.
  3. Tento stĺpec sa prepojí s primárnym kľúčom "rodičovskej" tabuľky.
  4. 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)
);