Datenverwandtschaft in Python
Nehmen wir an, wir stehen vor der Aufgabe, Väter und Söhne zu speichern. Nehmen wir an, jeder Vater kann nur einen Sohn haben, und der Sohn seinerseits kann auch einen Sohn haben.
Wir müssen uns überlegen, wie wir die Daten
speichern werden. Die erste Idee, die einem
in den Sinn kommen könnte - zwei Tabellen zu erstellen: parents
für Väter und sons für Söhne. Dann
diese Tabellen mit einem Feld zu verbinden:
son_id oder parent_id.
Allerdings ist diese Idee nicht sehr gut - denn dieselbe Person kann gleichzeitig sowohl Vater als auch Sohn sein - und müsste dann in beiden Tabellen gespeichert werden, was unpraktisch ist, mehr Platz beansprucht und leicht zu Fehlern führt.
Eine bessere Variante ist, die Tabelle
mit sich selbst zu verbinden: Wir erstellen eine Tabelle users,
darin speichern wir alle Benutzer und weisen jedem
ein Feld son_id zu, in dem die
id des Sohnes aus derselben Tabelle gespeichert wird:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Abfragen
Lassen Sie uns nun eine Abfrage schreiben, die den Benutzer zusammen mit seinem Sohn abruft.
Lassen Sie uns zunächst einfach die Benutzer abrufen:
SELECT
*
FROM
users
Jetzt joinen wir ihre Söhne zu den Benutzern. Da wir die Tabelle mit sich selbst verbinden, müssen wir sie umbenennen:
LEFT JOIN users as sons
Nun können wir die Beziehung der Haupttabelle und der umbenannten Tabelle angeben:
LEFT JOIN users as sons ON sons.id=users.son_id
Geben wir nun die Felder an:
SELECT
users.name as user_name, sons.name as son_name
Setzen wir alles zusammen und erhalten die folgende Abfrage:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktische Aufgaben
Nehmen wir an, wir haben Kategorien. Jede Kategorie kann zu einer übergeordneten Kategorie gehören, diese wiederum zu ihrer übergeordneten Kategorie und so weiter. Beschreiben Sie die Speicherstruktur.
Schreiben Sie eine Abfrage, die eine Kategorie zusammen mit ihrer übergeordneten Kategorie abruft.
Schreiben Sie eine Abfrage, die eine Kategorie zusammen mit ihrem Elternteil und Großelternteil abruft.
Schreiben Sie eine Abfrage, die eine Kategorie zusammen mit ihrem Elternteil, Großelternteil und Urgroßelternteil abruft.