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:
- Nustatomas "tėvų" (Parent) lentelės pirminis raktas. Pirminis raktas unikaliu būdu identifikuoja kiekvieną įrašą.
- "Vaikų" (Child) lentelėje sukuriamas stulpelis (arba stulpelių rinkinys), kuris taps išoriniu raktu.
- Šis stulpelis "vaikų" lentelėje yra susiejamas su "tėvų" lentelės pirminiu raktu.
- 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)
);