Συσχετίσεις Δεδομένων στην Python

Ας υποθέσουμε ότι αντιμετωπίζουμε το πρόβλημα της αποθήκευσης πατέρων και γιων. Ας υποθέσουμε ότι κάθε πατέρας μπορεί να έχει μόνο έναν γιο, και ο γιος με τη σειρά του μπορεί επίσης να έχει έναν γιο.

Πρέπει να σκεφτούμε πώς θα αποθηκεύσουμε τα δεδομένα. Η πρώτη ιδέα που μπορεί να έρθει στο μυαλό είναι να δημιουργήσουμε δύο πίνακες: parents για τους πατέρες και sons για τους γιους. Στη συνέχεια να συνδέσουμε αυτούς τους πίνακες με κάποιο πεδίο: son_id ή parent_id.

Ωστόσο, αυτή η ιδέα δεν είναι πολύ καλή - γιατί το ίδιο άτομο μπορεί να είναι ταυτόχρονα και πατέρας και γιος - και θα πρέπει να το αποθηκεύσουμε και στους δύο πίνακες, κάτι που είναι άβολο, καταλαμβάνει περισσότερο χώρο και οδηγεί εύκολα σε σφάλματα.

Μια καλύτερη επιλογή είναι να συνδέσουμε τον πίνακα με τον εαυτό του: ας δημιουργήσουμε τον πίνακα users, στην οποία θα αποθηκεύουμε όλους τους χρήστες και στον καθένα θα δώσουμε ένα πεδίο son_id, στο οποίο θα αποθηκεύεται το id του γιου από τον ίδιο πίνακα:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Ερωτήματα

Ας γράψουμε τώρα ένα ερώτημα που θα ανακτήσει τον χρήστη μαζί με τον γιο του.

Για αρχή ας ανακτήσουμε απλώς τους χρήστες:

sqlSELECT
  *
FROM
  users

Τώρα ας κάνουμε join στους χρήστες τους γιους τους. Θα κάνουμε join τον πίνακα με τον εαυτό του, επομένως πρέπει να τον μετονομάσουμε:

sqlLEFT JOIN users as sons

Τώρα μπορούμε να καθορίσουμε τη σχέση μεταξύ του κύριου πίνακα και του μετονομασμένου:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Ας καθορίσουμε τώρα τα πεδία:

sqlSELECT
  users.name as user_name, sons.name as son_name

Ας τα ενώσουμε όλα μαζί και θα πάρουμε το ακόλουθο ερώτημα:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Πρακτικά Προβλήματα

Задание 1

Ας υποθέσουμε ότι έχουμε κατηγορίες. Κάθε κατηγορία μπορεί να ανήκει σε μια γονική κατηγορία, η οποία με τη σειρά της μπορεί να ανήκει στη δική της γονική και ούτω καθ' εξής. Περιγράψτε τη δομή αποθήκευσης.

Задание 2

Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τη γονική της κατηγορία.

Задание 3

Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τον γονέα της και τον παππού της.

Задание 4

Γράψτε ένα ερώτημα που θα ανακτήσει μια κατηγορία μαζί με τον γονέα της, τον παππού της και τον προ-παππού της.