Sobes.tech
Junior

Kaip nustatomos ryšiai tarp lentelių reliacinėse duomenų bazėse?

sobes.tech AI

Atsakymas iš AI

Relacinėse duomenų bazėse ryšiai tarp lentelių nustatomi naudojant išorinius raktus (Foreign Keys).

Išorinis raktas — tai stulpelis arba stulpelių rinkinys vienoje lentelėje, kuris nurodo kitą lentelę esančio pirminio rakto (Primary Key). Jis nustato loginį ryšį tarp įrašų dviejose lentelėse.

Ryšio nustatymo metu:

  1. Nustatomas "tėvų" (Parent) lentelės pirminis raktas. Pirminis raktas unikaliu būdu identifikuoja kiekvieną įrašą.
  2. "Vaikų" (Child) lentelėje sukuriamas stulpelis (arba stulpelių rinkinys), kuris taps išoriniu raktu.
  3. Šis stulpelis "vaikų" lentelėje yra susiejamas su "tėvų" lentelės pirminiu raktu.
  4. Nustatomos duomenų vientisumo apribojimai (Constraint):
    • REFERENCES: nurodo, į kurią lentelę ir kurį stulpelį (pirminį raktą) nurodo išorinis raktas.
    • ON UPDATE behavior: apibrėžia, kas vyksta "vaikų" įrašuose, kai keičiasi "tėvų" pirminis raktas. Galimi variantai:
      • CASCADE: pakeitimai taikomi ir vaikų įrašams.
      • SET NULL: išorinio rakto reikšmė vaikų lentelėje nustatoma į NULL.
      • RESTRICT: operacija yra draudžiama, jei yra susijusių vaikų įrašų.
      • NO ACTION: panašiai kaip RESTRICT daugumoje DB valdymo sistemų.
      • SET DEFAULT: išorinio rakto reikšmė nustatoma į numatytąją reikšmę.
    • ON DELETE behavior: apibrėžia, kas vyksta "vaikų" įrašuose, kai ištrinamas "tėvų" įrašas. Galimi tie patys variantai kaip ir ON UPDATE.

SQL sintaksės pavyzdys ryšio kūrimui:

CREATE TABLE Customers (
    customer_id INT PRIMARY KEY, // Kliento pirminis raktas
    customer_name VARCHAR(255)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT, // Išorinis raktas, nurodantis į Customers.customer_id
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
    ON UPDATE CASCADE // Kai keičiasi customer_id, keičiasi ir Orders
    ON DELETE CASCADE // Kai trinamas Customer, trinami ir susiję Orders
);

Ryšių tipai tarp lentelių:

Ryšio tipas Aprašymas Pavyzdys
One-to-One (1:1) Vienas įrašas pirmojoje lentelėje atitinka vieną įrašą antroje ir atvirkščiai. Retas atvejis relacinėse DB. Vartotojas ir jo profilis.
One-to-Many (1:N) Vienas įrašas pirmojoje lentelėje atitinka daug įrašų antroje, bet kiekvienas antrosios lentelės įrašas atitinka tik vieną pirmosios. Klientas ir jo užsakymai.
Many-to-Many (N:M) Daug įrašų pirmojoje lentelėje atitinka daug įrašų antroje, ir atvirkščiai. Realizuojama per tarpinę (sujungiančią) lentelę. Produktai ir kategorijos.

Many-to-Many ryšiui kuriama trečia lentelė, kuri turi išorinius raktus į abi susijusias lenteles.

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 ( // Sujungimo lentelė
    product_id INT,
    category_id INT,
    PRIMARY KEY (product_id, category_id), // Sudėtinis pirminis raktas
    FOREIGN KEY (product_id) REFERENCES Products(product_id),
    FOREIGN KEY (category_id) REFERENCES Categories(category_id)
);