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 :

Dépendance circulaire [MCD]


Sujet :

Schéma

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut Dépendance circulaire
    Bonjour,
    J'essaie de modéliser des associations mais j'arrive à une dépendance circulaire.
    Mon professeur me disait tout le temps que ce n'est pas bien de faire comme cela. Cependant, je n'arrive pas à faire autrement.

    Je vous soumets mon problème pour confirmer que ce que j'ai fait est bon mais qu'il faudra faire attention (et me dire à quoi, svp) ou s'il y a une autre façon de le modéliser.

    Merci d'avance


    PS: Ce que je veux faire est sur l'image.
    A une classe de garantie j'associe 0 ou une formule.
    Une formule possède 0 ou n paramètres.
    A un paramètre, j'associe une valeur pour une classe de garantie donnée.
    Images attachées Images attachées  

  2. #2
    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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Pour commencer, je pense qu'il y a une erreur dans les cardinalités de l'association "renseigner".
    Si je lis le schéma, ça donne :
    Une classe de garantie peut être renseignée par un seul paramètre et un paramètre peut renseigner une seule classe de garantie.
    Or, le paramètre peut être possédé par plusieurs formules qui elles même peuvent être associées à plusieurs classes de garantie. Il y a donc une contradiction entre l'unicité du couple (paramètre, classe de garantie) et la multiplicité du triplet (paramètre, formule, classe de garantie).
    fsmrel exprimerait ça mieux que moi en algèbre relationnelle et en dépendances fonctionnelles mais bon, c'est l'idée.

    En fait, la valeur du paramètre dépend de la formule ET de la classe de garantie. Sans réfléchir de manière approfondie, je dirais que "renseigner" serait plutôt une asociation ternaire entre paramètre, formule et classe de garantie.

    Ainsi, le triplet est unique mais chaque entité peut participer plusieurs fois à l'association. Donc cardinalité 0,n sur toutes les branches.

    Du coup on peut peut-être supprimer aussi l'association "associer". Puisqu'il y a au maximum une formule par classe de garantie, on peut la retrouver par la ternaire.
    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 !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Tu as raison par rapport à mes cardinalités, elles étaient fausses. C'est bien du 0,n entre classe de garantie et paramètre.

    L'association ternaire peut être une solution mais ce qui me gêne c'est que l'on n'a plus la contrainte entre la formule et ses paramètres.
    Je ne sais pas si je suis claire.
    J'aimerais modéliser cette contrainte au sein de la base de données.

    L'association ternaire me permettra certes de paramètrer une classe de garantie avec sa formule et ses paramètres mais on pourra associer n'importe quel paramètre avec n'importe quelle formule.

    Pour parer ce problème, je te propose ce nouveau mcd si tu peux me dire ce que tu en penses.
    Images attachées Images attachées  

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Dans mon schéma, j'ai oublié de mettre "valeur" dans l'association posséder.

  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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    C'est vrai que comme ça ce n'est pas bon non plus puisque qu'une classe de garantie peut cette fois avoir plusieurs formules.

    Je pense qu'en fait il faut simplement transformer ton premier schéma en passant l'association "renseigner" en ternaire, la troisième branche allant vers Formule.
    Je crois qu'il est possible de représenter aussi dans le MCD une contrainte sous la forme d'un rond entre l'association "renseigner" et les deux autres associations, ce qui indique que les triplets de l'association "renseigner" doivent être cohérents par rapport aux couples (classe de garantie, formule) et (formule, paramètre). Il me semble qu'il faut aussi un symbole dans le rond mais je ne sais plus lequel.

    Mon modeleur, Open ModelSphere, n'a pas cette possibilité mais je crois que Power AMC peut le faire. Peut-être d'autres.

    EDIT : J'ai trouvé un exemple dans la FAQ qui ressemble à ton cas.

    Dans cet exemple, un client peut réserver un article à un dépôt à condition que l'article soit stocké dans le dépôt.
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    J'étudie tout ça et te tiens au courant pour la solution que j'adopte mais en tout cas tu as super bien compris mon soucis et en parle même mieux que moi :p
    A très vite

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Après réflexion, ta solution me semble convenir.
    Je n'ai pas bien compris comment implémenter l'idée du rond d'inclusion, d'exclusion ou autre.
    Mais en cherchant un peu, on peut spécifier cette règle à l'aide d'une phrase. Même si c'est moins visuel.

    Par contre, pour l'implémentation de cette contrainte finalement, je vais récupérer l'identifiant de la formule au sein de l'entité classe de garantie (avec une clé étrangère) et en not null.

    Pour l'association de la formule et de ses paramètres, on crée une nouvelle entité qui a pour clé primaire : 2 clés étrangères (identifiant de la formule et identifiant du paramètre).

    Enfin, pour ajouter une contrainte entre l'association ternaire et les 2 couples d'association, on utilise des triggers????

    J'ai joint la nouvelle modélisation. Peut être que ça pourra aider d'autres personnes.
    Images attachées Images attachées  

  8. #8
    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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par javass Voir le message
    Par contre, pour l'implémentation de cette contrainte finalement, je vais récupérer l'identifiant de la formule au sein de l'entité classe de garantie (avec une clé étrangère) et en not null.
    Je ne sais pas si c'est très "normatif" de faire comme ça mais ça peut le faire puisque effectivement ça impose le fait que le couple (id_formule, id_cl_garantie) existe dans la table Cl_Garantie.
    Ceci dit, si tu utilises un générateur automatique à partir de ton schéma, il ne fera sûrement pas comme ça.

    Pour l'association de la formule et de ses paramètres, on crée une nouvelle entité qui a pour clé primaire : 2 clés étrangères (identifiant de la formule et identifiant du paramètre).
    Non ! 3 clés étrangères : identifiant de la formule, du paramètre et de la classe de garantie. C'est une ternaire donc clé primaire triple.

    Enfin, pour ajouter une contrainte entre l'association ternaire et les 2 couples d'association, on utilise des triggers????
    Je pense que oui. Sinon par le logiciel.
    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 !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Par contre, pour l'implémentation de cette contrainte finalement, je vais récupérer l'identifiant de la formule au sein de l'entité classe de garantie (avec une clé étrangère) et en not null.
    Je ne sais pas si c'est très "normatif" de faire comme ça mais ça peut le faire puisque effectivement ça impose le fait que le couple (id_formule, id_cl_garantie) existe dans la table Cl_Garantie.
    Ceci dit, si tu utilises un générateur automatique à partir de ton schéma, il ne fera sûrement pas comme ça.
    Par curiosité tu l'aurais fait comment? Moi je fais pas trop confiance aux générateurs automatiques... J'utilise AMC designor qui est un peu obsolète... Je pense qu'un logiciel comme Windesign doit être fiable de ce point de vue là mais bon on fait avec les moyens du bord.


    Envoyé par javass
    Citation:
    Pour l'association de la formule et de ses paramètres, on crée une nouvelle entité qui a pour clé primaire : 2 clés étrangères (identifiant de la formule et identifiant du paramètre).
    Non ! 3 clés étrangères : identifiant de la formule, du paramètre et de la classe de garantie. C'est une ternaire donc clé primaire triple.
    Oui je suis d'accord pour la ternaire mais moi je parlais de l'association entre la formule et ses paramètres.

    Enfin, pour ajouter une contrainte entre l'association ternaire et les 2 couples d'association, on utilise des triggers????
    Je pense que oui. Sinon par le logiciel.
    Ok. La philosophie du logiciel est de contraindre le plus possible au niveau base de données. Ce qui je pense est un peu la philosophie générale donc je vais le tenter comme ça.

    En tout cas, merci beaucoup pour ton aide, ça m'a été très utile.

  10. #10
    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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par javass Voir le message
    Par curiosité tu l'aurais fait comment?
    Probablement avec des triggers mais avec une identification pure de la table associative de la ternaire : la clé primaire est composée des 3 clés en référence aux tables entrant en jeu dans l'association.

    Oui je suis d'accord pour la ternaire mais moi je parlais de l'association entre la formule et ses paramètres.
    Oups ! Au temps pour moi !

    Ok. La philosophie du logiciel est de contraindre le plus possible au niveau base de données. Ce qui je pense est un peu la philosophie générale donc je vais le tenter comme ça.
    De ma petite expérience professionnelle dansle domaine des applications utilisant une base de données et de ce que j'ai pu lire ici ou là et notamment sur ce forum, beaucoup de développeurs, sinon la plupart, connaissent très peu la richesse fonctionnelle des SGBD et codent les contraintes dans le logiciel au lieu de confier cette tâche au SGBD.

    En gros il y adeux solutions :
    1) Le logiciel paramètre une requête et gère un éventuel message d'erreur renvoyé par le SGBD à cause d'une contrainte non respectée.
    2) Le logiciel interoge le SGBD pour s'assurer que la contrainte sera respectée avant d'envoyer la requête d'insertion ou de mise à jour.

    Dans le premier cas il y a une seule transaction entre le SGBD et le logiciel ; dans le second cas il y en a au moins deux.

    Ca, c'est pour la théorie. Voyons maintenant la pratique...
    1) L'utilisateur veut créer une classe de garantie avec une formule existante.
    2) Le système lui propose la liste des formules existantes. ==> 1 requête pour récupérer la liste des formules.
    3) L'utilisateur choisit une formule.
    4) Le système lui demande les valeurs des paramètres prévus pour la formule ==> 1 requête pour récupérer les paramètres de la formule.
    5) L'utilisateur renseigne les valeurs et valide
    6) Le système ne peut alimenter que des valeurs de paramètres correspondant à la formule qui a été choisie pour la classe de garantie. Si ce n'est pas le cas, c'est qu'il y a un bug dans le logiciel. Le trigger qui vérifie la cohérence des données est alors inutile. disons que le trigger pourrait pister des bugs.
    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 !

  11. #11
    Membre chevronné
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 797
    Points : 2 060
    Points
    2 060
    Par défaut
    Bonjour,

    A mon avis vous faites fausse route sur cette modélisation. Le premier modèle est le plus correct. La seule incorrection présente (déjà signalée par CinePhil) est celle des cardinalités de l'association Renseigner.


    Pourquoi pas une ternaire [ClasseGarantie, Formule, Paramètre] ?

    Voyons l'exemple suivant :
    La Classe de Garantie C1 est liée à la Formule F2, laquelle comporte 3 Paramètres P1, P3 et P4. La ternaire Posséder contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ClasseGar   Formule   Paramètre
    ---------   -------   ---------
    C1          F2        P1
    C1          F2        P3
    C1          F2        P4
    Mais rien n'interdit l'insertion de triplets illégitimes comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ClasseGar   Formule   Paramètre
    ---------   -------   ---------
    C1          F1        P1        (a)
    C1          F2        P2        (b)
    C1          F1        P2        (c)
    (a) est interdit car C1 ne peut être liée qu'à une seule formule qui est F2
    (b) est interdit car le paramètre P2 ne fait pas partie de la formule F2
    (c) cumule les deux interdictions

    La non insertion de triplets contrevenant aux règles de gestion devra alors être garantie par logiciel ce qui induit un surcoût de développement et entraînera peut-être une dégradation des performances de l'applicatif comparé à la solution dans laquelle le SGBD garantit cette non insertion.


    Que manque-t-il au premier schéma ?

    La seule chose restant à garantir est que la liste des paramètres associés à une classe de garantie est bien celle attendue, à savoir qu'elle correspond à la liste des paramètres possédés par la formule à laquelle ladite classe de garantie est associée.

    En continuant avec l'exemple précédent, Renseigner doit contenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ClasseGar   Paramètre   Valeur
    ---------   ---------   ------
    C1          P1          17
    C1          P3          83
    C1          P4          25
    Pour cela on modélise une contrainte sémantique d'inclusion de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (Renseigner)----
                     \
                      (I)---->(Posséder)
                     /
      (Associer)----
    signifiant que, pour une classe de garantie associée à une formule, on ne peut renseigner que les paramètres possédés par cette formule.
    Ce qui est bien la règle de gestion énoncée au départ.


    En ce qui concerne les dépendances circulaires, je n'en constate pas sur ce schéma.
    N'oubliez pas de consulter les Cours Merise et la F.A.Q. Merise
    _______________________________________________________

    Les Règles du Club Developpez.com
    Vous avez votre réponse ? Merci de cliquer sur

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Donc, tu préconiserais quoi?

    Je souhaite autant que possible effectuer mes contrôles et blocages au niveau de la base de données.
    Il vaut mieux faire une association ternaire selon toi?

    Comment implémenter la contrainte sémantique au niveau sql?
    Et comment implémenter cette contrainte d'inclusion au niveau du modèle conceptuel?

    Merci d'avance

  13. #13
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 003
    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 003
    Points : 30 909
    Points
    30 909
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    J’essaierai de voir comment traduire au niveau SQL la contrainte d’inclusion de JPhi33. Voyons déjà la solution proposée par CinePhil. J’illustrerai à l’aide de SQL Server 2005 (version EXPRESS, gratuite).

    On notera que, ci-dessous, la table Renseigner fait référence non pas séparément aux deux tables Formule et Param, mais à leur association Posseder (j'espère que la raison en est évidente pour tous).

    Code SQL pour la création des tables :

    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
    43
    44
    45
    create table Formule
    (  
         fId     char(4)      Not null
       , fNom    varchar(32)  Not Null
      , Constraint Formule_PK Primary Key (fId)
    )
    ;
    create table Classe
    (
         cId     char(4)      Not null
       , cNom    varchar(32)  Not Null
      , Constraint Classe_PK Primary Key (cId)
    )
    ;
    create table Param
    (  
         pId     char(4)      Not null
       , pNom    varchar(32)  Not Null
      , Constraint Param_PK Primary Key (pId)
    )
    ;
    create table Posseder
    (  
         pId     char(4)      Not null
       , fId     char(4)      Not null
      , Constraint Posseder_PK Primary Key (pId, fId)
      , Constraint Renseigner_Param Foreign Key (pId)
                    References Param 
      , Constraint Renseigner_Formule Foreign Key (fId)
                    References Formule 
    )
    ;
    create table Renseigner
    (  
         cId     char(4)      Not null
       , pId     char(4)      Not null
       , fId     char(4)      
       , Valeur  varchar(32)  Not Null
      , Constraint Renseigner_PK Primary Key (cId, pId)
      , Constraint Renseigner_Posseder Foreign Key (pId, fId)
                    References Posseder 
      , Constraint Renseigner_Classe Foreign Key (cId)
                    References Classe
    )
    ;

    La ternaire Renseigner a pour en-tête (clé primaire soulignée) :
    Renseigner (cId, pId, fId, Valeur)
    On observera que la table Classe a été débarrassée de l’attribut fId résultant de la dérivation du MCD en MLD. En effet, cet attribut ferait double emploi avec celui qui figure dans l’en-tête de la table Renseigner.

    Le point important est que la table Renseigner doit vérifier la dépendance fonctionnelle cId fId, en conséquence de quoi la deuxième forme normale (2NF) n’est pas respectée ( en effet, {cId} ne constitue pas une clé candidate). Pour pallier, on mettra en œuvre un trigger servant à assurer le respect de la dépendance fonctionnelle :

    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
    CREATE TRIGGER Renseigner_Trigger ON Renseigner INSTEAD OF INSERT AS
        SELECT x.cId 
        FROM   Inserted x
                  INNER JOIN 
               Renseigner y
                     ON     x.cId = y.cId 
     
       IF @@Rowcount > 0
          BEGIN 
              Raiserror ('Viol de la DF cId -> fId !',16,1) 
          RETURN
       END
     
       INSERT INTO Renseigner (cId, pId, fId, Valeur)
          SELECT cId, pId, fId, Valeur 
          FROM   Inserted       
    ;

    Je vous invite à mettre ce trigger à l'épreuve, à l'aide d'un jeu d'essai ad-hoc (quitte à transcrire le trigger si le SGBD n'est pas SQL Server).
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  14. #14
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 003
    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 003
    Points : 30 909
    Points
    30 909
    Billets dans le blog
    16
    Par défaut
    Bonjour,


    Une question :

    La table Renseigner peut-elle contenir les triplets de valeurs {'classe1', 'formule1', 'param1'} et {'classe1', 'formule1', 'param2'} ?

    Autrement dit, bien que la DF cId fId soit garantie, le couple {'classe1', 'formule1'} peut-il légalement exister en en plus d’un exemplaire ?

    Si oui, le trigger Renseigner_Trigger (cf. mon message précédent) convient, sinon il est à aménager, à cause des tentatives d’insertion dans la table Renseigner d’un couple {Classe, Formule} déjà présent.

    Si le trigger est à aménager :

    — Soit on se contente de modifier le message d’erreur, qui devient alors :
    "Viol de la DF cId -> fId ou Couple {Classe, Formule} déjà présent."
    — Soit on prévoit un message spécifique :

    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 Renseigner_Trigger ON Renseigner INSTEAD OF INSERT AS
        SELECT x.cId 
        FROM   Inserted x
                 JOIN 
               Renseigner y
                     ON x.cId = y.cId  AND  x.fId <> y.fId
     
        IF @@Rowcount > 0
           BEGIN 
               Raiserror ('Viol de la DF cId -> fId !',16,1) 
           RETURN
        END
     
        SELECT x.cId 
        FROM   Inserted x
                 JOIN 
               Renseigner y
                     ON x.cId = y.cId  AND  x.fId = y.fId
     
       IF @@Rowcount > 0
          BEGIN 
              Raiserror ('Couple {Classe, Formule} déjà présent',16,1) 
          RETURN
       END
     
       INSERT INTO Renseigner (cId, pId, fId, Valeur)
          SELECT cId, pId, fId, Valeur 
          FROM   Inserted ;

    A suivre.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  15. #15
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 003
    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 003
    Points : 30 909
    Points
    30 909
    Billets dans le blog
    16
    Par défaut
    Bonsoir,



    Dans son message précédent, JPhi33 a proposé la mise en oeuvre d’une contrainte d’inclusion. Je fournis ici des éléments de comparaison de cette solution par rapport à celle qui a été fournie par javass, bien épaulé par CinePhil, et certaines conclusions pouvant influer sur le choix du MLD.


    Retour sur le MLD proposé par javass et CinePhil.

    Pour faciliter le travail de comparaison, je présente le MLD correspondant à la base de données décrite dans mon message précédent (voir les instructions CREATE TABLE) :



    Ce MLD correspond à la dérivation du dernier MCD proposé par javass, en y renommant la table Associer en Posseder et en établissant un lien entre les tables Posseder et Renseigner. La formule d’une classe est déterminée sans ambiguïté, grâce à la dépendance fonctionnelle cId fId définie pour la table Renseigner et garantie par le trigger Renseigner_Trigger (qui pallie donc le viol de la 2NF). J’appellerai ce MLD : MLD orienté javass-CinePhil.

    A noter que si le trigger Renseigner_Trigger (cf. mon message précédent) est utilisé pour contrôler les opérations d’INSERT, il doit être accompagné d'un 2e trigger pour contrôler les opérations d’UPDATE. En effet, rien ne nous empêche pour une classe donnée de modifier la formule et le paramètre qui lui sont associés. Accessoirement, au prix d’une certaine complication, des deux triggers on pourrait n’en faire qu’un, mais ça n’est pas notre objet.

    Observons encore que si l’on se situe dans le contexte relationnel pur (par exemple en Tutorial D), la contrainte peut être ainsi traduite, de façon ramassée (à comparer avec les lourds et parfois bien compliqués triggers SQL) :
    CONSTRAINT Renseigner_DF FORALL x, y Renseigner (x.cId = y.cId x.fId = y.fId) ;

    Ou encore, par référence à la norme SQL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE ASSERTION Renseigner_DF CHECK 
        (NOT EXISTS (
                     SELECT x.fId
                     FROM   Renseigner AS x, Renseigner AS y 
                     WHERE  x.cId = y.cId  
                       AND  x.fId <> y.fId)) ;


    Présentation du MLD résultant de la contrainte d’inclusion proposée par JPhi33.

    Ce MLD (appelons-le MLD orienté JPhi33) correspond à la dérivation du MCD proposé par javass dans son premier message (avec remplacement des cardinalités 0,1 en cardinalités 0,N en ce qui concerne les pattes branchées sur l’association-type Renseigner), enrichi de la représentation de la contrainte d’inclusion :






    Cette contrainte d’inclusion pourrait s’exprimer ainsi au niveau du MLD :
    En relation avec une paire {Classe, Formule} de la table Associer, chaque paire {Classe, Param} de la table Renseigner donne lieu à un triplet {Classe, Param, Formule} dont la projection {Param, Formule} doit faire référence à une paire {Param, Formule} de la table Posseder.
    Ou, pour reprendre les noms des attributs utilisés pour le MLD :
    En relation avec une paire {cId, fId} de la table Associer, chaque paire {cId, pId} de la table Renseigner donne lieu à un triplet {cId, pId, fId} dont la projection {pId, fId} doit faire référence à une paire {pId, fId} de la table Posseder.
    Si l’on se situe dans le contexte relationnel pur (par exemple en Tutorial D), la contrainte pourrait être ainsi traduite :
    CONSTRAINT Contrainte_Inclusion (Renseigner JOIN Associer) {pId, fId} Posseder {pId, fId} ;
    Si l’on se situe dans le contexte de la norme SQL, on peut coder par exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE ASSERTION Contrainte_Inclusion
        CHECK (NOT EXISTS ( 
            SELECT   *
             FROM    Associer x JOIN Renseigner y
                         ON x.cId = y.cId
                WHERE NOT EXISTS (    
                       SELECT *
                       FROM   Posseder z
                       WHERE  y.pId = z.pId
                         AND  x.fId = z.fId)
              )) ;

    Ainsi, quand on est dans le contexte de la théorie relationnelle ou quand le SGBD propose l’instruction CREATE ASSERTION prévue par la norme SQL, la mise en œuvre des contraintes est simple, qu’il s’agisse du MLD orienté javass-CinePhil ou du MLD orienté JPhi33, avec un avantage malgré tout pour ce dernier, car le bonhomme NULL y est interdit de séjour. Pour que le MLD orienté javass-CinePhil fasse aussi bien, il faudrait prévoir une valeur par défaut, pour l’attribut cId de la table Renseigner, par exemple « cId = 0 » équivalent à « Classe sans formule ».

    Les choses sont moins simples quand on utilise un SGBDR utilisant SQL et ne proposant pas l’instruction CREATE ASSERTION. En effet, on est obligé d’en passer par des triggers pour surveiller les mises à jour : une paire de triggers (INSERT, UPDATE) pour la table Associer, un triplet de triggers (INSERT, UPDATE, DELETE) pour la table Renseigner et une paire de triggers (UPDATE, DELETE) pour la table Posseder.

    A la place, on pourrait envisager de créer une vue avec l’option "WITH CHECK OPTION" pour représenter la contrainte d’intégrité, mais il faudra lui attacher des triggers pour ventiler les mises à jour dans les tables de base.

    On peut dire cette fois-ci que le MLD orienté javass-CinePhil devient économiquement plus intéressant.

    Une autre solution consisterait à mettre en œuvre une table (appelons-la Inclusion) matérialisant la contrainte d’inclusion. Cette table a pour clé primaire la paire {cId, pId} :




    Observations relatives à cette solution alternative.

    1) A son tour, la table Inclusion viole la 2NF : comme dans le cas de la solution MLD orienté javass-CinePhil, il faudra prévoir une paire de triggers permettant de garantir la dépendance fonctionnelle cId fId.

    2) Qui plus est, la paire {cId, fId} de la table Inclusion redonde avec son homologue de la table Associer, et il faudra en conséquence prévoir une autre paire de triggers pour la table Inclusion, afin de garantir que la formule f de la classe c (table Inclusion) est bien celle que l’on a initialement dans la table Associer pour la classe c.

    3) Si on analyse les conséquences des opérations de mise à jour impliquant les différentes tables et affectant la validité du contenu de la table Inclusion, on constate qu’il y a — pour le moins — un certain nombre de points sur lesquels il faut être vigilant. Il y aura encore quelques précautions à prendre et des triggers à développer. Chacun peut sexercer à découvrir les inconvénients de la mise en œuvre d’une table Inclusion, autres que ceux qui viennent d’être mentionnés, à savoir les inconvénients provoqués par les mises à jour portant sur les autres tables.

    La solution alternative consistant à matérialiser la contrainte d'inclusion est à éviter.

    =>

    En conclusion, si on utilise un SGBD basé sur Tutorial D, ou si l’on utilise un SGBD utilisant SQL et fournissant l’instruction CREATE ASSERTION, on peut mettre en œuvre le MLD orienté javass-CinePhil ou le MLD orienté JPhi33. Si l’on utilise un SGBD SQL et si on se sert de triggers, on pourra préférer la solution javass-CinePhil.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

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

Discussions similaires

  1. Outils permettant d'analyser les dépendances circulaires ?
    Par Soulama dans le forum Qualimétrie
    Réponses: 3
    Dernier message: 10/04/2012, 16h44
  2. MVC et dépendance circulaire de projets
    Par AsPrO dans le forum MVC
    Réponses: 7
    Dernier message: 14/11/2011, 16h04
  3. [EJB3] [JBoss] Injection de dépendance circulaire ?
    Par Claythest dans le forum Java EE
    Réponses: 6
    Dernier message: 04/08/2009, 08h11
  4. Réponses: 1
    Dernier message: 26/07/2009, 18h06
  5. Problèeme de dépendances circulaires entre EJBs et JBoss
    Par developpeur2008 dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 08/06/2008, 20h03

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