IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Plusieurs données concatenées dans un même champ ou une table supplémentaire?


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut Plusieurs données concatenées dans un même champ ou une table supplémentaire?
    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)
    TABLE GROUPES
    CHAMP IdGroupe (int) INDEX
    CHAMP NomGroupe (int)
    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 GROUPESCHRONIQUES.IdGroupe=GROUPES.IdGroupe

    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:
    ASSOC_GROUPES_CHRONIQUES
    CHAMP IdGroupe (int)
    CHAMP IdChronique (int)
    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)
    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 GROUPESASSOC_GROUPES_CHRONIQUES.IdGroupe=GROUPES.IdGroupe
    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
    Je 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.

    À 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

  2. #2
    Membre chevronné Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Par défaut
    Bonjour,

    A mon avis, la solution 2.

    D'abord parce que c'est la plus propre. C'est comme ca que fonctionne SQL. C'est fait pour traiter ce genre de structure.
    En plus, 20 cas pour 700 enregistrements, ça n'est pas une exception.

    Gillou.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut
    Bonjour et merci pour la réponse ^^

    Est-ce que justement, la solution 2 ne risque pas d'être trop inutilement coûteuse en espace dans la base de données par rapport à la solution 3 ?

    Car si elle est certes plus propre, elle implique de fait 700 enregistrements supplémentaires + au minimum 20 enregistrements en plus dans une nouvelle table dans la base.
    Contre seulement une 20aine d'enregistrement en plus pour la solution 3, et une condition + une requête éventuelle supplémentaire dans le script PHP.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/01/2012, 14h55
  2. Réponses: 3
    Dernier message: 23/03/2010, 17h55
  3. [MySQL] concaténation plusieurs données même champs d'une table MYSQL
    Par creative69 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/07/2008, 17h58
  4. Requête avec plusieurs paramètres d'un même champ d'une table
    Par jb.julien dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/08/2007, 09h43
  5. Réponses: 16
    Dernier message: 19/07/2006, 00h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo