Sobes.tech
Junior

Jak jsou nastavovány vztahy mezi tabulkami v relačních databázích?

sobes.tech AI

Odpověď od AI

V relacečních databázích jsou vztahy mezi tabulkami nastavovány pomocí cizích klíčů (Foreign Keys).

Cizí klíč je sloupec nebo sada sloupců v jedné tabulce, která odkazuje na primární klíč (Primary Key) jiné tabulky. Tím se vytváří logické spojení mezi záznamy ve dvou tabulkách.

Při nastavování vztahu:

  1. Je určen primární klíč v "rodičovské" (Parent) tabulce. Tento primární klíč jednoznačně identifikuje každý záznam.
  2. V "dceřiné" (Child) tabulce je vytvořen sloupec (nebo sady sloupců), který bude sloužit jako cizí klíč.
  3. Tento sloupec je propojen s primárním klíčem "rodičovské" tabulky.
  4. Nastavují se omezení integrity dat (Constraints):
    • REFERENCES: Ukazuje, na kterou tabulku a který sloupec (primární klíč) odkazuje cizí klíč.
    • ON UPDATE behavior: Určuje, co se stane s záznamy v "dceřiné" tabulce při změně primárního klíče v "rodičovské". Varianty:
      • CASCADE: Změny se kaskádově aplikují na záznamy v dceřiné tabulce.
      • SET NULL: Hodnoty cizího klíče v dceřiné tabulce jsou nastaveny na NULL.
      • RESTRICT: Změna je zakázána, pokud existují s tímto odkazem související záznamy.
      • NO ACTION: Podobně jako RESTRICT ve většině DBMS.
      • SET DEFAULT: Hodnoty cizího klíče jsou nastaveny na výchozí hodnotu.
    • ON DELETE behavior: Určuje, co se stane s záznamy v "dceřiné" tabulce při smazání záznamu v "rodičovské". Varianty jsou stejné jako u ON UPDATE.

Příklad SQL syntaxe pro vytvoření vztahu:

CREATE TABLE Customers (
    customer_id INT PRIMARY KEY, // Primární klíč v tabulce Customers
    customer_name VARCHAR(255)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT, // Cizí klíč odkazující na customer_id v tabulce Customers
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
    ON UPDATE CASCADE // Při změně customer_id v Customers, se změní i zde
    ON DELETE CASCADE // Při smazání Customer, smazou se i související Orders
);

Typy vztahů mezi tabulkami:

Typ vztahu Popis Příklad
One-to-One (1:1) Jeden záznam v první tabulce odpovídá jednomu záznamu ve druhé a naopak. Vzácné v relační databázi. Uživatel a jeho profil.
One-to-Many (1:N) Jeden záznam v první tabulce odpovídá mnoha záznamům ve druhé, ale každý záznam ve druhé odpovídá pouze jednomu v první. Zákazník a jeho objednávky.
Many-to-Many (N:M) Mnoho záznamů v první tabulce odpovídá mnoha v druhé a naopak. Realizuje se přes prostřední (propojovací) tabulku. Produkty a kategorie.

Pro vztah Many-to-Many se vytváří třetí tabulka obsahující cizí klíče odkazující na obě tabulky.

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 ( // Propojovací tabulka
    product_id INT,
    category_id INT,
    PRIMARY KEY (product_id, category_id), // Složený primární klíč
    FOREIGN KEY (product_id) REFERENCES Products(product_id),
    FOREIGN KEY (category_id) REFERENCES Categories(category_id)
);