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 :

clés primaires de tables d'associations reférencées dans une autre table [MLD]


Sujet :

Schéma

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut clés primaires de tables d'associations reférencées dans une autre table
    Salut à tous,

    J'aimerai avoir votre avis sur un design de base de données.

    Première version:

    Considérons les tables suivantes:

    cas_etudes: (id, name)
    séquences: (id, name)
    sequences_cas_etudes: (id, cas_etudes_id, sequences_id) => Association Many To Many
    Un cas d'étude peut avoir plusieurs séquences mais jamais deux fois le même enregistrement donc pose d'index uniques

    code_sites: (id, name)
    scanners: (id, name)
    scanners_code_sites: (id, code_sites_id, scanners_id) => Association Many To Many
    Un code site peut avoir plusieurs scanners mais jamais deux fois le même enregistrement donc pose d'index uniques

    parametres: (id, name)

    et la dernière table:
    Résultat: (parameter_id, scanners_code_sites_id, sequences_cas_edutes_id, valeur) => référence les clés primaires des tables d'associations.

    Deuxième version

    Considérons les tables suivantes:

    cas_etudes: (id, name)
    séquences: (id, name)
    sequences_cas_etudes: (cas_etudes_id, sequences_id) => Association Many To Many
    Un cas d'étude peut avoir plusieurs séquences mais jamais deux fois le même enregistrement donc la clé primaire est composé des FK

    code_sites: (id, name)
    scanners: (id, name)
    scanners_code_sites: (code_sites_id, scanners_id) => Association Many To Many
    Un code site peut avoir plusieurs scanners mais jamais deux fois le même enregistrement donc la clé primaire est composé des deux FK

    parametres: (id, name)

    et la dernière table:
    Résultat: (parameter_id, cas_etudes_id, sequences_id, code_sites_id, scanners_id, valeur) => référence les clés primaires des tables directement.


    Est-ce correct ? Quel modèle préférez vous ?

    Je suppose que les deux modèles sont correctes mais par contre le deuxième modèle implique la création de triggers pour vérifier que les données entrées soient possibles. Il en est deux même si je souhaite créer une mise à jour ou suppression en cascade. Je devrai tout gérer moi-même.

    Alors que le premier modèle je laisse la base de données travailler pour moi, par contre les requêtes seront un peu plus ardue à écrire, tant en lecture que en écriture. Par contre l'intégrité est pour moi le plus important!!!

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 756
    Points : 52 534
    Points
    52 534
    Billets dans le blog
    5
    Par défaut
    Je n'ai pas besoin de lire autre chose que votre titre pour vous indiquer que vous avez fait une faute.

    Les table de jointure résultant d'associations de cardinalités n-m ne sont pas des entités...

    Si votre modèle présente ce défaut c'est que votre table de jointure n'en était pas une, mais était une entité et se devait donc d'avoir une clef primire propre.

    Pour modéliser correctement, vous devez IMPÉRATIVEMENT passer par l'étape MCD et non pas directement faire un MPD.

    Recommencez votre modèle sous forme entité association et vous constaterez par vous même vos erreurs !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    J'ai bien fait une modélisation UML mais en implémentant le modèle logique, j'ai trouvé cela tellement louche que j'ai préféré poser la question.

    Bref je vais revoir mon design UML pour améliorer ceci. Si vous avez un indice pour m'aider


    Merci.

  4. #4
    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
    Un cas d'étude peut avoir plusieurs séquences mais jamais deux fois le même enregistrement
    Commencez par écrire vos règles de gestion complètement.
    => Un cas d'étude peut avoir plusieurs séquences et une séquence... ?

    Êtes-vous sûr qu'il s'agit d'une association "many to many" ?
    Les séquences sont-elles pré-programmées et peuvent-elles s'appliquer à plusieurs cas d'étude ?

    Décrivez nous un peu mieux votre contexte, ce sera plus facile de vous aider à trouver la bonne modélisation.
    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 !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    La liste de toutes les séquences et des scanneurs sont enregistres en base de données.
    Les séquences peuvent s'appliquer a plusieurs cas d’étude et les codes sites peuvent utilisés plusieurs scanneurs pour un cas d’étude

    J'ai oublie de dire qu'un code site a au moins un cas d’étude et qu'il peut en posséder plusieurs.
    code_site_cas_etude: ( code_site_id, cas_etude_id)


    Quand un nouveau cas d’étude se présente, on affecte ce cas d’étude a des séquences. Ensuite un code site participe au cas d’étude et on enregistre cette association.
    Puis on enregistre les scanneurs utilises pour ce cas d’études et ce code site.
    scanners_code_sites_cas_etudes: (code_sites_id, scanners_id, cas_etude_id)

    C'est ensuite que j'ai un problème pour modéliser la table : résultat

    (Je reviens vers vous pour modéliser les relations en MCD)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Au final j'ai:

    cas_etudes: (id, name)
    séquences: (id, name)
    code_sites: (id, name)

    sequences_cas_etudes: (cas_etudes_id, sequences_id) => J'affecte un cas d’étude a des séquences.
    code_site_cas_etude: ( code_site_id, cas_etude_id) => J'affecte un code site a un cas d’étude

    scanners: (id, name)
    scanners_code_sites_cas_etudes: (code_sites_id, scanners_id, cas_etude_id) => Ici je pourrai entrer une combinaison qui n'existe pas dans la table "code_site_cas_etude".

  7. #7
    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 902
    Points
    30 902
    Billets dans le blog
    16
    Par défaut
    Bonsoir,



    Citation Envoyé par champomy62 Voir le message
    Un code site peut avoir plusieurs scanners mais jamais deux fois le même enregistrement donc la clé primaire est composé des deux FK.
    Qu’un site puisse avoir plusieurs scanners, c’est une information compréhensible par l’utilisateur et qui doit faire l’objet d’une règle de gestion des données. Malheureusement vous en êtes resté au milieu du gué, en conséquence, et pour aller dans le sens de CinePhil, veuillez préciser si un scanner peut être partagé par plusieurs sites, ou bien s’il appartient à un seul site.


    Quand vous écrivez :

    Jamais deux fois le même enregistrement donc la clé primaire est composé des deux FK

    s’il s’avérait qu’un scanner appartient à un seul site, votre conclusion serait fausse par rapport à sa prémisse.

    Sachez encore que le terme enregistrement fait partie du langage des informaticiens qui s’intéressent à la gestion des fichiers : vous traitez dans une même phrase du sujet qui concernent le commandant, là-haut dans sa dunette, à savoir les règles de gestion des données, et des techniques à employer dans la soute à boulons et rivets. Quant aux concepts de clé primaire et de clé étrangère, vous vous situez au niveau SQL : bref, c’est la grande salade des niveaux, une chatte n’y retrouverait pas ses chatons.


    En plus du corpus nécessaire des règles de gestion des données, il faudrait aussi que vous présentiez votre diagramme de classes, plutôt que de vous embarquer dans des conclusions pour le moins contestables.

    Dans le même sens, ce que vous présentez ci-dessous est beaucoup trop imprécis, et les conclusions pas forcément consistantes par rapport aux prémisses. :

    Citation Envoyé par champomy62 Voir le message
    Au final j'ai:

    cas_etudes: (id, name)
    séquences: (id, name)
    code_sites: (id, name)

    sequences_cas_etudes: (cas_etudes_id, sequences_id) => J'affecte un cas d’étude a des séquences.
    code_site_cas_etude: ( code_site_id, cas_etude_id) => J'affecte un code site a un cas d’étude

    scanners: (id, name)
    scanners_code_sites_cas_etudes: (code_sites_id, scanners_id, cas_etude_id) => Ici je pourrai entrer une combinaison qui n'existe pas dans la table "code_site_cas_etude".
    En effet, on ne voit pas ce qui empêche de lire :

    sequences_cas_etudes: (cas_etudes_id, sequences_id) => J'affecte une séquence à des cas d’étude.

    Etc.
    (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.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 756
    Points : 52 534
    Points
    52 534
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par champomy62 Voir le message
    J'ai bien fait une modélisation UML mais en implémentant le modèle logique, j'ai trouvé cela tellement louche que j'ai préféré poser la question.

    Bref je vais revoir mon design UML pour améliorer ceci. Si vous avez un indice pour m'aider


    Merci.
    UML n 'est malheureusement pas le meilleur choix pour la conception des modèles de données. Mon ami Christian Soutou qui a publié depuis plusieurs années un ouvrage sur le sujet, revient aujourd'hui au traditionnel modèle entité association, plus apte à représenter les MCD que UML...

    À nous lire : http://www.amazon.fr/Mod%C3%A9lisati...+soutou+modele

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Bonjour,

    Je reviens avec un autre exemple plus concret.

    En pièce jointe le schéma merise conceptuel.

    Pour résumer:
    1) Un fabricant peut créer des logiciels. Chaque logiciel crée appartient à un seul fabricant.
    2) Un fabricant peut créer des models de scanneurs. Chaque modèle de scanneur fabriqué appartient à un seul fabricant.
    3) Un modèle peut être utilisé par différents logiciels DU MÊME fabricant.

    Pour la dernière phrase je ne suis pas sur que le modèle conceptuel soit bon...
    Je ne vois pas comment conceptualiser cette possibilité. Est-ce plus un traitement de données ou une conceptualisation ?
    Qu'en pensez-vous ?

    Je vous remercie d'avance.
    Images attachées Images attachées

  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 902
    Points
    30 902
    Billets dans le blog
    16
    Par défaut
    Bonsoir champomy62,


    Il est possible de garantir la contrainte que vous souhaitez (qui fait partie des « contraintes de chemin »), en utilisant l’identification relative.

    L’entité-type MODELE est identifiée relativement à FABRICANT, même principe pour LOGICIEL :




    De la sorte, au stade MLD, l’AGL (manifestement il s’agit de DB-MAIN) propage deux fois l’attribut FabricantId jusqu’à la table UTILISER, une fois via FABRIQUER et une fois via DEVELOPPER. Il suffit de ne conserver dans la table UTILISER qu’une seule occurrence de cet attribut et la contrainte de chemin est de facto garantie :




    Code SQL généré par l'AGL :

    
    create table FABRICANT (
         FabricantId int not null,
         FabricantNom char(32) not null,
         constraint ID_FABRICANT primary key (FabricantId));
    
    create table LOGICIEL (
         FabricantId int not null,
         LogicielId int not null,
         LogicielNom char(32) not null,
         constraint ID_LOGICIEL primary key (FabricantId, LogicielId));
    
    create table MODELE (
         FabricantId int not null,
         ModeleId int not null,
         ModeleNom int not null,
         constraint ID_MODELE primary key (FabricantId, ModeleId));
    
    create table UTILISER (
         FabricantId int not null,
         ModeleId int not null,
         LogicielId int not null,
         constraint ID_UTILISER primary key (FabricantId, ModeleId, LogicielId));
    
    alter table LOGICIEL add constraint FKDEVELOPPER
         foreign key (FabricantId)
         references FABRICANT (FabricantId);
    
    alter table MODELE add constraint FKFABRIQUER
         foreign key (FabricantId)
         references FABRICANT (FabricantId);
    
    alter table UTILISER add constraint FKUTI_MOD
         foreign key (FabricantId, ModeleId)
         references MODELE (FabricantId, ModeleId);
    
    alter table UTILISER add constraint FKUTI_LOG
         foreign key (FabricantId, LogicielId)
         references LOGICIEL (FabricantId, LogicielId);
    
    
    (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 averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Après test, il me semble qu'il manque cette contrainte pour garantir la contrainte des chemins (si je dis pas bêtises):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    alter table UTILISER add constraint FKUT_LOG
         foreign key (FabricantId, LogicielId)
         references LOGICIEL (FabricantId, LogicielId);
    De la sorte, au stade MLD, l’AGL (manifestement il s’agit de DB-MAIN) propage deux fois l’attribut FabricantId jusqu’à la table UTILISER, une fois via FABRIQUER et une fois via DEVELOPPER. Il suffit de ne conserver dans la table UTILISER qu’une seule occurrence de cet attribut et la contrainte de chemin est de facto garantie
    C'est exactement pour ça que je suis venu poster ce message. Je trouvais cela très moche dans la base de données.

    Comment as-tu fait pour savoir qu'il s'agissait de db-main ? Qu'en penses-tu de cet outil ?

  12. #12
    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 902
    Points
    30 902
    Billets dans le blog
    16
    Par défaut
    Bonjour champomy62,


    Citation Envoyé par champomy62 Voir le message
    Après test, il me semble qu'il manque cette contrainte pour garantir la contrainte des chemins (si je dis pas bêtises):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    alter table UTILISER add constraint FKUT_LOG
         foreign key (FabricantId, LogicielId)
         references LOGICIEL (FabricantId, LogicielId);
    De fait, comme la contrainte se trouve en fin du fichier .ddl, elle a réussi à échapper à la capture lors du copier-coller du code SQL... J’ai donc complété celui-ci dans mon message.


    Citation Envoyé par champomy62 Voir le message
    Comment as-tu fait pour savoir qu'il s'agissait de db-main ? Qu'en penses-tu de cet outil ?
    Le style du graphique utilisé pour les associations, l’utilisation d’un tiret pour séparer les cardinalités min et max sont caractéristiques de DB-MAIN.

    Je pense beaucoup de bien de l’AGL, Jean-Luc Hainaut a parfaitement mûri et conçu son bébé, lequel se distingue des autres AGL orientés entité/association, en nous permettant par exemple de modifier l’identifiant des associations, ce qui nous évite d’avoir recours aux CIF (contraintes d’intégrité fonctionnelle) merisiennes, ou encore de modéliser des contraintes d’inclusion (mais pas d’exclusion, malheureusement, à moins d’une manip que je n’ai pas réussi à découvrir...). Pour comparer avec les MCD merisiens, voyez par exemple ici ou .


    Certains qui découvrent DB-MAIN on t un peu de mal à en comprendre le modus operandi : s’ils sont pressés et peuvent se permettre de sauter l’étape entité/association, alors s’ils ont déjà utilisé MySQL Workbench, en deux coups de cuiller à pot, ils peuvent produire directement le digramme suivant :

    (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.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    J'ai connu DB-MAIN grâce à son livre intitulé "Base de données".

    Je compte utiliser des clés auto-incrémenté pour les id dans les tables
    - FABRICANT
    - LOGICIEL
    - MODELE


    Je pense que ça ne posera pas de soucis. D'ailleurs savez-vous comment créer une clé auto-incrementé dans db-main ?
    En tout cas je vous remercie, ça marche super bien

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Dernière petite question...

    Je souhaite transformer l'association "utiliser" en entité qui possède sa propre clé primaire pour qu'elle puisse être référencer ailleurs car j'ai besoin de dire qu'un site physique puisse utiliser cette configuration (fabricant, modèle et logiciel). Ou devrai-je plutôt référence les contraintes étrangère directement dans la table "site physique" ?

    Pour ma part j'opterai pour transformer l'association "utiliser" en entité propre pour pouvoir ajouter d'autres d'attributs plus tard.
    Qu'en pensez-vous ?

  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 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 902
    Points
    30 902
    Billets dans le blog
    16
    Par défaut
    Bonsoir champomy62,



    Citation Envoyé par champomy62 Voir le message
    Savez-vous comment créer une clé auto-incrémentée dans DB-MAIN ?
    Prenons le cas de l’attribut FabricantId de la table FABRICANT : il suffit de lui affecter le type « Sequence » :




    Maintenant, tout dépend du SGBD cible. Ainsi, avec MySQL, ça fonctionne, avec ACCESS c’est non. Quel est le vôtre ?


    Je vais regarder le cas de la transformation de l’association en entité-type. En passant, n'oubliez pas de voter quand une réponse a pu vous être utile...
    (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.

  16. #16
    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 902
    Points
    30 902
    Billets dans le blog
    16
    Par défaut
    Rebonsoir champomy62,



    Citation Envoyé par champomy62 Voir le message
    Je souhaite transformer l'association "utiliser" en entité qui possède sa propre clé primaire pour qu'elle puisse être référencer ailleurs car j'ai besoin de dire qu'un site physique puisse utiliser cette configuration (fabricant, modèle et logiciel). Ou devrai-je plutôt référence les contraintes étrangère directement dans la table "site physique" ?
    UTILISER va jouer le rôle de référentiel de produits, de catalogue pour les sites. Si UTILISER restait une association, vous ne pourriez pas l’associer avec des entités-types telles que SITE, je ne sache pas en effet que DB-MAIN propose le concept d’agrégation (rien à voir avec celui d’UML) au sens de Smith & Smith (1978), repris notamment par Silberschatz et Korth : autrement dit, UTILISER va devenir une entité-type (que je renomme CATALOGUE pour la circonstance, mais sans doute trouverez-vous un terme plus approprié).

    Maintenant, est-il préférable de définir pour CATALOGUE ex nihilo un identifiant supplémentaire qui fasse l’objet d’une clé primaire au niveau relationnel ?

    Quelques éléments de réflexion :

    Scénario 1. Définissons un nouvel attribut CatalogueId, qui devienne l’identifiant de l’entité-type CATALOGUE. Plaçons-nous au niveau relationnel et supposons que la table SITE soit en relation directe avec la table CATALOGUE, de clé primaire {CatalogueId} (à noter que le triplet {FabricantId, ModeleId, LogicielId} est toujours clé, mais alternative). Si pour un site on a besoin de connaître le nom (ou autre caractéristique) du logiciel il faudra effectuer une jointure de la table SITE avec la table CATALOGUE et la table LOGICIEL (même principe pour les modèles et les fabricants). En outre, la table CATALOGUE étant dotée d’une clé nouvelle, le SGBD créera un index supplémentaire (attention, les ajouts seront plus coûteux, la performance est pénalisée). Si le modèle M1 du fabricant F1 est associé au logiciel L1, et s’il faut remplacer L1 par L2 dans cette association, l’update correspondant n'a pas d'impact sur la table SITE.

    Scénario 2. Si on n’a pas défini l’attribut CatalogueId, l’identifiant de l’entité-type CATALOGUE reste le triplet {FabricantId, ModeleId, LogicielId}. Pour récupérer le nom du logiciel, on aura une jointure en moins, puisqu’il suffira de joindre SITE et LOGICIEL. La table CATALOGUE n’étant pas dotée d’une clé nouvelle, le SGBD n’aura pas à créer d’index supplémentaire (on est moins pénalisé en mise à jour). Si le modèle M1 du fabricant F1 est associé au logiciel L1, et s’il faut remplacer L1 par L2 dans cette association, l’update correspondant est à répercuter sur la table SITE : cela reste transparent pour les applications, à condition de prévoir ON UPDATE CASCADE pour la contrainte référentielle établie entre SITE et CATALOGUE. S’il y a peu de modifications de ce genre, du point de vue des performances ça n’est pas un problème. Par contre, si elle sont fréquentes et touchent de nombreux sites, attention.

    En gros, avantage au scénario 2, sauf si les modèles sont souvent détricotés des logiciels.


    Scénario 1

    
    create table CATALOGUE 
    (
         CatalogueId int not null,
         FabricantId int not null,
         ModeleId int not null,
         LogicielId int not null,
         constraint ID_CATALOGUE primary key (CatalogueId),
         constraint AK_CATALOGUE unique (FabricantId, ModeleId, LogicielId),
         constraint FK_CAT_MOD foreign key (FabricantId, ModeleId)
             references MODELE (FabricantId, ModeleId),
         constraint FK_CAT_LOG foreign key (FabricantId, LogicielId)
             references LOGICIEL (FabricantId, LogicielId)
    ) ;
    
    Create table SITE
    (
         SiteId int not null,
         SiteNom varchar(32) not null,
         CatalogueId int not null,
         constraint ID_SITE primary key (SiteId), 
         constraint FK_SITE_CAT foreign key (CatalogueId)
             references CATALOGUE (CatalogueId)
    ) ;
    
    

    Scénario 2

    
    create table CATALOGUE 
    (
         FabricantId int not null,
         ModeleId int not null,
         LogicielId int not null,
         constraint ID_CATALOGUE primary key (FabricantId, ModeleId, LogicielId),
         constraint FK_CAT_MOD foreign key (FabricantId, ModeleId)
             references MODELE (FabricantId, ModeleId),
         constraint FK_CAT_LOG foreign key (FabricantId, LogicielId)
             references LOGICIEL (FabricantId, LogicielId)
    ) ;
    
    Create table SITE
    (
         SiteId int not null,
         SiteNom varchar(32) not null,
         FabricantId int not null,
         ModeleId int not null,
         LogicielId int not null,
         constraint ID_SITE primary key (SiteId), 
         constraint FK_SITE_CAT foreign key (FabricantId, ModeleId, LogicielId)
             references CATALOGUE (FabricantId, ModeleId, LogicielId)
             on update cascade
    ) ;
    
    



    Citation Envoyé par champomy62 Voir le message
    J'opterai pour transformer l'association "utiliser" en entité propre pour pouvoir ajouter d'autres d'attributs plus tard.
    Rien n’interdit d’ajouter des attributs à l’association. C’est plutôt le fait d’avoir à définir des associations d’associations qui pousse à la transformation.
    (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.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Bonsoir champomy62,




    Prenons le cas de l’attribut FabricantId de la table FABRICANT : il suffit de lui affecter le type « Sequence » :




    Maintenant, tout dépend du SGBD cible. Ainsi, avec MySQL, ça fonctionne, avec ACCESS c’est non. Quel est le vôtre ?


    Je vais regarder le cas de la transformation de l’association en entité-type. En passant, n'oubliez pas de voter quand une réponse a pu vous être utile...
    Bonsoir,

    J'utilise POSTGRES 9.4. Le soucis, à chaque génération, j'ai: "la séquence n'est pas géré." Pourtant dans le changelog de la version 9.1.4, il est indiqué que c'était pris en charge. Je vais investir un peu plus de ce côté là... ce n'est pas le plus important.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Rebonsoir champomy62,




    UTILISER va jouer le rôle de référentiel de produits, de catalogue pour les sites. Si UTILISER restait une association, vous ne pourriez pas l’associer avec des entités-types telles que SITE, je ne sache pas en effet que DB-MAIN propose le concept d’agrégation (rien à voir avec celui d’UML) au sens de Smith & Smith (1978), repris notamment par Silberschatz et Korth : autrement dit, UTILISER va devenir une entité-type (que je renomme CATALOGUE pour la circonstance, mais sans doute trouverez-vous un terme plus approprié).

    Maintenant, est-il préférable de définir pour CATALOGUE ex nihilo un identifiant supplémentaire qui fasse l’objet d’une clé primaire au niveau relationnel ?

    Quelques éléments de réflexion :

    Scénario 1. Définissons un nouvel attribut CatalogueId, qui devienne l’identifiant de l’entité-type CATALOGUE. Plaçons-nous au niveau relationnel et supposons que la table SITE soit en relation directe avec la table CATALOGUE, de clé primaire {CatalogueId} (à noter que le triplet {FabricantId, ModeleId, LogicielId} est toujours clé, mais alternative). Si pour un site on a besoin de connaître le nom (ou autre caractéristique) du logiciel il faudra effectuer une jointure de la table SITE avec la table CATALOGUE et la table LOGICIEL (même principe pour les modèles et les fabricants). En outre, la table CATALOGUE étant dotée d’une clé nouvelle, le SGBD créera un index supplémentaire (attention, les ajouts seront plus coûteux, la performance est pénalisée). Si le modèle M1 du fabricant F1 est associé au logiciel L1, et s’il faut remplacer L1 par L2 dans cette association, l’update correspondant n'a pas d'impact sur la table SITE.

    Scénario 2. Si on n’a pas défini l’attribut CatalogueId, l’identifiant de l’entité-type CATALOGUE reste le triplet {FabricantId, ModeleId, LogicielId}. Pour récupérer le nom du logiciel, on aura une jointure en moins, puisqu’il suffira de joindre SITE et LOGICIEL. La table CATALOGUE n’étant pas dotée d’une clé nouvelle, le SGBD n’aura pas à créer d’index supplémentaire (on est moins pénalisé en mise à jour). Si le modèle M1 du fabricant F1 est associé au logiciel L1, et s’il faut remplacer L1 par L2 dans cette association, l’update correspondant est à répercuter sur la table SITE : cela reste transparent pour les applications, à condition de prévoir ON UPDATE CASCADE pour la contrainte référentielle établie entre SITE et CATALOGUE. S’il y a peu de modifications de ce genre, du point de vue des performances ça n’est pas un problème. Par contre, si elle sont fréquentes et touchent de nombreux sites, attention.

    En gros, avantage au scénario 2, sauf si les modèles sont souvent détricotés des logiciels.


    Scénario 1

    
    create table CATALOGUE 
    (
         CatalogueId int not null,
         FabricantId int not null,
         ModeleId int not null,
         LogicielId int not null,
         constraint ID_CATALOGUE primary key (CatalogueId),
         constraint AK_CATALOGUE unique (FabricantId, ModeleId, LogicielId),
         constraint FK_CAT_MOD foreign key (FabricantId, ModeleId)
             references MODELE (FabricantId, ModeleId),
         constraint FK_CAT_LOG foreign key (FabricantId, LogicielId)
             references LOGICIEL (FabricantId, LogicielId)
    ) ;
    
    Create table SITE
    (
         SiteId int not null,
         SiteNom varchar(32) not null,
         CatalogueId int not null,
         constraint ID_SITE primary key (SiteId), 
         constraint FK_SITE_CAT foreign key (CatalogueId)
             references CATALOGUE (CatalogueId)
    ) ;
    
    

    Scénario 2

    
    create table CATALOGUE 
    (
         FabricantId int not null,
         ModeleId int not null,
         LogicielId int not null,
         constraint ID_CATALOGUE primary key (FabricantId, ModeleId, LogicielId),
         constraint FK_CAT_MOD foreign key (FabricantId, ModeleId)
             references MODELE (FabricantId, ModeleId),
         constraint FK_CAT_LOG foreign key (FabricantId, LogicielId)
             references LOGICIEL (FabricantId, LogicielId)
    ) ;
    
    Create table SITE
    (
         SiteId int not null,
         SiteNom varchar(32) not null,
         FabricantId int not null,
         ModeleId int not null,
         LogicielId int not null,
         constraint ID_SITE primary key (SiteId), 
         constraint FK_SITE_CAT foreign key (FabricantId, ModeleId, LogicielId)
             references CATALOGUE (FabricantId, ModeleId, LogicielId)
             on update cascade
    ) ;
    
    





    Rien n’interdit d’ajouter des attributs à l’association. C’est plutôt le fait d’avoir à définir des associations d’associations qui pousse à la transformation.
    Rebonsoir,

    Vous confirmez ma pensée. Je vais opter pour la solution 2 car les mises à jour ne sont pas si fréquentes que ça. Tout au plus quelques fois dans l'année.

    Par contre je suis étonnée lorsque vous dites:
    Si le modèle M1 du fabricant F1 est associé au logiciel L1, et s’il faut remplacer L1 par L2 dans cette association, l’update correspondant est à répercuter sur la table SITE : cela reste transparent pour les applications, à condition de prévoir ON UPDATE CASCADE pour la contrainte référentielle établie entre SITE et CATALOGUE.
    Mon professeur m'a toujours dit: on ne modifie jamais une clé primaire. Pourquoi serait possible dans le cas d'une association ?

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par champomy62 Voir le message
    Bonsoir,

    J'utilise POSTGRES 9.4. Le soucis, à chaque génération, j'ai: "la séquence n'est pas géré." Pourtant dans le changelog de la version 9.1.4, il est indiqué que c'était pris en charge. Je vais investir un peu plus de ce côté là... ce n'est pas le plus important.
    Pour information, j'ai trouvé comment faire. Aller dans le menu "FILE/GENERATE" et selectionnez votre SGBD. (ACCESS, MySQL, Postgres...)

  20. #20
    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
    Mon professeur m'a toujours dit: on ne modifie jamais une clé primaire. Pourquoi serait possible dans le cas d'une association ?
    Ce qu'il ne faut jamais modifier, c'est un identifiant, donc une clé primaire d'une table issue d'une entité-type du MCD. Mais cette interdiction ne s'applique évidemment pas aux tables associatives puisque leur clé primair est composée de clés étrangères. La clé primaire n'est pas un identifiant mais une référence aux tables entrant en jeu dans l'association.
    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 !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/04/2012, 20h18
  2. Trouver valeurs d'une table n'existant pas dans une autre table
    Par aliasjcdenton dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/10/2011, 10h41
  3. Réponses: 2
    Dernier message: 03/04/2010, 22h32
  4. Réponses: 4
    Dernier message: 01/06/2007, 13h54
  5. Réponses: 6
    Dernier message: 27/08/2006, 18h57

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