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 :
| 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 :
SELECT
*
FROM
users
Maintenant, joignons à ces utilisateurs leurs fils. Nous allons joindre la table à elle-même, il faut donc la renommer :
LEFT JOIN users as sons
Maintenant nous pouvons spécifier la liaison entre la table principale et la table renommée :
LEFT JOIN users as sons ON sons.id=users.son_id
Spécifions maintenant les champs :
SELECT
users.name as user_name, sons.name as son_name
Assemblons le tout et nous obtenons la requête suivante :
SELECT
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
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.
Écrivez une requête qui récupère une catégorie ainsi que sa catégorie parente.
Écrivez une requête qui récupère une catégorie ainsi que son parent et son grand-parent.
Écrivez une requête qui récupère une catégorie ainsi que son parent, son grand-parent et son arrière-grand-parent.