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:
- Je určen primární klíč v "rodičovské" (Parent) tabulce. Tento primární klíč jednoznačně identifikuje každý záznam.
- V "dceřiné" (Child) tabulce je vytvořen sloupec (nebo sady sloupců), který bude sloužit jako cizí klíč.
- Tento sloupec je propojen s primárním klíčem "rodičovské" tabulky.
- 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)
);