Μια σχέση ενός προς πολλούς σε μια βάση δεδομένων προκύπτει όταν κάθε εγγραφή στον Πίνακα Α μπορεί να έχει πολλές συνδεδεμένες εγγραφές στον Πίνακα Β, αλλά κάθε εγγραφή στον Πίνακα Β μπορεί να έχει μόνο μία αντίστοιχη εγγραφή στον Πίνακα Α. Μια σχέση με ένα προς πολλά σε μια βάση δεδομένων είναι ο πιο κοινός σχεδιασμός σχεσιακής βάσης δεδομένων και βρίσκεται στην καρδιά του καλού σχεδιασμού.
Εξετάστε τη σχέση μεταξύ ενός δασκάλου και των μαθημάτων που διδάσκουν. Ένας δάσκαλος μπορεί να διδάξει πολλά μαθήματα, αλλά το μάθημα δεν θα έχει την ίδια σχέση με τον δάσκαλο.
Επομένως, για κάθε εγγραφή σε έναν πίνακα εκπαιδευτικών, θα μπορούσαν να υπάρχουν πολλές εγγραφές στον πίνακα μαθημάτων. Αυτή είναι μια σχέση από το ένα προς το άλλο: ένας δάσκαλος σε πολλαπλά μαθήματα.
Γιατί η δημιουργία μιας σχέσης "ένα προς πολλούς" είναι σημαντική
Για να εκπροσωπήσετε τη σχέση "ένας προς πολλούς", χρειάζεστε τουλάχιστον δύο πίνακες. Ας δούμε γιατί.
Ίσως δημιουργήσαμε έναν πίνακα εκπαιδευτικών, στον οποίο θέλαμε να καταγράψουμε το όνομα και τα μαθήματα που δίδαξε. Μπορούμε να το σχεδιάσουμε έτσι:
Teacher_ID | Teacher_Name | Σειρά μαθημάτων |
---|---|---|
Teacher_001 | Carmen | Βιολογία |
Teacher_002 | Βερενίκη | Μαθηματικά |
Teacher_003 | Jorge | Αγγλικά |
Τι γίνεται αν η Carmen διδάσκει δύο ή περισσότερα μαθήματα; Έχουμε δύο επιλογές με αυτό το σχέδιο. Θα μπορούσαμε να το προσθέσουμε στο υπάρχον αρχείο της Carmen, όπως αυτό:
Teacher_ID | Δάσκαλος _Name | Σειρά μαθημάτων |
---|---|---|
Teacher_001 | Carmen | Βιολογία, Μαθηματικά |
Teacher_002 | Βερενίκη | Μαθηματικά |
Teacher_003 | Jorge | Αγγλικά |
Ο παραπάνω σχεδιασμός, ωστόσο, είναι άκαμπτος και μπορεί να οδηγήσει σε προβλήματα αργότερα κατά την προσπάθεια εισαγωγής, επεξεργασίας ή διαγραφής δεδομένων.
Κάνει δύσκολη την αναζήτηση δεδομένων. Αυτός ο σχεδιασμός παραβιάζει την πρώτη αρχή της κανονικοποίησης της βάσης δεδομένων, First Normal Form (1NF) , η οποία δηλώνει ότι κάθε κελί πίνακα πρέπει να περιέχει ένα και μοναδικό κομμάτι δεδομένων.
Μια άλλη εναλλακτική λύση είναι να προσθέσετε απλά ένα δεύτερο ρεκόρ για την Carmen:
Δάσκαλος _ID | Δάσκαλος _Name | Σειρά μαθημάτων |
---|---|---|
Teacher_001 | Carmen | Βιολογία |
Teacher_001 | Carmen | Μαθηματικά |
Teacher_002 | Βερενίκη | Μαθηματικά |
Teacher_003 | Jorge | Αγγλικά |
Αυτό συμμορφώνεται με το 1NF, αλλά εξακολουθεί να είναι κακός σχεδιασμός βάσης δεδομένων, επειδή εισάγει πλεονασμό και θα μπορούσε να φουσκώσει άσκοπα μια πολύ μεγάλη βάση δεδομένων. Το πιο σημαντικό, τα δεδομένα θα μπορούσαν να γίνουν αντιφατικά. Για παράδειγμα, τι θα συμβεί αν το όνομα της Carmen αλλάξει; Κάποιος που συνεργάζεται με τα δεδομένα μπορεί να ενημερώσει το όνομά της σε μία εγγραφή και να μην την ενημερώσει στη δεύτερη εγγραφή. Αυτός ο σχεδιασμός παραβιάζει τη δεύτερη κανονική μορφή (2NF), η οποία ακολουθεί το 1NF και πρέπει επίσης να αποφύγει τις απολύσεις πολλαπλών εγγραφών, χωρίζοντας υποσύνολα δεδομένων σε πολλαπλούς πίνακες και δημιουργώντας μια σχέση μεταξύ τους.
Πώς να σχεδιάσετε μια βάση δεδομένων με μια προς πολλές σχέσεις
Για να εφαρμόσουμε μια σχέση "ένας προς πολλούς" στον πίνακα "Δάσκαλοι και μαθήματα", σπάμε τα τραπέζια σε δύο και τα συνδέουμε χρησιμοποιώντας ένα ξένο κλειδί .
Εδώ, αφαιρέσαμε τη στήλη "Τίτλος" στον πίνακα "Δάσκαλοι":
Δάσκαλος _ID | Δάσκαλος _Name |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Βερενίκη |
Teacher_003 | Jorge |
Και εδώ είναι ο πίνακας μαθημάτων. Σημειώστε ότι το ξένο κλειδί του, Teacher_ID, συνδέει ένα μάθημα με έναν δάσκαλο στον πίνακα Καθηγητών:
Αναγνωριστικό_χρήστη | Course_Name | Teacher_ID |
---|---|---|
Course_001 | Βιολογία | Teacher_001 |
Course_002 | Μαθηματικά | Teacher_001 |
Course_003 | Αγγλικά | Teacher_003 |
Έχουμε αναπτύξει μια σχέση μεταξύ του πίνακα των εκπαιδευτικών και των μαθημάτων χρησιμοποιώντας ένα ξένο κλειδί.
Αυτό μας λέει ότι τόσο η Βιολογία όσο και το Μαθηματίδιο διδάσκονται από την Carmen και ότι ο Jorge διδάσκει αγγλικά.
Μπορούμε να δούμε πώς αυτός ο σχεδιασμός αποφεύγει τις ενδεχόμενες απολύσεις, επιτρέπει σε μεμονωμένους δασκάλους να διδάσκουν πολλαπλά μαθήματα και εφαρμόζει μια σχέση από το ένα προς το άλλο.
Οι βάσεις δεδομένων μπορούν επίσης να εφαρμόσουν μια σχέση one-to-one και μια σχέση πολλών προς πολλά.