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 :

Peut-on ajouter une clé "fabriquée" à une table associative ? [Modèle Relationnel]


Sujet :

Schéma

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut Peut-on ajouter une clé "fabriquée" à une table associative ?
    Bonjour,

    Je voudrai savoir si ces possibles d'ajouter une clé primaire 'fabriquer' à une table associatifs ? A moins que si j'en arrive à cette solution ces que j'ai mal modélisé la chose ?

    Je voudrai qu'un projet possède forcément un état qui peut varier, l'état peut comporter un texte facultatif lors de changement :
    [Projet]---1,N-- Possède(message)--- (0,N)[Etat]

    Par cette association l'entité deviens une table au niveau MLD porteuse en plus de la clé primaire composé/étrangère de Etat et Projet l'attribut message comportant le texte facultatif. Cependant par un jeu d'essai rapide on se rend bien compte que la table associative ne peut contenir plusieurs fois un même état pour un même projet d’où l'origine de ma question.
    Table associatif avant ma question :
    T_ASSOCIATIVE(#idProjet,#idEtat,message);
    Table associatif à laquelle je pense pour résoudre le problème :
    T_ASSOCIATIVE(#idT_ASSOCIATIVE,#idProjet,#idEtat,message);

    Merci pour l'aide.

  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 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Craftman,


    Si le projet P1 peut faire l’objet de plusieurs messages alors qu’il est dans l’état E1, votre représentation ci-dessous ne convient puisque par définition elle dit que pour la paire <P1, E1> il n’y a qu’un et un seul message :

    [Projet]---1,N-- Possède(message)--- (0,N)[Etat]

    Par contre, dans votre MLD, la table T_ASSOCIATIVE est correcte, mais côté clés étrangères, il y aura du changement si votre système évolue et qu’il faille alors mettre en oeuvre un attribut qui au contraire de message, serait monovalué pour la paire {Projet, Etat}.

    Cela dit, est-ce qu’à l’instant T1, le projet P1 peut être dans plusieurs états ? Ne gérez-vous pas la (ou les) date(s) du passage du projet P1 à l’état E1 ?
    (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.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Bonsoir fsmrel,

    mais côté clés étrangères, il y aura du changement si votre système évolue et qu’il faille alors mettre en œuvre un attribut qui au contraire de message, serait monovalué pour la paire {Projet, Etat}.
    Je n'ai pas très bien compris ce que vous voulez dire par cette dernière phrase

    Pour être plus précis le projet P1 peut-être que dans un état à la fois, à chaque changement d'état nous avons la possibilités ( donc facultatif ) d'écrire un message pour se rappeler ce qui à pousser le changement de l'état du projet. A sa création il est donc dans un état par défaut.

    Ne gérez-vous pas la (ou les) date(s) du passage du projet P1 à l’état E1 ?
    Si la table associative est également porteuse d'un attribut date ( que je n'ai effectivement pas mis au-dessus).

    Pour tout vous dire à la base je suis parti sur les cardinalités suivantes (je n'avais pas penser aux messages) :
    [Projet]---1,1-- Possède--- (0,N)[Etat]
    Dans ce contexte message et idEtat(fk) appartiennent à la table Projet, en allant un peu plus loin (pas beaucoup lol) j'ai penser au modèle que je vous ai fais part dans mon premier message. L'avantage du 1er modèle est qu'il permettrai de conserverai les différents états qu'on pris un projet encore faut il que la table associative puisse contenir plusieurs fois la combinaison Projet | EtatProjet d’où ma suggestion de rajouter une clé fabriquer qui donnerai Projet | EtatProjet | X

    J’attends votre avis, merci.

  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 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Craftman,



    Citation Envoyé par Craftman
    Je n'ai pas très bien compris ce que vous voulez dire par cette dernière phrase
    Supposons que la paire {Projet, Etat} fasse obligatoirement l’objet d’un niveau de responsabilité (seule les personnes ayant le niveau N1 requis sont habilitées à traiter du projet P1 quand celui-ci est dans l’état E1).


    Au niveau tabulaire, la représentation sera la suivante (j’utilise ici MySQL Workbench) :





    En complétant avec la partie ayant trait aux messages (j’ai renommé la table T_ASSOCIATIVE en MESSAGE) :



    Mais du coup, du fait de l’association avec la table MESSAGE, des paires {Projet, Etat} pourraient ne pas faire l’objet de la règle voulant que tout projet dans un état donné fasse l’objet d’un niveau de responsabilité. Pour que cette règle ne soit pas violée, le diagramme doit ainsi évoluer :






    Citation Envoyé par Craftman
    Pour être plus précis le projet P1 peut-être que dans un état à la fois, à chaque changement d'état nous avons la possibilités ( donc facultatif ) d'écrire un message pour se rappeler ce qui à pousser le changement de l'état du projet.
    Si à la date D1, le projet P1 ne peut être que dans un seul état, disons E1, alors (en supposant qu’à cette occasion le passage à l’état E1 puise faire l’objet de plus d’un message), le diagramme devrait évoluer en ce sens :






    Où la table MESSAGE est identifiée relativement à la table PROJET_ETAT, d'où la participation de la paire {ProjetId, ProjetEtatDate} à la clé primaire de la table MESSAGE.
    (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.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Bonsoir fsmrel,

    Le MLD que vous avez fais correspond exactement à celui que j'ai fais moi même sur un brouillon ( mise à part l’absence de l'attribut NiveauResponsabilite ).
    Nom : Craftman_Evolutivite_C.png
Affichages : 181
Taille : 16,0 Ko

    Si à la date D1, le projet P1 ne peut être que dans un seul état, disons E1, alors (en supposant qu’à cette occasion le passage à l’état E1 puise faire l’objet de plus d’un message), le diagramme devrait évoluer en ce sens...
    Il faut savoir qu'un projet peut changer une "infinité" de fois d'état par jour et même "repasser" par des états qu'il à déjà passé.
    En prenant en compte ce critère la modélisation du dernier MCD ne fonctionne pas et je retombe donc dans le même problème qu'au commencement : Je ne peux sauvegarder un message pour deux états qui ont déjà étais passé.
    Exemple : Le projet P1 est dans un état E1 (j'enregistre message) puis dans un état E2(je décide de pas enregistrer de message) puis je décide de repasser à l'étape E1(je veux enregistrer un message mais le SGBDR m'en empêche légitiment car il y a déjà eu la combinaison P1-E1).

    Toutefois si au lieu d'enregistrer la date uniquement nous enregistrons la date et l'heure ( champ timestamp ) votre dernier MCD me semble contourner ce problème qu'en pensez-vous ?

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


    Citation Envoyé par Craftman
    Exemple : Le projet P1 est dans un état E1 (j'enregistre message) puis dans un état E2(je décide de pas enregistrer de message) puis je décide de repasser à l'étape E1(je veux enregistrer un message mais le SGBDR m'en empêche légitiment car il y a déjà eu la combinaison P1-E1).

    Toutefois si au lieu d'enregistrer la date uniquement nous enregistrons la date et l'heure ( champ timestamp ) votre dernier MCD me semble contourner ce problème qu'en pensez-vous ?
    De toute façon, c’est le dernier MCD qui doit prévaloir, et qui peut du reste évoluer si vous voulez vous placer dans le cadre théorique de l’historisation.

    Le tout est évidemment de définir le granule temporel pertinent. Si une résolution d’une seconde suffit (ce qui devrait largement suffire pour un projet ), le type TIMESTAMP convient.
    (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.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Bonjour fsmrel,

    Merci. C'est compris !
    En vu de la situation finale si nous devions répondre explicitement à la question : Peut-on ajouter une clé "fabriquer" à une table associative ?

    La réponse serait-elle non pour n'importe qu'elle situation faisant intervenir les cardinalités [N,M] ?

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


    Tous les coups sont permis, à condition que l’on respecte les règles de gestion. Par exemple, si vous souhaitez définir ex nihilo une clé primaire {ProjetEtatId} pour la table PROJET_ETAT, pas de problème du point de vue de la théorie relationnelle, mais à condition que la paire {ProjetId, ProjetEtatDate} fasse l’objet d’une clé alternative, sinon on pourrait violer la règle qui veut que pour cette paire on ne peut pas avoir plus d’un état. Dans le diagramme ci-dessous, j’ai symbolisé cette clé en rajoutant manuellement (à l’aide de PAINT ) le mickey « » (MySQL Workbench ne propose pas cette facilité graphique, mais permet heureusement de définir des clés alternatives, au moyen d’index de type unique) :





    On peut donc tout faire, mais attention aux effets secondaires au niveau physique : l’accroissement du nombre des index est pénalisant pour les mises à jour, voyez par exemple le cas des lots de chèques. Par ailleurs l’index de clé {ProjetEtatId} peut faire perdre le bénéfice du clustering, mais je ne voudrais pas vous embarquer dans des considérations qui relèvent du prototypage de la performance des applications...

    Bref, après 40 ans de chahutage de bases de données (IMS/DL1, IDMS, SQL, etc.), le diagramme ci-dessus n’a guère ma faveur et je passe l’attribut ProjetEtatId — donc la clé {ProjetEtatId} — au rasoir du camarade Guillaume d’Ockham, pour qui Pluralitas non est ponenda sine necessitate...
    (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.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Je vais donc suivre la dernière solution que vous adopterez.

    Dans la table MESSAGE la participation de l'attribut MessageId dans la clé primaire est-ce primordiale ?

    (Juste pour être sur : l’icône rouge dans vos différents MLD correspondent bien à la présence de clé étrangère ? )

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


    Je suis désolé de vous répondre tardivement, mais j’avais des urgences par ailleurs.


    Citation Envoyé par Craftman
    L’icône rouge dans vos différents MLD correspondent bien à la présence de clé étrangère ?
    Concernant la couleur des losanges :

    — rougeâtre : oui, cette couleur est utilisée pour repérer visuellement les attributs qui participent à des clés étrangères (mais s’ils participent simultanément à la clé primaire de la table, c’est l’icône de cette clé qui est utilisée).

    — bleuâtre : cette couleur est utilisée pour les attributs qui ne participent ni à une clé primaire ni à une clé étrangère (comme MySQL Workbench ne colorie pas pour les clés alternatives, j’ajoute à la main la petite clé bleue ad-hoc). En outre, ces attributs ne peuvent pas être marqués NULL.

    — blanchâtre : cette couleur est utilisée pour les attributs pouvant être marqués NULL. Il va de soi qu’elle n’apparaît jamais dans mes diagrammes...


    Citation Envoyé par Craftman
    Dans la table MESSAGE la participation de l'attribut MessageId dans la clé primaire est-ce primordiale ?
    Oui . Que ce soit en tant que seul élément de la clé {MessageId}, cas de identification absolue, soit en tant qu’attribut participant à l’identification relative (clé {ProjetEtatId, MessageId}).


    Exemple :

    Identification absolue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MessageId     ProjetEtatId     MessageTeneur    
    ---------
             1               1     Y a du vent dans les voiles
             2               1     Y a du mou dans la corde à nœuds
             3               1     On a vendu les bijoux de famille
    
             4               2     20 ans dans un mur, la vie d’une brique
             5               2     Le char de l’Etat navigue sur un volcan
             6               2     Aux 4 coins de l’Hexagone
    
             7               3     Margoton la jeune bergère
             8               3     Il y a peu de chances qu’on détrône le roi des c...


    Identification relative

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     ProjetEtatId    MessageId     MessageTeneur    
     ------------    ---------
               1             1    Y a du vent dans les voiles
               1             2    Y a du mou dans la corde à nœuds
               1             3    On a vendu les bijoux de famille
    
               2             1    20 ans dans un mur, la vie d’une brique
               2             2    Le char de l’Etat navigue sur un volcan
               2             3    Aux 4 coins de l’Hexagone
    
               3             1    Margoton la jeune bergère
               3             2    Il y a peu de chances qu’on détrône le roi des c...

    Vous me direz que, dans votre cas, l’intérêt du choix d’un type d’identification ne saute pas aux yeux. Par contre, dès que, par exemple, des contraintes de chemin sont à mettre en œuvre (cf. le problème des devis, bons et factures de Benallasiham), en plus de l’avantage qu’on y trouve quant aux performances, c’est l’identification relative qui prend l’avantage de façon décisive.

    Quant à se passer de clé primaire, ça serait autoriser les doublons et cette fois-ci la table Message ne serait plus qu’un sac auquel on ne pourrait accorder aucune confiance, ça serait de la folie.
    (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.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Bonsoir fsmrel,

    Merci pour toutes vos explications !

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 07/07/2010, 16h30
  2. Réponses: 1
    Dernier message: 11/02/2009, 06h33

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