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

UML Discussion :

Transformer une relation 1 1 en modèle MLD


Sujet :

UML

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 100
    Points : 66
    Points
    66
    Par défaut Transformer une relation 1 1 en modèle MLD
    Salut,

    Voici les règles de gestion que je doit les respecter.
    Les types de profils existants dans le système sont:
    • Opérateur par niveau.
    • Utilisateur simple.

    Les profils utilisateurs sont répartis dans des groupes. Un groupe peut contenir plusieurs profils d'utilisateurs.
    Un utilisateur simple sélectionne un opérateur d'un groupe pour lui assigner la tâche de résolution d'un incident.Une tâche ne peut être assignée qu'à un seul groupe et un seul opérateur de ce groupe.Alors qu'un opérateur d'un groupe peut avoir plusieurs tâches affectées à lui. Un incident ne peut déclencher qu'une seule tâche. Et chaque tâche est relative à un seul incident.
    Voici le diagramme de classe que j'ai fait:



    Comment la relation entre l'incident et la tâche peut être transformé en modèle MLD. S'il y a des erreurs dans la modélisation merci de m'aider à les corriger. Vraiment je me suis perdu

    Merci d'avance

  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 120
    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 120
    Points : 31 638
    Points
    31 638
    Billets dans le blog
    16
    Par défaut
    Bonsoir Wnejla,


    Selon votre diagramme, un incident ne peut pas exister dans la base de données sans qu’on lui ait d’abord affecté une tâche. En est-il toujours ainsi ? Autrement dit, quand on crée un incident, doit-on en même temps créer obligatoirement la tâche ?

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 100
    Points : 66
    Points
    66
    Par défaut
    Oui c'est ça, une création d'un incident déclenche automatiquement la création d'une tâche

  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 120
    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 120
    Points : 31 638
    Points
    31 638
    Billets dans le blog
    16
    Par défaut
    Bonsoir Wnejla,


    Résumons ainsi la situation :



    On a droit à une bijection. La dérivation en MLD proposée par les AGL est la suivante :




    Où il apparaît clairement que la bijection peut provoquer une angoisse d’ordre métaphysique : on est désormais confronté au problème de l’œuf et de la poule, on est en présence d’un cycle...

    La table INCIDENT est dotée d’une clé primaire {IncidentId} (symbolisée par le mickey <pk>) et d’une clé alternative {TacheId} (symbolisée par le mickey <ak>), avec en plus une contrainte référentielle par rapport à la table TACHE, symbolisée par le mickey <fk>. Ce qui vaut pour la table INCIDENT vaut évidemment pour la table TACHE, mutatis mutandis.

    Si on utilise un SGBD conforme à la théorie relationnelle (voyez An Introduction to Relational Database Theory de Hugh Darwen, ouvrage clair, rigoureux et en plus gratuit ), le code qui découle du MLD est le suivant :

    Variable relationnelle INCIDENT
    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    VAR INCIDENT BASE RELATION
        {
            IncidentId           INTEGER
          , TacheId              INTEGER
          , Intitule             CHAR
        }
        KEY {IncidentId}
        KEY {TacheId}
        FOREIGN KEY {TacheId} REFERENCES TACHE

    Variable relationnelle TACHE
    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    VAR TACHE BASE RELATION
        {
            TacheId              INTEGER
          , IncidentId           INTEGER
          , Description          CHAR
        }
        KEY {TacheId}
        KEY {IncidentId}
        FOREIGN KEY {IncidentId} REFERENCES INCIDENT ;

    Pour associer simultanément une tâche et un incident, on procède par affectation multiple :

    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INCIDENT RELATION {
                              TUPLE {IncidentId   123,
                                     TacheId      314,
                                     Intitule     'Vol du fétiche arumbaya'}
                             } ,
     
    INSERT TACHE RELATION {
                           TUPLE {TacheId      314,
                                  IncidentId   123,
                                  Description  'Envoyer Tintin enquêter'}
                          } ;

    Les deux inserts font partie de la même instruction, ils y sont simplement séparés par une virgule. La fin de l’instruction est marquée par un point-virgule. Les contraintes d’intégrité ne sont vérifiées qu’à des frontières de points-virgules : en l’occurrence tout se passera donc bien.

    Mais comme dit Chris Date, les contraintes référentielles mises en place (cf. les clauses FOREIGN KEY ci-dessus) ne permettent pas de tout contrôler. En effet, elles n’interdisent pas la situation suivante :

    INCIDENT                               TACHE
    +------------+---------+             +---------+------------+
    | IncidentId | TacheId |             | TacheId | IncidentId |
    |------------+---------|             |---------+------------|
    |        123 |     314 |             |     314 |        456 |
    |        456 |     271 |             |     271 |        123 |
    +------------+---------+             +---------+------------+
    
    
    Pour garantir l'intégrité, il faut et il suffit de mettre en œuvre la contrainte suivante :

    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CONSTRAINT INCIDENT_TACHE_CHK01
        INCIDENT {IncidentId, TacheId} = TACHE {IncidentId, TacheId} ;

    Ce qui se lit : La projection de la variable INCIDENT sur les attributs IncidentId et TacheId doit être égale à la projection de la variable TACHE sur ces mêmes attributs.

    Suite à cela, les clés étrangères deviennent de facto inutiles et on les supprime.


    Cas de SQL

    Si l’on utilise un SGBD SQL (car je suppose qu’à terme c’est bien le Sorry Query Language qui sera utilisé) :

    TABLE INCIDENT
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE INCIDENT 
        (
            IncidentId           INT                  NOT NULL
          , TacheId              INT                  NOT NULL
          , Intitule             VARCHAR(64)          NOT NULL
        , CONSTRAINT INCIDENT_PK PRIMARY KEY (IncidentId)
        , CONSTRAINT INCIDENT_AK UNIQUE (TacheId)
    ) ;

    TABLE TACHE
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE TACHE 
    (
            TacheId              INT                  NOT NULL
          , IncidentId           INT                  NOT NULL
          , Description          VARCHAR(64)          NOT NULL
        , CONSTRAINT TACHE_PK PRIMARY KEY (TacheId)
        , CONSTRAINT TACHE_AK UNIQUE (IncidentId)
    ) ;

    Contraintes référentielles :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ALTER TABLE TACHE 
        ADD CONSTRAINT TACHE_INCIDENT_FK FOREIGN KEY (IncidentId) REFERENCES INCIDENT
     ;
     
    ALTER TABLE INCIDENT 
        ADD CONSTRAINT INCIDENT_TACHE_FK FOREIGN KEY (TacheId) REFERENCES TACHE
     ;

    Gros problème : avec SQL, on ne dispose pas de l’affectation multiple, ce qui est singulièrement gênant car suite à une tentative d’INSERT dans une des deux tables, le SGBD rejettera l’opération du fait du déclenchement immédiat des contraintes référentielles (la norme SQL et Oracle permettent un déclenchement différé, mais sous le contrôle de l'applicatif, ce qui n'est pas totalement satisfaisant).

    Une solution consiste à ne pas mettre en œuvre ces contraintes, mais comme il ne faut pas faire de trapèze volant sans filet, pour garantir à la fois la bijection et l'intégrité on imposera par exemple la mise à jour des tables via une vue de jointure (avec la suppression donc des droits de mise à jour en direct des tables), un trigger se chargeant de ventiler les données dans les tables INCIDENT et TACHE :

    La vue :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE VIEW INCIDENT_TACHE (IncidentId, TacheId, Intitule, Description) AS 
        SELECT x.IncidentId, x.TacheId, x.Intitule, y.Description
        FROM   INCIDENT AS x JOIN TACHE AS y ON x.IncidentId = y.IncidentId ;
    Le trigger (MS SQL Server) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TRIGGER INCIDENT_TACHE_INSERT_TR ON INCIDENT_TACHE INSTEAD OF INSERT AS
     
    INSERT INTO INCIDENT (IncidentId, TacheId, Intitule)
           SELECT IncidentId, TacheId, Intitule
           FROM   INSERTED ;
     
    INSERT INTO TACHE (IncidentId, TacheId, Description)
           SELECT IncidentId, TacheId, Description
           FROM   INSERTED ;

    Un bout de jeu d’essai :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO INCIDENT_TACHE (IncidentId, TacheId, Intitule, Description)
        VALUES (123, 314, 'Vol du fétiche arumbaya', 'Envoyer Tintin enquêter') ;
     
    INSERT INTO INCIDENT_TACHE (IncidentId, TacheId, Intitule, Description)
        VALUES (456, 271, 'On a perdu le nord', 'Envoyer Black & White') ;

    Au résultat :

    INCIDENT
    IncidentId    TacheId    Intitule
    ----------    -------    -----------------------
           123        314    Vol du fétiche arumbaya
           456        271    On a perdu le nord 
    TACHE
    TacheId    IncidentId    Description
    -------    ----------    ------------------------
        314           123    Envoyer Tintin enquêter 
        271           456    Envoyer Black & White 
    Si votre SGBD ne permet pas de mettre à jour les vues de jointure par trigger (cas de MySQL), il faudra garantir la bijection applicativement (avec les risques que cela comporte), ou bien affaiblir la contrainte et se résoudre à une injection :
    [INCIDENT]--1----------0..1--[TACHE]

    Reste la méthode expéditive qui consiste à fondre les deux tables INCIDENT et TACHE en une seule, mais c’est pour le moins simpliste, inélégant, choquant et brutal...

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 100
    Points : 66
    Points
    66
    Par défaut
    c'est génial , merci beaucoup

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

Discussions similaires

  1. transformer une relation ternaire en MLD
    Par Wnejla dans le forum UML
    Réponses: 4
    Dernier message: 28/05/2013, 14h33
  2. MLD - Création d'une relation - Nommage
    Par legoman dans le forum PowerAMC
    Réponses: 2
    Dernier message: 11/01/2013, 17h45
  3. Quel modèle décisionnel pour une relation n-n ?
    Par tinwul dans le forum Conception/Modélisation
    Réponses: 5
    Dernier message: 04/10/2010, 16h54
  4. [mld]Définition d'une relation
    Par new_wave dans le forum Schéma
    Réponses: 4
    Dernier message: 09/11/2007, 01h17
  5. Transformer une ligne en polygone
    Par bl4d3 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/09/2003, 10h35

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