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

Merise Discussion :

La notion d'héritage de MERISE 2 dans HyperFile


Sujet :

Merise

  1. #1
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut La notion d'héritage de MERISE 2 dans HyperFile
    Slt à tous,
    je suis apprenti developpeur et je veux apprendre à manipuler la notion d'héritage entre les fichiers de données dans HyperFile.
    Je suis confu quant à la procédure pour realiser l'analyse.
    Il s'agit de la répartition des enseignants d'une école dans les salles de classe.
    En fait, le système d'information comprend 2 types de personnel: l'enseignant permanent et l'enseignant vacataire. le fichier de données surtype Personnel forme avec Ecole une table de liaison qui permet d'affecter le personnel d'une école dans une salle de classe.

    Mais le souci que j'ai, c'est pouvoir savoir à un moment donné le type d'enseignant qui a été affecté dans une classe, avec une modélisation faisant appel à la notion d'héritage.

    J'ai proposé 2 solutions à ce système:
    1 qui intègre une table TypePersonnel, oû on représente les 2 types de personnel, cette table est reliée avec la table Personnel

    1 autre solution oû cette table est absente

    J'ai rattaché en images ces 2 analyses pour une meilleure compréhension.

    Est ce que j'ai bien procédé? Quelqu'un aurait il une meilleure proposition ou des conseils?

    Je vous remercie d'avance et surtout Bon développement !


    1ère analyse:
    Nom : Héritage avec.JPG
Affichages : 1267
Taille : 64,6 Ko

    2ème analyse:
    Nom : Héritage sans.JPG
Affichages : 1104
Taille : 54,7 Ko

  2. #2
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    712
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 712
    Points : 2 877
    Points
    2 877
    Par défaut
    Bonjour,

    La meilleure façon de bien analyser votre système d'information, c'est avant tout de réaliser un modèle conceptuel de données (MCD).
    Le problème de votre modèle, c'est qu'il se situe d'entrée au niveau logique (MLD), ce qui ne facilite pas la réflexion, surtout lorsqu'il s'agit d'intégrer la notion d'héritage.

    Voici à quoi ressemblerait votre modèle au niveau conceptuel :
    Nom : MCD lemagnifique.jpg
Affichages : 1209
Taille : 37,1 Ko

    Reste à savoir si cela correspond vraiment à ce que vous cherchez à modéliser ... En tout cas, il faut travailler sur cette base.
    Une fois le MCD validé, le MLD correspondant, ainsi que les requêtes de création du schéma relationnel de la base de données, pourront être générés automatiquement.
    Par exemple, voici le MLD généré pour le MCD ci-dessus :
    Nom : MLD lemagnifique.jpg
