Junior
Πώς ρυθμίζονται οι σχέσεις μεταξύ των πινάκων σε σχεσιακές βάσεις δεδομένων;
sobes.tech AI
Απάντηση από AI
Οι σχέσεις μεταξύ πινάκων σε σχεσιακές βάσεις δεδομένων ρυθμίζονται μέσω ξένων κλειδιών (Foreign Keys).
Ένα ξένο κλειδί είναι μια στήλη ή σύνολο στηλών σε έναν πίνακα που αναφέρεται στο πρωτεύον κλειδί (Primary Key) ενός άλλου πίνακα. Δημιουργεί μια λογική σύνδεση μεταξύ των εγγραφών σε δύο πίνακες.
Κατά τη ρύθμιση της σχέσης:
- Ορίζεται το πρωτεύον κλειδί στον "γονικό" (Parent) πίνακα. Το πρωτεύον κλειδί ταυτοποιεί μοναδικά κάθε εγγραφή.
- Στον "παιδικό" (Child) πίνακα δημιουργείται μια στήλη (ή σύνολο στηλών) που θα λειτουργεί ως ξένο κλειδί.
- Αυτή η στήλη συνδέεται με το πρωτεύον κλειδί του "γονικού" πίνακα.
- Ορίζονται περιορισμοί ακεραιότητας δεδομένων (Constraints):
- REFERENCES: Δείχνει σε ποιον πίνακα και ποια στήλη (πρωτεύον κλειδί) αναφέρεται το ξένο κλειδί.
- ON UPDATE behavior: Ορίζει τι συμβαίνει με τις εγγραφές στον "παιδικό" πίνακα όταν αλλάζει το πρωτεύον κλειδί στον "γονικό". Επιλογές:
CASCADE: Οι αλλαγές εφαρμόζονται καταιγιστικά στις εγγραφές του παιδικού πίνακα.SET NULL: Οι τιμές του ξένου κλειδιού στον παιδικό πίνακα τίθενται σε NULL.RESTRICT: Η αλλαγή απαγορεύεται αν υπάρχουν σχετικές εγγραφές στον παιδικό πίνακα.NO ACTION: Παρόμοιο με RESTRICT σε περισσότερα DBMS.SET DEFAULT: Οι τιμές του ξένου κλειδιού τίθενται στην προεπιλεγμένη τιμή.
- ON DELETE behavior: Ορίζει τι συμβαίνει με τις εγγραφές στον "παιδικό" πίνακα όταν διαγράφεται μια εγγραφή στον "γονικό". Επιλογές ίδιες με το
ON UPDATE.
Παράδειγμα σύνταξης SQL για δημιουργία σχέσης:
CREATE TABLE Customers (
customer_id INT PRIMARY KEY, // Πρωτεύον κλειδί στον πίνακα Customers
customer_name VARCHAR(255)
);
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT, // Ξένο κλειδί που αναφέρεται στο customer_id του πίνακα Customers
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
ON UPDATE CASCADE // Όταν αλλάζει το customer_id στους Customers, αλλάζει και εδώ
ON DELETE CASCADE // Όταν διαγράφεται ένας πελάτης, διαγράφονται και οι σχετικές παραγγελίες
);
Τύποι σχέσεων μεταξύ πινάκων:
| Τύπος σχέσης | Περιγραφή | Παράδειγμα |
|---|---|---|
| One-to-One (1:1) | Ένας εγγραφή στον πρώτο πίνακα αντιστοιχεί σε μία εγγραφή στον δεύτερο και το αντίστροφο. Σπάνιο για σχεσιακές βάσεις. | Χρήστης και προφίλ. |
| One-to-Many (1:N) | Μία εγγραφή στον πρώτο πίνακα αντιστοιχεί σε πολλές εγγραφές στον δεύτερο, αλλά κάθε εγγραφή στον δεύτερο αντιστοιχεί μόνο σε μία στον πρώτο. | Πελάτης και παραγγελίες. |
| Many-to-Many (N:M) | Πολλές εγγραφές στον πρώτο πίνακα αντιστοιχούν σε πολλές στον δεύτερο και το αντίστροφο. Υλοποιείται μέσω ενδιάμεσου (συνδετικού) πίνακα. | Προϊόντα και κατηγορίες. |
Για τη σχέση Many-to-Many δημιουργείται ένας τρίτος πίνακας που περιέχει ξένες κλείδες και προς τους δύο πίνακες.
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 ( // Συνδετικός πίνακας
product_id INT,
category_id INT,
PRIMARY KEY (product_id, category_id), // Συνδυασμένο πρωτεύον κλειδί
FOREIGN KEY (product_id) REFERENCES Products(product_id),
FOREIGN KEY (category_id) REFERENCES Categories(category_id)
);