Sobes.tech
Junior

Jak konfigurowane są relacje między tabelami w relacyjnych bazach danych?

sobes.tech AI

Odpowiedź od AI

W relacyjnych bazach danych relacje między tabelami są konfigurowane za pomocą kluczy obcych (Foreign Keys).

Klucz obcy to kolumna lub zestaw kolumn w jednej tabeli, które odwołują się do klucza głównego (Primary Key) innej tabeli. Ustanawia on logiczne powiązanie między rekordami w dwóch tabelach.

Podczas konfigurowania relacji:

  1. Definiuje się klucz główny w tabeli "rodzica" (Parent). Klucz główny jednoznacznie identyfikuje każdy rekord.
  2. W tabeli "dziecka" (Child) tworzy się kolumnę (lub zestaw kolumn), która będzie służyć jako klucz obcy.
  3. Ta kolumna w tabeli "dziecka" jest powiązana z kluczem głównym tabeli "rodzica".
  4. Ustanawia się ograniczenia integralności danych:
    • REFERENCES: Wskazuje, do jakiej tabeli i kolumny (klucza głównego) odnosi się klucz obcy.
    • ON UPDATE behavior: Określa, co się dzieje z rekordami w tabeli dziecka po zmianie klucza głównego w tabeli rodzica. Opcje:
      • CASCADE: Zmiany są kaskadowo stosowane do rekordów potomnych.
      • SET NULL: Wartości klucza obcego w tabeli dziecka są ustawiane na NULL.
      • RESTRICT: Operacja zmiany jest zabroniona, jeśli istnieją powiązane rekordy potomne.
      • NO ACTION: Podobnie jak RESTRICT w większości systemów zarządzania bazami danych.
      • SET DEFAULT: Wartości klucza obcego są ustawiane na wartość domyślną.
    • ON DELETE behavior: Określa, co się dzieje z rekordami w tabeli dziecka po usunięciu rekordów w tabeli rodzica. Opcje są takie same jak dla ON UPDATE.

Przykład składni SQL do tworzenia relacji:

CREATE TABLE Customers (
    customer_id INT PRIMARY KEY, -- Klucz główny w tabeli Customer
    customer_name VARCHAR(255)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT, -- Klucz obcy odwołujący się do customer_id w tabeli Customers
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
    ON UPDATE CASCADE -- Przy zmianie customer_id w Customers, zmieni się również w Orders
    ON DELETE CASCADE -- Przy usunięciu Customer, usunięte zostaną również powiązane Orders
);

Typy relacji między tabelami:

Typ relacji Opis Przykład
One-to-One (1:1) Jeden rekord w pierwszej tabeli odpowiada dokładnie jednemu rekordowi w drugiej i odwrotnie. Rzadki przypadek w relacyjnych bazach danych. Użytkownik i jego profil.
One-to-Many (1:N) Jeden rekord w pierwszej tabeli odpowiada wielu rekordom w drugiej, ale każdy rekord w drugiej odpowiada tylko jednemu w pierwszej. Klient i jego zamówienia.
Many-to-Many (N:M) Wiele rekordów w pierwszej tabeli odpowiada wielu rekordom w drugiej i odwrotnie. Realizuje się to przez tabelę pośrednią (łącznikową). Produkty i kategorie.

Dla relacji Many-to-Many tworzy się trzecią tabelę zawierającą klucze obce do obu tabel, które mają być powiązane.

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 ( -- Tabela łącznikowa
    product_id INT,
    category_id INT,
    PRIMARY KEY (product_id, category_id), -- Klucz główny złożony
    FOREIGN KEY (product_id) REFERENCES Products(product_id),
    FOREIGN KEY (category_id) REFERENCES Categories(category_id)
);