Affichages : 1108
Taille : 32,7 Ko

    Bonne continuation.

  3. #3
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut
    Slt et merci Patrick, pour votre réaction, et votre effort.

    Si on considère justement le MLD que vous proposez, qui fait abstraction de l'entité Type_personnel;
    comment on fait pour savoir quel type d'enseignant est affecté dans la classe a un moment donné ?

    C'est à ce niveau que se trouve ma difficulté.

    Merci d'avance !

  4. #4
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    712
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 712
    Points : 2 877
    Points
    2 877
    Par défaut
    Citation Envoyé par lemagnifique20 Voir le message
    Si on considère justement le MLD que vous proposez, qui fait abstraction de l'entité Type_personnel;
    comment on fait pour savoir quel type d'enseignant est affecté dans la classe a un moment donné ?
    Au niveau de l'héritage, on procède à une "spécialisation" : dans ce cas, la clé primaire des classes filles "Permanent" et "Vacataire" est en fait une clé étrangère associée à la clé primaire de la classe mère "Personnel".
    De cette manière, lorsqu'un personnel est assigné, on retrouve aisément s'il s'agit d'un permanent ou d'un vacataire.

  5. #5
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut
    Ah oui, je vois, en théorie. Mais Je n'arrive pas à visualiser clairement l'implémentation de ce procédé dans ce cas de specialisation avec plusieurs sous-types. C'est à dire de l'écriture de la requête afin de déterminer le personnel (permanent ou vacataire) en présence dans une classe.
    Une piste, je vous en prie!

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    En l'état, le modèle ne le permet pas : ce modèle permet de savoir qui peut intervenir dans quelle classe, mais il ne dit pas quand.

  7. #7
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    En l'état, le modèle ne le permet pas : ce modèle permet de savoir qui peut intervenir dans quelle classe, mais il ne dit pas quand.
    Slt à vous,

    Je ne cherche pas à savoir quand est-ce que le personnel est affecté dans une classe, mais quel sous type de la table Personnel est intervenu, et plus exactement l'implémentation (requête) pour l'obtention d'un tel résultat.

    Merci

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Cette formulation me gène

    Citation Envoyé par lemagnifique20 Voir le message
    Je ne cherche pas à savoir quand est-ce que le personnel est affecté dans une classe, mais quel sous type de la table Personnel est intervenu,
    Car encore une fois, avec ce modèle, on peut savoir qui peut intervenir, mais certainement pas qui est intervenu, nuance.
    Par ailleurs, ce modèle implique qu'une classe n'ait qu'un seul enseignant. Est-ce volontaire ? (pas de classe pluri-disciplinaire, pas de remplacement en cas de maladie...)
    Ce modèle permet également d'assigner un prof à une classe et à une école qui ne sont pas reliées (d'ailleurs vous n'avez établi aucun lien entre classe et école...)



    Citation Envoyé par lemagnifique20 Voir le message
    et plus exactement l'implémentation (requête) pour l'obtention d'un tel résultat.
    Avec ce modèle "en l'état" voici un exemple de requête :

    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
    select PE.nom
         , PE.prenom  
         , case when VA.id_personnel_vacataire is null
                then 'permanent'
                else 'vacataire'
           end as typeP
         , CL.designation
    from personnel as PE
    left outer join
         vacataire as VA
      on VA.id_personnel_vacataire = PE.id_personnel
    inner join assigner as AG
      on AG.id_personnel = PE.AG.id_personnel
    inner join classe as CL
      on CL.id_personnel=AG.id_personnel
    J'ai choisi de tester qu'il s'agit d'un employé ou d'un vacataire en faisant une jointure externe vers les vacataires, car j'ai supposé qu'ils étaient moins nombreux, la requête sera donc un poil plus performante dans ce cas qu'en faisant l'inverse.
    J'ai aussi modifié les noms des tables et colonnes pour supprimer les majuscules et caractères spéciaux : il n'est pas recommandé d'utiliser ce types de caractères dans les noms d'objet, ca complique inutilement les requêtes.

    Je reste convaincu qu'en l'état, un tel modèle conceptuel a peu de chance de correspondre à la réalité, à vous de le confirmer au travers de règles de gestion claires. Suiviez les conseils de Cinephil ici : https://blog.developpez.com/cinephil...te_g_modelisat

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    un modèle comme suit me semble plus proche de la réalité

    Pièce jointe 591046


    Ce qui donne le script suivant (ici après avoir choisi MySQL) :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    CREATE TABLE PE_pesonnel(
       PE_ident INT AUTO_INCREMENT,
       PE_nom VARCHAR(50) NOT NULL,
       PRIMARY KEY(PE_ident)
    );
    
    CREATE TABLE EC_ecole(
       EC_ident INT AUTO_INCREMENT,
       EC_nom VARCHAR(50) NOT NULL,
       PRIMARY KEY(EC_ident)
    );
    
    CREATE TABLE PV_vacataire(
       PE_ident INT,
       PV_taux DECIMAL(9,3) NOT NULL,
       PRIMARY KEY(PE_ident),
       FOREIGN KEY(PE_ident) REFERENCES PE_pesonnel(PE_ident)
    );
    
    CREATE TABLE PP_permanent(
       PE_ident INT,
       PV_matricule CHAR(6) NOT NULL,
       PRIMARY KEY(PE_ident),
       UNIQUE(PV_matricule),
       FOREIGN KEY(PE_ident) REFERENCES PE_pesonnel(PE_ident)
    );
    
    CREATE TABLE CL_classe(
       EC_ident INT,
       CL_ident INT AUTO_INCREMENT,
       CL_designation VARCHAR(50) NOT NULL,
       PRIMARY KEY(EC_ident, CL_ident),
       FOREIGN KEY(EC_ident) REFERENCES EC_ecole(EC_ident)
    );
    
    CREATE TABLE AF_affecter(
       PE_ident INT,
       EC_ident INT,
       CL_ident INT,
       CA_date DATE,
       PRIMARY KEY(PE_ident, EC_ident, CL_ident, CA_date),
       FOREIGN KEY(PE_ident) REFERENCES PE_pesonnel(PE_ident),
       FOREIGN KEY(EC_ident, CL_ident) REFERENCES CL_classe(EC_ident, CL_ident)
    );
    A enrichir en fonction des contraintes. Par exemple, un enseignant peut il enseigner dans plusieurs classes dans la même période ? A préciser dans vos règles de gestion

    J'ajoute le MLD au cas où vous seriez plus à l'aise avec ce type de représentation :
    Pièce jointe 591047

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

    Citation Envoyé par lemagnifique20 Voir le message
    Je ne cherche pas à savoir quand est-ce que le personnel est affecté dans une classe, mais quel sous type de la table Personnel est intervenu, et plus exactement l'implémentation (requête) pour l'obtention d'un tel résultat.
    Caveat : Tout ce qui suit a été réalisé avec SQL Server.

    Allons-y pour un procédé (il y en a d’autres...) pour voir les types de personnes affectés aux classes.

    Créons d’abord les tables, dans le style de ce qu’a généré Looping (post #2) :

    CREATE TABLE ECOLE
    (
            ecoleCode   CHAR(4)        NOT NULL
          , ecoleNom    VARCHAR(32)    NOT NULL 
        , CONSTRAINT ECOLE_PK PRIMARY KEY (ecoleCode) 
    ) ;
    
    CREATE TABLE PERSONNE 
    (
            personneCode   CHAR(4)        NOT NULL
          , personneNom    VARCHAR(32)    NOT NULL 
       , CONSTRAINT PERSONNE_PK PRIMARY KEY (personneCode) 
    ) ;
    
    CREATE TABLE PERMANENT 
    (
            personneCode   CHAR(4)        NOT NULL
          , niveauEtude    INT            NOT NULL
        , CONSTRAINT PERMANENT_PK PRIMARY KEY (personneCode) 
        , CONSTRAINT PERMANENT_PERSONNE_FK FOREIGN KEY (personneCode)
              REFERENCES PERSONNE  
    ) ;
    
    CREATE TABLE VACATAIRE 
    (
            personneCode   CHAR(4)        NOT NULL
          , tauxHoraire    INT            NOT NULL
        , CONSTRAINT VACATAIRE_PK PRIMARY KEY (personneCode) 
        , CONSTRAINT VACATAIRE_PERSONNE_FK FOREIGN KEY (personneCode)
              REFERENCES PERSONNE  
    ) ;
    
    CREATE TABLE ASSIGNER
    (
            personneCode   CHAR(4)        NOT NULL
          , ecoleCode      CHAR(4)        NOT NULL
        , CONSTRAINT ASSIGNER_PK PRIMARY KEY (personneCode, ecoleCode) 
        , CONSTRAINT ASSIGNER_PERSONNE_FK FOREIGN KEY (personneCode) 
              REFERENCES PERSONNE (personneCode)
        , CONSTRAINT ASSIGNER_ECOLE_FK FOREIGN KEY (ecoleCode) 
              REFERENCES ECOLE (ecoleCode)
    ) ;
    
    CREATE TABLE CLASSE
    (
            classeCode     CHAR(4)        NOT NULL
          , classeNom      CHAR(24)       NOT NULL
          , personneCode   CHAR(4)        NOT NULL
          , ecoleCode      CHAR(4)        NOT NULL
       , CONSTRAINT CLASSE_PK PRIMARY KEY (classeCode) 
        , CONSTRAINT CLASSE_ASSIGNER_FK FOREIGN KEY (personneCode, ecoleCode) 
              REFERENCES ASSIGNER (personneCode, ecoleCode)
    ) ;
    

    Assurons l’exclusion entre les sous-types PERMANENT et VACATAIRE.

    GO
    CREATE FUNCTION PERSONNE_TYPE_EXCLUSION()
    RETURNS INT  
    AS   
    BEGIN  
       DECLARE @n INT  
    
       SELECT @n = COUNT(*) 
       FROM   PERMANENT as x
         JOIN VACATAIRE as y ON x.personneCode = y.personneCode
    
       RETURN @n  
    END ;  
    GO  
    
    ALTER TABLE PERMANENT  
        ADD CONSTRAINT PERMANENT_EXCLUSION_CHK 
            CHECK (dbo.PERSONNE_TYPE_EXCLUSION() = 0) ;  
    
    ALTER TABLE VACATAIRE  
        ADD CONSTRAINT VACATAIRE_EXCLUSION_CHK 
            CHECK (dbo.PERSONNE_TYPE_EXCLUSION() = 0) ;  
    

    Une fonction pour connaître le rôle d’une personne :

    GO
    -- La fonction PERSONNE_TYPE a en entrée le code d'une personne
    -- et fournit en retour le type de celle-ci ('p' pour permanent,
    -- 'v' pour vacataire et '?' si elle n'est ni l'un ni l'autre).
    
    CREATE FUNCTION PERSONNE_TYPE(@personneCode char(4))
    
    RETURNS CHAR(1)
    AS 
    BEGIN
        DECLARE @n INT ;
      
        SELECT @n = COUNT(*) FROM PERMANENT WHERE personneCode = @personneCode      
        IF  @n > 0
            BEGIN
                RETURN 'p' 
            END
        ELSE
            SELECT @n = COUNT(*) FROM VACATAIRE WHERE personneCode = @personneCode      
            IF  @n > 0
                BEGIN
                    RETURN 'v' 
                END
        -- La personne n'est ni un permnent ni un vacataire
        RETURN '?'  
    END ;
    GO
    

    Un jeu d’essai :

    INSERT INTO ECOLE (ecoleCode, ecoleNom)
    VALUES
        ('e001', 'Ecole 1'), ('e002', 'Ecole 2')
      , ('e003', 'Ecole 3'), ('e004', 'Ecole 4')
    ;
    
    INSERT INTO PERSONNE (personneCode, personneNom)
    VALUES
        ('p001', 'Personne 1'), ('p002', 'Personne 2')
      , ('p003', 'Personne 3'), ('p004', 'Personne 4')
    ;
    
    INSERT INTO PERMANENT (personneCode, niveauEtude)
    VALUES 
        ('p001', 3) 
    ;
    INSERT INTO VACATAIRE (personneCode, tauxHoraire)
    VALUES 
        ('p002', 100), ('p004', 100)
    
    INSERT INTO ASSIGNER (personneCode, ecoleCode)
    VALUES
        ('p001', 'e001'), ('p001', 'e003')
      , ('p002', 'e001'), ('p002', 'e002')
      , ('p003', 'e001'), ('p003', 'e002'), ('p003', 'e004')
      , ('p004', 'e002'), ('p004', 'e003'), ('p004', 'e004')
    ;
    
    INSERT INTO CLASSE(classeCode, classeNom, personneCode, ecoleCode)
    VALUES
        ('c001', 'classe 1', 'p001', 'e001')
      , ('c002', 'classe 2', 'p001', 'e001')
      , ('c003', 'classe 3', 'p002', 'e001')
      , ('c004', 'classe 4', 'p002', 'e001')
      , ('c005', 'classe 5', 'p002', 'e002')
      , ('c006', 'classe 6', 'p004', 'e003')
      , ('c007', 'classe 7', 'p003', 'e002')
    ;

    Voyons voir le type de personne affecté à une classe :

    SELECT classeCode, personneCode, dbo.PERSONNE_TYPE(personneCode) as personneType
    FROM   CLASSE ; 
    =>

    classeCode    personneCode    personneType
     
    c001          p001            p
    c002          p001            p
    c003          p002            v
    c004          p002            v
    c005          p002            v
    c006          p004            v
    c007          p003            ?

  11. #11
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Cette formulation me gène


    Car encore une fois, avec ce modèle, on peut savoir qui peut intervenir, mais certainement pas qui est intervenu, nuance.
    Par ailleurs, ce modèle implique qu'une classe n'ait qu'un seul enseignant. Est-ce volontaire ? (pas de classe pluri-disciplinaire, pas de remplacement en cas de maladie...)
    Ce modèle permet également d'assigner un prof à une classe et à une école qui ne sont pas reliées (d'ailleurs vous n'avez établi aucun lien entre classe et école...)




    Avec ce modèle "en l'état" voici un exemple de requête :

    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
    select PE.nom
         , PE.prenom  
         , case when VA.id_personnel_vacataire is null
                then 'permanent'
                else 'vacataire'
           end as typeP
         , CL.designation
    from personnel as PE
    left outer join
         vacataire as VA
      on VA.id_personnel_vacataire = PE.id_personnel
    inner join assigner as AG
      on AG.id_personnel = PE.AG.id_personnel
    inner join classe as CL
      on CL.id_personnel=AG.id_personnel
    J'ai choisi de tester qu'il s'agit d'un employé ou d'un vacataire en faisant une jointure externe vers les vacataires, car j'ai supposé qu'ils étaient moins nombreux, la requête sera donc un poil plus performante dans ce cas qu'en faisant l'inverse.
    J'ai aussi modifié les noms des tables et colonnes pour supprimer les majuscules et caractères spéciaux : il n'est pas recommandé d'utiliser ce types de caractères dans les noms d'objet, ca complique inutilement les requêtes.

    Je reste convaincu qu'en l'état, un tel modèle conceptuel a peu de chance de correspondre à la réalité, à vous de le confirmer au travers de règles de gestion claires. Suiviez les conseils de Cinephil ici : https://blog.developpez.com/cinephil...te_g_modelisat
    Merci encore, pour tes conseils et tes efforts d'explication. J'en sors grandi, car comme je l'ai mentionné je suis débutant.

    Cependant, le cas qui est illustré, ne reflète aucunement une réalité. Il est pris à titre didactique, juste pour me permettre d'apprendre à manipuler sur windev, le concept de l'héritage des fichiers de données.

    Je vais essayer d'executer la requête que vous avez proposée et je vous tiens informer.

    Thanks

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Petit point d'attention, dans ma requête, les clefs étrangères issue de l'héritage avaient des noms issus du modèle initial (avec le suffixe id_personnel_vacataire ou id_personnel_permanent)
    Alors que dans les schémas MCD et MLD que j'ai proposés ensuite, je n'ai pas retenu cette option : l'identifiant du surtype "Personnel" et de ses deux sous-types "Permanent" et "Vacataire" portent le même nom "id_personnel"

  13. #13
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut
    Fsmrel, comme on dit chez nous, je te dois une bière.

    Merci pour ton déroulement, c'est plus élaboré et plus clair.

    Je vais le tester de mon côté, sous HyperFile.

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

    Merci pour la bière...

    Une variante de la fonction PERSONNE_TYPE (pas de recours à COUNT) :

    CREATE FUNCTION PERSONNE_TYPE(@personneCode CHAR(4))
    
    RETURNS CHAR(1)
    AS 
    BEGIN
        DECLARE @x CHAR(4) ;
    
        SET @x = (SELECT 'p'   
                  FROM PERMANENT WHERE personneCode = @personneCode)
    
        IF @x IS NOT NULL RETURN  @x
    
        SET @x = (SELECT 'v'   
                  FROM VACATAIRE WHERE personneCode = @personneCode)    
    
        IF @x IS NOT NULL RETURN @x
    
    -- La personne n'est ni un permanent ni un vacataire
    
        RETURN '?'
    
    END ;
    GO 

    On peut aussi utiliser une vue, par exemple :

    GO
    CREATE VIEW PERSONNE_V (personneCode, personneType) 
    AS
    SELECT personneCode, 'p' FROM PERMANENT
    UNION 
    SELECT personneCode, 'v' FROM VACATAIRE
    UNION
    SELECT personneCode, '?' 
    FROM PERSONNE as x
    WHERE NOT EXISTS (SELECT * FROM PERMANENT as y WHERE x.personneCode = y.personneCode) 
      AND NOT EXISTS (SELECT * FROM VACATAIRE as y WHERE x.personneCode = y.personneCode)
    ;
    GO
    Pour retrouver le type de personne dans le cas des classes :

    SELECT classeCode, classeNom, x.personneCode 
    FROM   CLASSE as x 
      JOIN PERSONNE_V as y ON x.personneCode = y.personneCode ; 

Discussions similaires

  1. Notion d'héritage dans access 2002
    Par wil4linux dans le forum Modélisation
    Réponses: 3
    Dernier message: 04/10/2007, 11h07
  2. Réponses: 19
    Dernier message: 29/05/2007, 17h21
  3. [2.0][C#] Héritage - Copie du père dans le fils
    Par Worldofdada dans le forum ASP.NET
    Réponses: 10
    Dernier message: 07/01/2007, 16h19
  4. Question sur les notion d'héritages
    Par shinrei dans le forum Débuter
    Réponses: 6
    Dernier message: 25/07/2006, 15h59
  5. Réponses: 2
    Dernier message: 04/12/2005, 22h10

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