Sobes.tech
Junior

Πώς ρυθμίζονται οι σχέσεις μεταξύ των πινάκων σε σχεσιακές βάσεις δεδομένων;

sobes.tech AI

Απάντηση από AI

Οι σχέσεις μεταξύ πινάκων σε σχεσιακές βάσεις δεδομένων ρυθμίζονται μέσω ξένων κλειδιών (Foreign Keys).

Ένα ξένο κλειδί είναι μια στήλη ή σύνολο στηλών σε έναν πίνακα που αναφέρεται στο πρωτεύον κλειδί (Primary Key) ενός άλλου πίνακα. Δημιουργεί μια λογική σύνδεση μεταξύ των εγγραφών σε δύο πίνακες.

Κατά τη ρύθμιση της σχέσης:

  1. Ορίζεται το πρωτεύον κλειδί στον "γονικό" (Parent) πίνακα. Το πρωτεύον κλειδί ταυτοποιεί μοναδικά κάθε εγγραφή.
  2. Στον "παιδικό" (Child) πίνακα δημιουργείται μια στήλη (ή σύνολο στηλών) που θα λειτουργεί ως ξένο κλειδί.
  3. Αυτή η στήλη συνδέεται με το πρωτεύον κλειδί του "γονικού" πίνακα.
  4. Ορίζονται περιορισμοί ακεραιότητας δεδομένων (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)
);