Relations de données parentales en Python

Supposons que nous soyons confrontés à la tâche de stocker des pères et des fils. Supposons que chaque père ne puisse avoir qu'un seul fils, et qu'un fils à son tour puisse également avoir un seul fils.

Nous devons trouver comment stocker les données. La première idée qui peut venir à l'esprit est de créer deux tables : parents pour les pères et sons pour les fils. Ensuite, de lier ces tables par un champ quelconque : son_id ou parent_id.

Cependant, cette idée n'est pas très bonne - car une même personne peut être à la fois père et fils - et il faudra la stocker dans les deux tables, ce qui est peu pratique, prend plus de place et conduit facilement à des erreurs.

Une meilleure option est de lier la table à elle-même : créons une table users, dans laquelle nous stockerons tous les utilisateurs et pour chacun nous créerons un champ son_id, dans lequel sera stocké le id du fils provenant de cette même table :

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

Requêtes

Écrivons maintenant une requête qui récupérera l'utilisateur ainsi que son fils.

Pour commencer, récupérons simplement les utilisateurs :

sqlSELECT
  *
FROM
  users

Maintenant, joignons à ces utilisateurs leurs fils. Nous allons joindre la table à elle-même, il faut donc la renommer :

sqlLEFT JOIN users as sons

Maintenant nous pouvons spécifier la liaison entre la table principale et la table renommée :

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

Spécifions maintenant les champs :

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

Assemblons le tout et nous obtenons la requête suivante :

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

Tâches pratiques

Задание 1

Supposons que nous ayons des catégories. Chaque catégorie peut appartenir à une catégorie parente, qui à son tour peut appartenir à sa propre catégorie parente et ainsi de suite. Décrivez la structure de stockage.

Задание 2

Écrivez une requête qui récupère une catégorie ainsi que sa catégorie parente.

Задание 3

Écrivez une requête qui récupère une catégorie ainsi que son parent et son grand-parent.

Задание 4

Écrivez une requête qui récupère une catégorie ainsi que son parent, son grand-parent et son arrière-grand-parent.