Je me pose une question sur la meilleure façon de traiter de multiples jointures externes de cardinalité 0…n.
Pour clarifier la question, une mise en conditions, mettons qu'il s'agisse de gérer des activités avec des animateurs des participants.
Une table enregistre les activités, une ligne, par activité,
Une table enregistre les animateurs, une ligne par animateur,
Une table enregistre les participants, une ligne par participant.
Enfin, une table met en relation les animateurs affectés sur une activité (chaque ligne est un couple clé primaire de l'activité / clé primaire d'un animateur, plus quelques autres données) et une autre les participants inscrits sur l'activité (même principe).
Tout ça me paraît sain d'un point de vue de conception de BDD.
Je n'ai pas de difficulté pour ressortir la liste des animateurs d'une activité, une première jointure 0…n avec la table de relation des animateurs, puis une jointure 1…1 avec la table des animateurs. Pas de difficulté non plus pour ressortir la liste des participants.
Là où je m'interroge, c'est que, finalement, je pourrais, lors d'une même requête tout récupérer. Le problème c'est que le résultat sera variable, parfois j'ai plus d'animateurs que de participants (à l'ouverture des inscriptions), et donc un des participants sera "répété", et parfois ce sera l'inverse (un animateur sera répété).
Après, je peux très bien traiter ça en parcourant les résultats et en pointant les clé primaire : si c'est une clé primaire inconnue pour un participant, j'ajoute le participant, si je connais déjà cette clé primaire, c'est une répétition.
Donc c'est faisable. La question c'est plutôt est-ce efficient ?
D'un côté je fais une requête plutôt que trois (une pour les données de l'activité, une pour les animateurs, une pour les participants).
D'un autre je récupère beaucoup de données inutiles (répétées), et fait faire pas mal de jointures. Par ailleurs ça fait des requêtes un peu compliquées.
J'ai tendance à éviter le nombre de requêtes, mais est-ce la bonne pratique ?
Pour clarifier la question, une mise en conditions, mettons qu'il s'agisse de gérer des activités avec des animateurs des participants.
Une table enregistre les activités, une ligne, par activité,
Une table enregistre les animateurs, une ligne par animateur,
Une table enregistre les participants, une ligne par participant.
Enfin, une table met en relation les animateurs affectés sur une activité (chaque ligne est un couple clé primaire de l'activité / clé primaire d'un animateur, plus quelques autres données) et une autre les participants inscrits sur l'activité (même principe).
Tout ça me paraît sain d'un point de vue de conception de BDD.
Je n'ai pas de difficulté pour ressortir la liste des animateurs d'une activité, une première jointure 0…n avec la table de relation des animateurs, puis une jointure 1…1 avec la table des animateurs. Pas de difficulté non plus pour ressortir la liste des participants.
Là où je m'interroge, c'est que, finalement, je pourrais, lors d'une même requête tout récupérer. Le problème c'est que le résultat sera variable, parfois j'ai plus d'animateurs que de participants (à l'ouverture des inscriptions), et donc un des participants sera "répété", et parfois ce sera l'inverse (un animateur sera répété).
Après, je peux très bien traiter ça en parcourant les résultats et en pointant les clé primaire : si c'est une clé primaire inconnue pour un participant, j'ajoute le participant, si je connais déjà cette clé primaire, c'est une répétition.
Donc c'est faisable. La question c'est plutôt est-ce efficient ?
D'un côté je fais une requête plutôt que trois (une pour les données de l'activité, une pour les animateurs, une pour les participants).
D'un autre je récupère beaucoup de données inutiles (répétées), et fait faire pas mal de jointures. Par ailleurs ça fait des requêtes un peu compliquées.
J'ai tendance à éviter le nombre de requêtes, mais est-ce la bonne pratique ?