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

Schéma Discussion :

Comment éviter la relation N:M ? [MCD]


Sujet :

Schéma

  1. #1
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    Bonsoir,
    Je possède deux table:
    maintenances (idmaint,date_entree,date_sortie,cout)
    types_maintenance (idtype,type)

    La relation entre ces deux tables est comme suit :
    (maintenances)---1,n---<correspondre>---1,n---(types_maintenance)

    Sachant que les types de maintenances sont : mécanique, électricité ,peinture et tôlerie, entretien.

    Ma question est comment peut on éviter la relation n:m dans un cas pareil ?

    Il est évident que la traduction en MLD nous donne une troisième table (table de jonction) mais cette solution implique la gestion de cette table supplémentaire plus le risque de l'incohérence de donnée.

    Il y a aussi la possibilité de supprimer la table 'type_maintenances' et intégrer le champ 'type' dans la table maintenance mais cela provoquerais malheureusement une redondance de donnée.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par adelneo Voir le message
    Il y a aussi la possibilité de supprimer la table 'type_maintenances' et intégrer le champ 'type' dans la table maintenance mais cela provoquerais malheureusement une redondance de donnée.
    Tu peux utiliser une table : maintenances (idmaint,idtype,date_entree,date_sortie,cout)
    pour éviter la redondance mais dans ce cas tu as une relation 1:1 donc si c'est correcte fonctionnellement vas y sinon il te faut une 3eme table et d'après ce que tu disais ça à l'air d'être le cas.
    Citation Envoyé par adelneo Voir le message
    Il est évident que la traduction en MLD nous donne une troisième table (table de jonction) mais cette solution implique la gestion de cette table supplémentaire plus le risque de l'incohérence de donnée.
    Tu peux utiliser INNODB comme moteur de stockage ce qui te permettra d'implémenter l'intégrité référentielle aka FOREIGN KEY, avec en prime la gestion des transactions

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par adelneo Voir le message
    maintenances (idmaint,date_entree,date_sortie,cout)
    types_maintenance (idtype,type)

    La relation entre ces deux tables est comme suit :
    (maintenances)---1,n---<correspondre>---1,n---(types_maintenance)
    Ce morceau de MCD correspond à la règle de gestion suivante :
    " À une maintenance correspond de 1 à plusieurs types de maintenance et à un type de maintenance correspond de 1 à plusieurs maintenances. "

    Si cette règle de gestion traduit bien le besoin réel, alors la table associative est inévitable.
    Si la règle de gestion est fausse et qu'elle s'écrit plutôt comme ceci :
    " À une maintenance correspond 1 seul type de maintenance et à un type de maintenance correspond de 1 à plusieurs maintenances. "

    Alors le MCD devient celui-ci :
    (maintenances)---1,1---<correspondre>---1,n---(types_maintenance)

    Et la conséquence est que l'identifiant du type de maintenance devient clé étrangère dans la table des maintenances.

    À toi de savoir quelle règle de gestion est la bonne. Ce sont les règles de gestion ainsi exprimées qui commandent la modélisation et pas l'inverse !

    Sachant que les types de maintenances sont : mécanique, électricité ,peinture et tôlerie, entretien.

    Ma question est comment peut on éviter la relation n:m dans un cas pareil ?
    Pourquoi veux-tu donc l'éviter ? Ce n'est pas bien compliqué à mettre en oeuvre !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut merci pour tout le monde
    Au fait la bonne règle de gestion dans mon cas est :" À une maintenance correspond de 1 à plusieurs types de maintenance et à un type de maintenance correspond de 1 à plusieurs maintenances. "
    Donc je vois que l'utilisation de table de jonction est inévitable.
    C'est pas compliquer de mettre en œuvre la relation N:M dans mon cas au niveau du SGBD (J'utilise MySQL actuellement), ce qui me pose problème c'est que je doit impérativement remplir manuellement les champs de la table de jonction (idmaintenance,idtype) car d'après mes connaissances les SGBD ne gèrent pas les relations N:M, donc je doit par programmation du coté applicatif gérer cette relation.
    question : y a t-il une possibilité de simplifier la gestion de ce type de relations par les SGBD ??

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO correspondre (crp_id_maintenance, crp_id_type)
    VALUES
    (
      (SELECT idmaint
      FROM maintenances
      WHERE date_entree = '2010-01-04'
        AND date_sortie = '2010-01-05'),
      (SELECT idtype
      FROM types_maintenances
      WHERE type = 'mécanique')
    )
    Tu trouves ça compliqué ?

    En plus tu n'auras peut-être même pas besoin des sous requêtes car j'imagine que dans l'appli qui enregistre les maintenances et leur type, tu peux récupérer :
    - les id des types de maintenance que tu affiches dans une liste déroulante ;
    - l'id de la maintenance qui vient d'être enregistrée (LAST_INSERT_ID qui est généralement implémenté dans les langages de programmation).

    Bref c'est vraiment standard de faire ce genre de truc.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut merci pour votre disponibilité
    je vais tester cette solution qui a l'aire d'être la meilleure.
    merci cinephil.

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

Discussions similaires

  1. Comment éviter la redondance dans une relation N:M
    Par adelneo dans le forum Requêtes
    Réponses: 6
    Dernier message: 02/01/2011, 21h18
  2. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 12h18
  3. [TEdit] Comment éviter le bip ?
    Par portu dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/10/2004, 12h01
  4. Réponses: 4
    Dernier message: 28/07/2004, 10h42
  5. [eclipse 2.1][compilation] Comment éviter...
    Par ftrifiro dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 16h16

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