Συσχετίσεις Δεδομένων στην Python
Ας υποθέσουμε ότι αντιμετωπίζουμε το πρόβλημα της αποθήκευσης πατέρων και γιων. Ας υποθέσουμε ότι κάθε πατέρας μπορεί να έχει μόνο έναν γιο, και ο γιος με τη σειρά του μπορεί επίσης να έχει έναν γιο.
Πρέπει να σκεφτούμε πώς θα αποθηκεύσουμε
τα δεδομένα. Η πρώτη ιδέα που μπορεί να έρθει
στο μυαλό είναι να δημιουργήσουμε δύο πίνακες: parents
για τους πατέρες και sons για τους γιους. Στη συνέχεια
να συνδέσουμε αυτούς τους πίνακες με κάποιο πεδίο:
son_id ή parent_id.
Ωστόσο, αυτή η ιδέα δεν είναι πολύ καλή - γιατί το ίδιο άτομο μπορεί να είναι ταυτόχρονα και πατέρας και γιος - και θα πρέπει να το αποθηκεύσουμε και στους δύο πίνακες, κάτι που είναι άβολο, καταλαμβάνει περισσότερο χώρο και οδηγεί εύκολα σε σφάλματα.
Μια καλύτερη επιλογή είναι να συνδέσουμε τον πίνακα
με τον εαυτό του: ας δημιουργήσουμε τον πίνακα users,
στην οποία θα αποθηκεύουμε όλους τους χρήστες και στον καθένα
θα δώσουμε ένα πεδίο son_id, στο οποίο θα
αποθηκεύεται το id του γιου από τον ίδιο πίνακα:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Ερωτήματα
Ας γράψουμε τώρα ένα ερώτημα που θα ανακτήσει τον χρήστη μαζί με τον γιο του.
Για αρχή ας ανακτήσουμε απλώς τους χρήστες:
SELECT
*
FROM
users
Τώρα ας κάνουμε join στους χρήστες τους γιους τους. Θα κάνουμε join τον πίνακα με τον εαυτό του, επομένως πρέπει να τον μετονομάσουμε:
LEFT JOIN users as sons
Τώρα μπορούμε να καθορίσουμε τη σχέση μεταξύ του κύριου πίνακα και του μετονομασμένου:
LEFT JOIN users as sons ON sons.id=users.son_id
Ας καθορίσουμε τώρα τα πεδία:
SELECT
users.name as user_name, sons.name as son_name
Ας τα ενώσουμε όλα μαζί και θα πάρουμε το ακόλουθο ερώτημα:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Πρακτικά Προβλήματα
Ας υποθέσουμε ότι έχουμε κατηγορίες. Κάθε κατηγορία μπορεί να ανήκει σε μια γονική κατηγορία, η οποία με τη σειρά της μπορεί να ανήκει στη δική της γονική και ούτω καθ' εξής. Περιγράψτε τη δομή αποθήκευσης.
Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τη γονική της κατηγορία.
Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τον γονέα της και τον παππού της.
Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τον γονέα της, τον παππού της και τον προ-παππού της.