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 :

Quel système de clé utiliser?


Sujet :

Schéma

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 116
    Points : 45
    Points
    45
    Par défaut Quel système de clé utiliser?
    Je désire utiliser l'héritage, regrouper dans la table "mère" les données communes et dans plusieurs tables filles les données particulières, dépendant du type de la table mère.

    Soit l'entité Conduite, entité mère.

    Soit les entités Conduite_gaz, Conduite_elec et Conduite_eau toutes trois enfant de Conduites et mutuellement exclusives. Pour relier les tables filles avec la table mère je dois stocker la clé primaire de la table fille, dans la table mère en tant que clé étrangère. Toutefois, vu qu'il y a trois possibilités de tables enfant comment faire?

    Soit je m'arrange pour que la clé primaire des table enfant soit de type elecxxxx, eauxxxx et gazxxxx et je sais d'après la clé primaire dans quelle table chercher les renseignements. Soit je dois mettre un attribut "type de conduite" dans la table mère et suivant la valeur de cet attribut chercher dans l'une ou l'autre des tables filles.

    Je ne pas trop quoi faire.

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


    Citation Envoyé par thibouille
    Soit je m'arrange pour que la clé primaire des table enfant soit de type elecxxxx, eauxxxx et gazxxxx et je sais d'après la clé primaire dans quelle table chercher les renseignements. Soit je dois mettre un attribut "type de conduite" dans la table mère et suivant la valeur de cet attribut chercher dans l'une ou l'autre des tables filles.
    Il faut éviter de donner une signification quelle qu’elle soit à la valeur prise par une clé primaire. En revanche, vous pouvez ajouter un attribut "type de conduite" à la table Conduite. Mais, il serait embêtant d’affecter la valeur "eau" à un tuple qui soit référencé par la clé de la table Conduite_Gaz (qu’il y ait de l’eau dans le gaz n’est jamais très bon...)

    Dans ces conditions, il serait prudent de mettre en œuvre des triggers permettant de s’assurer que le résultat de la jointure des tables Conduite et Conduite_Gaz soit vide si la valeur de TypeDeConduite est différente de "gaz", même principe pour les autres sous-types Conduite_Eau et Conduite_Electricite.
    (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 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,

    La réponse que je propose repose sur le concept de généralisation - spécialisation du modèle Entité-Association. L'héritage est le mécanisme qui permet de transmettre les caractéristiques d'une entité générique (ou sur-entité ou entité mère) à une ou plusieurs entités spécialisées (ou sous-entités ou entités filles). Quand on dit qu'on "veut utiliser l'héritage", c'est qu'en réalité le concept de généralisation - spécialisation apparait dans le MCD.

    Que dit le concept ? Que lorsqu'une entité est "fille de" une autre entité, le lien qui les relie est du type "est-un" (is-a) - par opposition aux autres liens entre entités qui sont du type "a-un" (has-a). Le terme "est-un" est à entendre dans le sens "est une sorte de". Par exemple, Conduite_gaz est une sorte de Conduite.

    Puisque la généralisation - spécialisation est avérée dans le cas des Conduites, on peut mettre en oeuvre le mécanisme d'héritage :

    L'entité spécialisée hérite de toutes les caractéristiques de l'entité générique.

    Qu'entend-on par caractéristique ? Les propriétés, évidemment, mais aussi les associations, les liens "a-un" et les liens "est-un". Et parmi les propriétés, il y a bien sûr l'identifiant (qui peut être un ensemble de propriétés).

    Donc si l'entité CONDUITE est identifiée par Numéro_Conduite, alors CONDUITE_GAZ, CONDUITE_ELEC et CONDUITE_EAU sont aussi identifiées par Numéro_Conduite.
    Si la CONDUITE n° 1 est une CONDUITE_GAZ, une occurrence de chacune de ces deux entités sera identifiée par "1", mais aucune occurrence identifiée par "1" n'existera dans les deux autres entités (car exclusion mutuelle des filles).

    Exemples (seules sont représentées les valeurs de Numéro_Conduite dans chacune des 4 entités) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CONDUITE GAZ ELEC EAU   Commentaire
    -------- --- ---- ---   -------------
    1        1              conduite gaz
    2            2          conduite élec
    3                 3     conduite eau
    4        4              conduite gaz
    Le mécanisme d'héritage, correctement dérivé du concept de gén-spé, se suffit à lui-même mais n'est pas très pratique. C'est pourquoi il est recommandé d'utiliser une propriété "Type de conduite" permettant de savoir immédiatement avec quelle table faire une jointure.

    Dernière précision pour le modèle physique : les attributs hérités ne sont évidemment pas dupliqués dans les sous-tables, seuls y figurent les attributs spécifiques.


    JPhi33
    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

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 116
    Points : 45
    Points
    45
    Par défaut
    JPhi33, vous ne pouvez pas savoir à quel point ce post me fait plaisir, c'est en effet la conclusion à laquelle j'étais arrivé, "tout seul comme un grand" après lecture des réponses que les différents participants m'ont fournies.

    C'est exactement de cette manière que j'ai implémenté ma BD. J'aurais pu trouver plus facile à gérer point de vue programmation mais bon, j'ai la fierté d'avoir fait ma BD la plus proche de ce que la théorie/bonne pratique aurait dicté.
    Je suis donc satisfait.

    Merci à tous !!

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par JPhi33
    C'est pourquoi il est recommandé d'utiliser une propriété "Type de conduite" permettant de savoir immédiatement avec quelle table faire une jointure.
    Certes. Mais n'oublions pas les effets de bord possibles au niveau opérationnel, faisant —comme je l’ai mentionné dans mon précédent message— que pour une conduite de type gaz, l’attribut TypeDeConduite de CONDUITE prenne à tort la valeur "eau". Il est donc nécessaire de prémunir, en mettant en œuvre une contrainte ad-hoc, c'est-à-dire une assertion selon la norme SQL (ou un trigger si le SGBD ne connaît pas l’instruction CREATE ASSERTION).

    Exemple d’assertion :
    Code : 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
    Create Assertion A1 Check 
    (Not Exists 
        (Select * 
         From   Conduite x 
         Where  x.TypeConduite = 'eau' 
         And    Exists (Select * 
                        From   ConduiteElectricite y 
                        Where  x.ConduiteId = y.ConduiteId
             Or Exists (Select * 
                        From   ConduiteGaz y  
                        Where  x.ConduiteId = y.ConduiteId))
      Union
        Select * 
        From   Conduite x 
        Where  x.TypeConduite = 'electricite'
        And    Exists (Select * 
                       From   ConduiteEau y 
                       Where x.ConduiteId = y.ConduiteId
           Or  Exists (Select * 
                       From   ConduiteGaz y           
                       Where  x.ConduiteId = y.ConduiteId))
      Union
        Select * 
        From   Conduite x 
        Where  x.TypeConduite = 'gaz'
        And    Exists (Select * 
                       From   ConduiteEau y 
                       Where  x.ConduiteId = y.ConduiteId
           Or  Exists (Select * 
                       From   ConduiteElectricite y 
                       Where  x.ConduiteId = y.ConduiteId))
     ) ;
    Le principe reste valable pour garantir les règles d'exclusion, de totalité et apparentées.
    (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. Réponses: 2
    Dernier message: 19/06/2009, 18h23
  2. Quel système de données utiliser ?
    Par titou624 dans le forum Décisions SGBD
    Réponses: 12
    Dernier message: 20/04/2009, 12h31
  3. Quel système utiliser : GUI ou web ?
    Par MaTHieU_ dans le forum Débats sur le développement - Le Best Of
    Réponses: 54
    Dernier message: 07/05/2007, 07h13
  4. Réponses: 10
    Dernier message: 16/04/2007, 17h45
  5. Quel système de construction de projets utiliser ?
    Par YéTeeh dans le forum Choisir un environnement de développement
    Réponses: 3
    Dernier message: 11/07/2006, 14h46

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