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

Symfony PHP Discussion :

relation n:n ou 3 tables avec relations 0:n ? [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut relation n:n ou 3 tables avec relations 0:n ?
    Bonjour,

    Tout d'abord, j'espère que je poste au bon endroit, puisque ma question touche beaucoup à Doctrine, mais pas uniquement.

    Je travaille sur une application qui permet de gérer
    - des clubs de sport,
    - des catégories d'équipes (D1, D2, etc.)
    - et une relation n:n entre les clubs et les catégories d'équipes, correspondant à peu près à des équipes, sachant qu'il peut y avoir plusieurs équipes par catégorie et pour un club.

    Pour l'exemple, les tables club et equipe sont composées de 2 champs id et name chacune, et la table equipe contient les champs club_id (clé primaire), categorie_id (clé primaire) et nombre (voir le modèle de données en pièce jointe).

    Voici le schema.yml correspondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Club:
      columns:
        id:             { type: integer(4), unsigned: true, primary: true, autoincrement: true }
        name:           { type: string(100), notnull: true, unique: true }
     
    Categorie:
      columns:
        id:             { type: integer(4), unsigned: true, primary: true, autoincrement: true }
        name:           { type: string(100), notnull: true, unique: true }
      relations:
        Club:
          foreignAlias: Categories
          class: Club
          refClass: Equipe
     
    Equipe:
      actAs:
        Sluggable:
          fields:       [ club_id, categorie_id ]
      columns:
        club_id:        { type: integer(4), unsigned: true, primary: true }
        categorie_id:   { type: integer(4), unsigned: true, primary: true }
        nombre:         { type: integer(2), unsigned: true, default: 1 }
      relations:
        Club:
          foreignAlias: Equipes
        Categorie:
          foreignAlias: Equipes
    Ça fait quelques jours que je parcours les forums et la documentation de symfony pour comprendre comment valider le formulaire d'ajout d'équipes, et je suis tombé sur cette remarque de Michel Rotta sur les relations n:n avec doctrine :

    La table de jointure ne peut comporter que deux champs, le champs : idLiensnomenclature est en trop. La clefs unique doit être constituée par les deux champs de liaison (on ne peut avoir deux liaisons A1 vers B1... cette liaison doit être unique, d'où la clef).
    Donc dans mon cas, faut-il que je créée une table equipe avec son propre id et deux relations 0,n vers les tables club et categorie ?

    Un avis, un lien qui m'aurait échappé ?

    Merci !

    Eric
    Images attachées Images attachées  

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Faire des relations avec Doctrine n-n entre des tables ayant des clés multiples est effectivement impossible.

    En outre, ton modèle me semble curieux. Peut-être des détails fonctionnels m'échappent-ils mais définir une équipe avec comme clé : club_id / categorie_id me laisse perplexe. Cela signifie que dès qu'une équipe change de catégorie, elle change d'identifiant (sa clé primaire change) donc tous les liens pointant vers elle cessent d'être valides. La maintenance et le codage vont être acrobatiques...

    A moins d'avoir une forte raison fonctionnelle pour construire ton modèle ainsi, je mettrais un id classique à la table équipe et deux clés étrangères club_id + categorie_id pointant vers le club de rattachement de l'équipe et la catégorie à laquelle appartient l'équipe. Et le n-n club-catégorie apparait naturellement avec la médiation de la table Equipe.

    Non ?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut
    Bonjour Herode,

    Merci de ta réponse.

    La table Equipe est en fait la table de relation entre les clubs et les catégories, à ceci près qu'il y a le champ nombre en plus. Il ne s'agit donc pas d'objets Equipe, les équipes ne sont pas nominatives, il s'agit juste connaître leur présence et de les compter, ce qui fait que si une équipe change de catégorie, le nombre est incrémenté dans sa nouvelle catégorie et décrémenté dans l'ancienne.

    Je crois que je vais devoir suivre ta recommandation, parce que ma solution m'oblige à des contorsions que je ne maîtrise pas.

    J'essaie et si ça fonctionne, je repasserai pour passer le message en [Résolu].

    Éric

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut
    Bonjour,

    En effet, en passant les categorie_id et club_id en clés étrangères et en remettant une clé primaire sur la table équipe, ça évite pas mal de soucis.

    Ceci-dit, je ne comprends pas bien cette limite.

    Bonne journée à tous et encore merci Hérode !

    Éric

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Ce n'est pas un problème doctrine 1 mais un problème d'analyse.

    La table équipe n'est pas une table de jointure mais une entité à part entière, la table catégories est un argument de la table équipe.

    Tu as une liaison n-1 entre club et équipe (un club peut avoir plusieurs équipe, une équipe appartiens toujours à un club) et un argument en liaison 1-n entre équipe et catégorie (une équipe à une catégorie et une catégorie peut être affectée à plusieurs équipes).

    Sur le plan purement relationnel on pourrait voir une liaison entre club et catégorie, mais les entités sont club et équipe, catégorie n'est qu'un qualifiant de l'équipe.

    CQFD

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut
    Bonjour Michel,

    Merci pour ta réponse.

    Tu as une liaison n-1 entre club et équipe (un club peut avoir plusieurs équipe, une équipe appartiens toujours à un club) et un argument en liaison 1-n entre équipe et catégorie (une équipe à une catégorie et une catégorie peut être affectée à plusieurs équipes).
    Je crois que c'est un peu différent dans mon cas, puisque la table des équipes représente un nombre d'équipes par catégorie et par club. Il ne peut y avoir qu'une occurrence d'équipe par club et par catégorie. Une catégorie ne peut être affectée qu'à une occurrence d'équipe par club.

    J'ai fait ce schéma parce que mon client ne souhaite pas enregistrer chaque équipe de chaque club, mais seulement les compter.

    Merci et bonne journée !

    Éric

  7. #7
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Avec ces informations supplémentaire, c'est, en effet, un peu différent.

    Tu as donc club et catégories comme entité et le nombre d'équipe en argument de la liaison n-n.

    Ton seul problème est que doctrine ne sait pas gérer les relations n-n avec un argument.

    Il faut donc les considérer comme deux relations 1-n.

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut
    Bonjour Michel,

    C'est ce que j'ai fini par faire. J'y ai juste perdu pas mal de temps, mais c'est la règle de l'apprentissage.

    Bonne journée et encore merci !

    Éric

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. formulaire sur tables avec relations
    Par cath2123 dans le forum IHM
    Réponses: 1
    Dernier message: 13/04/2009, 02h15
  2. [EJB3 Entity] Insérer 2 tables avec relation à partir d'un EJB
    Par Mister Nono dans le forum Java EE
    Réponses: 2
    Dernier message: 23/12/2008, 18h34
  3. [Requête] 2 tables avec relations un à plusieurs
    Par egg3774 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 02/05/2007, 14h42
  4. [MySQL] mysql_fetch_assoc pour 2 tables avec relation 1-1
    Par jiojioforever dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/01/2007, 09h41
  5. Requête avec relation N-N (entre 3 tables)
    Par vynce dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/12/2005, 10h34

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