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

Merise Discussion :

[MCD] difficulté sur une entité


Sujet :

Merise

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Points : 19
    Points
    19
    Par défaut [MCD] difficulté sur une entité
    Bonjour,

    J'essaye de modéliser une bibliothèque de compétitions (de tir à l'arc) et j'ai un petit doute sur une partie.

    La chose se présente de la manière suivante : on a plusieurs équipes qui participent à une compétition. Lors d'une compétition (id_compet, lieu, type, numero), une équipe (id_eq, nom) tire une épreuve de qualification qui donnera un score (score_qualif). Ensuite, et c'est là que je coince, une équipe, toujours pendant cette même compétition, tire plusieurs matchs contre d'autres équipes. Chacune aura un score pour ce match (score_match).

    Donc pour avoir le score de la qualification d'une équipe, la dépendance fonctionnelle sera : id_eq, id_compet -> score_qualif

    Jusque là tout vas bien, mais pour avoir le score des matchs je ne sais pas trop comment faire. Est ce qu'il faut que je crée une entité Match avec l'id des deux équipes et leur score ?
    Ca donnerait ça : Match = id_match, id_eq1, score1, id_eq2, score2
    Mais je ne suis pas convaincu. En faisant comme ça on aura une redondance, je crois, au niveau des équipes.

    Merci d'avance pour vos lumières,
    Olivier

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 112
    Points : 31 585
    Points
    31 585
    Billets dans le blog
    16
    Par défaut
    Bonjour Olivier,


    Si l’en-tête de l’entité-type MATCH est le suivant :
    {MatchId, EquipeVainqueur, EquipeVaincue, ScoreVainqueur, ScoreVaincu} ;

    A condition de mettre en œuvre la contrainte qui va bien (disons au moyen d’un trigger), vous pourriez interdire les redondances.

    S’il existe le tuple :

    C MATCH {MatchId, EquipeVainqueur, EquipeVaincue, ScoreVainqueur, ScoreVaincu}
             m1       e1               e2             s1              s2 
    C'est-à-dire s’il existe le triplet :
    <m1, e1, e2>
    Alors il ne peut exister les triplet :
    <m1, e2, e1>

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    Merci pour la réponse

    Finalement ça se résume à quelque chose d'aussi simple que ça ? (mcd en pièce jointe)

    Il me semblait que c'était pas terrible de lister plusieurs occurrences dans une entité et qu'au lieu de lister, il fallait mieux construire une entité et ajouter une relation. Du coup il faudrait ajouter une relation entre match et équipe
    Images attachées Images attachées  

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 112
    Points : 31 585
    Points
    31 585
    Billets dans le blog
    16
    Par défaut
    Bonsoir Olivier,


    Reprenons votre MCD :




    Dans un match, vous avez bien un vainqueur et un vaincu, mais comme vous l’évoquez, il faut associer les entités-types MATCH et EQUIPE, sinon il peut y avoir du dégât...

    Un diagramme d’occurrences (au format tabulaire) conforme à votre MCD est par exemple le suivant :

    EQUIPE                        COMPETITION
    id_eq    Nom                  id_comp    lieu    
        1    Graveson                   1    Papeete
        2    Plougastel                 2    Lille
        3    Colmar                     3    Brest
        4    Rennes 
        5    Toulouse 
    
                         PARTICIPE
                         id_comp     id_eq      score_qualif
                               1         1                50 
                               1         2                60 
                               1         3                50
                               1         4                70 
                               1         5                30 
                               2         1                80 
                               2         2                80 
                               2         3                60
                               2         4                50 
                               2         5                40
                               3         1                60 
                               3         2                50 
                               3         3                60 
                               3         5                70 
    
    MATCH
    Id_match    id_comp    idVainqueur    idVaincue    ScoreVainqueur    ScoreVaincue
           1          1            314          123                70              60 

    Manifestement il y a un vainqueur et un vaincu, mais de quelles équipes s’agit-il donc ?

    Les équipes participant aux matchs doivent non seulement être des équipes connues, mais en plus elles ont dû participer aux qualifications. Le MCD correspondant est malheureusement hors de la portée d’AnalyseSI et il est préférable de passer au plus tôt au MLD (réalisé ici avec MySQL Workbench) :




    A noter la prise en compte de la date de compétition.


    Passage à SQL :


    TABLE COMPETITION
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE COMPETITION
    (
            CompeteId         INT         NOT NULL
          , CompeteDate       DATE        NOT NULL
          , CompeteLieu       VARCHAR(45) NOT NULL
        , CONSTRAINT COMPETITION_PK PRIMARY KEY (CompeteId)
    ) ;

    TABLE EQUIPE
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE EQUIPE
    (
            EquipeId          INT         NOT NULL
          , EquipeNom         VARCHAR(45) NOT NULL
        , CONSTRAINT EQUIPE_PK PRIMARY KEY (EquipeId)
    ) ;

    TABLE QUALIFICATION
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE QUALIFICATION 
    (   
            CompeteId         INT         NOT NULL
          , EquipeId          INT         NOT NULL
          , ScoreQualif       INT         NOT NULL
        , CONSTRAINT QUALIFICATION_PK PRIMARY KEY (CompeteId, EquipeId)
        , CONSTRAINT QUALIFICATION_COMPETITION_FK FOREIGN KEY (CompeteId) REFERENCES COMPETITION
        , CONSTRAINT QUALIFICATION_EQUIPE_FK FOREIGN KEY (EquipeId) REFERENCES EQUIPE
    ) ;

    TABLE MATCH (noter la contrainte MATCH_QUALIFICATION_CK1)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE MATCH 
    (
            CompeteId         INT         NOT NULL
          , EquipeVainqueurId INT         NOT NULL
          , EquipeVaincue     INT         NOT NULL
          , ScoreVainqueur    INT         NOT NULL
          , ScoreVaincu       INT         NOT NULL
        , CONSTRAINT MATCH_PK PRIMARY KEY (CompeteId, EquipeVainqueurId, EquipeVaincue)
        , CONSTRAINT MATCH_QUALIFICATION_FK1 FOREIGN KEY (CompeteId, EquipeVainqueurId) REFERENCES QUALIFICATION
        , CONSTRAINT MATCH_QUALIFICATION_FK2 FOREIGN KEY (CompeteId, EquipeVaincue) REFERENCES QUALIFICATION
        , CONSTRAINT MATCH_QUALIFICATION_CK1 CHECK (ScoreVainqueur > ScoreVaincu) 
    ) ;

    L’élimination de la redondance évoquée dans nos premiers messages est assurée en contrôlant par trigger (MS SQL Server dans cet exemple) qu’un tuple parasite ne provoque pas une permutation des rôles :

    Code SQL : 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
    CREATE TRIGGER R_TRIGGER_INSERT ON MATCH INSTEAD OF INSERT, UPDATE AS
           DECLARE @N AS INT
     
    SET @N = (
              SELECT COUNT(*) 
              FROM   
                 (
                  SELECT CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu
                  FROM   INSERTED
                 UNION   
                  SELECT CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu
                  FROM   MATCH
                 ) AS x
                 JOIN INSERTED AS y ON x.CompeteId = y.CompeteId 
                      AND x.EquipeVainqueurId = y.EquipeVaincue
                      AND x.EquipeVaincue = y.EquipeVainqueurId
             ) ;
    IF @N > 0 
        BEGIN
            RAISERROR ('Permutation des rôles interdite...',15,1) 
        END
    ELSE
        BEGIN
            INSERT INTO MATCH (CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu)
                SELECT CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu 
                FROM   INSERTED
        END
    ;


    Un début de jeu d’essai :

    Code SQL : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    INSERT INTO COMPETITION (CompeteId, CompeteDate, CompeteLieu) VALUES (1, '2011-08-09', 'Papeete') ;
    INSERT INTO COMPETITION (CompeteId, CompeteDate, CompeteLieu) VALUES (2, '2012-07-14', 'Lille') ;
    INSERT INTO COMPETITION (CompeteId, CompeteDate, CompeteLieu) VALUES (3, '2013-09-12', 'Brest') ;
     
    SELECT '' AS COMPETITION, * FROM COMPETITION ;
     
    INSERT INTO EQUIPE (EquipeId, EquipeNom) VALUES (1, 'Graveson') ;
    INSERT INTO EQUIPE (EquipeId, EquipeNom) VALUES (2, 'Plougastel') ;
    INSERT INTO EQUIPE (EquipeId, EquipeNom) VALUES (3, 'Colmar') ;
    INSERT INTO EQUIPE (EquipeId, EquipeNom) VALUES (4, 'Rennes') ;
    INSERT INTO EQUIPE (EquipeId, EquipeNom) VALUES (5, 'Toulouse') ;
     
    SELECT '' AS EQUIPE, * FROM EQUIPE ;
     
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (1, 1, 50) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (1, 2, 60) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (1, 3, 50) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (1, 4, 70) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (1, 5, 30) ;
     
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (2, 1, 80) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (2, 2, 80) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (2, 3, 60) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (2, 4, 50) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (2, 5, 40) ;
     
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (3, 1, 60) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (3, 2, 50) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (3, 3, 60) ;
    INSERT INTO QUALIFICATION (CompeteId, EquipeId, ScoreQualif) VALUES (3, 5, 70) ;
     
    SELECT '' AS QUALIFICATION, * FROM QUALIFICATION ;
     
    INSERT INTO MATCH (CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu) VALUES (1, 2, 1, 80, 50) ;
    INSERT INTO MATCH (CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu) VALUES (1, 2, 3, 70, 60) ;
    INSERT INTO MATCH (CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu) VALUES (1, 3, 1, 60, 50) ;
     
    INSERT INTO MATCH (CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu) VALUES (2, 2, 1, 70, 60) ;
    INSERT INTO MATCH (CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu) VALUES (2, 2, 3, 60, 50) ;
    INSERT INTO MATCH (CompeteId, EquipeVainqueurId, EquipeVaincue, ScoreVainqueur, ScoreVaincu) VALUES (2, 3, 2, 50, 40) ; -- viol contraint !!!
     
    SELECT '' AS MATCH, * FROM MATCH ;


    Citation Envoyé par olivier.a Voir le message
    J'essaye de modéliser une bibliothèque de compétitions (de tir à l'arc)
    I understand (de tir à l'arc)

    Ça n'est pas fameux, mais bon, il y a pire...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Après avoir passé l'après midi à m'emmêler les pinceaux, ça y est tout est rentré dans l'ordre

    Merci beaucoup pour cette réponse très détaillée.

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

Discussions similaires

  1. Difficulté sur une requete
    Par dondano dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 27/02/2008, 20h49
  2. Difficulté sur une jointure(?)
    Par qi130 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/09/2007, 18h35
  3. [MCD] Utilité d'une entité "Adresse" dans mon MCD ?
    Par korrigan dans le forum Schéma
    Réponses: 1
    Dernier message: 05/09/2007, 11h41
  4. Réponses: 10
    Dernier message: 12/07/2006, 13h00
  5. [MCD]Faut-il une Entité Date ?
    Par Francis dans le forum Schéma
    Réponses: 2
    Dernier message: 17/01/2005, 18h48

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