Bonjour à tous,
Pour une base MySql,
Mon problème est simple. Il s'agit pour un site de chroniques de disques de musique écrit en PHP de stocker l'Id de plusieurs artistes ayant participé à un même disque.
La base contient actuellement deux tables.
TABLE CHRONIQUES
CHAMP IdChronique (int) INDEX
CHAMP IdGroupe (int)
CHAMP NomChronique (varchar)Si un seul groupe G a participé au disque chroniqué D alors c'est très simple, il suffit d'aller rechercher le NomGroupe dans la table GROUPES où CHRONIQUES.IdGroupe=GROUPES.IdGroupeTABLE GROUPES
CHAMP IdGroupe (int) INDEX
CHAMP NomGroupe (int)
Maintenant mettons que plusieurs groupes G1, G2 et G3 aient participé au disque D (dans le cas d'une compilation par exemple).
J'hésite entre plusieurs façons de faire :
SOLUTION 1 : CONCATÉNER DANS UN MÊME CHAMP PUIS DEPUIS LA PAGE PHP UTILISER EXPLODE()
a) Je modifie le champ CHRONIQUES.IdGroupe en VARCHAR
b) Je concatène les différentes valeurs de IdGroupe dans le champ CHRONIQUES.IdGroupe sous la forme IdGroupe1;IdGroupe2
c) Depuis ma page php, j'utilise une fonction explode(";",$xxxx) puis je relance une requête dans la table GROUPES pour retrouver à quel NomGroupe correspondent les différentes valeurs contenues dans le champ CHRONIQUES.IdGroupe.SOLUTION 2 : CRÉER UNE TROISIÈME TABLE INTERMÉDIAIRE
a) Je supprime le champ IdGroupe de la table CHRONIQUES
b) Je créée une nouvelle table dans ma base:
c) Pour chaque IdGroupe qui aurait du être initialement stockée dans le champ CHRONIQUES.IdGroupe je créée un nouvel enregistrement dans la table ASSOC_GROUPES_CHRONIQUES (IdGroupe,IdChronique)ASSOC_GROUPES_CHRONIQUES
CHAMP IdGroupe (int)
CHAMP IdChronique (int)
Par exemple si trois groupes G1, G2, G3 ont participé au même disque chroniqué D je stockerai trois enregistrements différents dans ma table ASSOC_GROUPES_CHRONIQUES (IdGroupe,IdChronique) :
- enr1 : (G1, D)
- enr1 : (G2, D)
- enr1 : (G3, D)
d) Pour chaque chronique D j'irai donc rechercher dans la table ASSOC_GROUPES_CHRONIQUES la valeur de IdGroupe partout où ASSOC_GROUPES_CHRONIQUES.IdChronique=D.
e) Puis pour chacune des valeurs IdGroupe retournées je lance une nouvelle requête pour retrouver le NomGroupe dans la table GROUPES où ASSOC_GROUPES_CHRONIQUES.IdGroupe=GROUPES.IdGroupeJe ne sais pas quelle est la solution la moindre lourde aussi bien au niveau du stockage qu'au niveau du script PHP et du nb de requêtes utilisées.SOLUTION 3 : JE CRÉÉE UN IDGROUPE D'EXCEPTION DANS LA TABLE CHRONIQUES
a) J'assigne la valeur 0 à CHRONIQUES.IdGroupe pour tous les disques où plusieurs groupes G1, G2, G3 apparaissent, et je donne une valeur IdGroupe normale pour tous les enregistrements avec un seul groupe.
b) Si lors de la requête CHRONIQUES.IdGroupe != 0, c'est qu'il n'y a qu'un seul groupe je procède normalement
c) Si lors de la requête CHRONIQUES.IdGroupe = 0, c'est qu'il y a plusieurs groupes, alors je réutilise ma table ASSOC_GROUPES_CHRONIQUES et je procède comme dans la solution 2 pour retrouver les valeurs correspondantes
À moins qu'il y ait encore une solution plus simple ?
Pour information actuellement sur environ 700 enregistrements le nombre de cas où plusieurs groupes apparaissent sur la même chronique de disque ne dépasse pas une 20aine donc ce genre de cas relève plutôt de l'exception que de la règle générale. Je cherche à optimiser le stockage et le script des pages surtout dans cette optique.
De plus comment le cas échéant indexer correctement ma table ASSOC_GROUPES_CHRONIQUES ?
J'espère avoir été clair dans mes explications :-)
Merci d'avance,
Cordialement
Partager