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 :

Une ou deux tables (champs communs) ? [MCD]


Sujet :

Schéma

  1. #21
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Oui donc je ne peux pas savoir en une requête sur une table (via mon API) si c'est un élève ou un prof (car je ne peux pas faire de jointure).

    Par contre effectivement pas de problème en SQL direct.

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


    Citation Envoyé par steve-movi Voir le message
    Le problème d'avoir deux tables distinctes c'est que lorsque mon utilisateur se logue il faut que je regarde dans les deux tables pour savoir si c'est un élève ou un prof... pas super optimisé.

    On récapépète : allons-y pour les 3 tables, en notant l’ajout de la colonne TypeUtilisateur dans l’en-tête de la table UTILISATEUR.

    TABLE UTILISATEUR
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE UTILISATEUR 
    (
      UtilisateurId           INT           NOT NULL,
      Nom                     VARCHAR(64)   NOT NULL,
      Prenom                  VARCHAR(64)   NOT NULL,
      Sexe                    CHAR(1)       NOT NULL,
      TypeUtilisateur         char(1)       NOT NULL,
      CONSTRAINT UTILISATEUR_PK PRIMARY KEY (UtilisateurId),
      CONSTRAINT UTILISATEUR_SEXE CHECK (Sexe IN ('F', 'M'),
      CONSTRAINT UTILISATEUR_TYPE CHECK (TypeUtilisateur IN ('P', 'E'))
    ) ;

    TABLE ELEVE
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE ELEVE
    (
            UtilisateurId           INT           NOT NULL
          , Moyenne                 INT           NOT NULL
        , CONSTRAINT ELEVE_PK PRIMARY KEY (UtilisateurId)
        , CONSTRAINT ELEVE_UTILISATEUR_FK FOREIGN KEY (UtilisateurId) REFERENCES UTILISATEUR (UtilisateurId)
              ON DELETE CASCADE
    ) ;

    TABLE PROFESSEUR
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE PROFESSEUR 
    (
            UtilisateurId           INT           NOT NULL
          , DateEmbauche            DATE          NOT NULL
          , FonctionId              INT           NOT NULL
       , CONSTRAINT PROFESSEUR_PK PRIMARY KEY (UtilisateurId)
       , CONSTRAINT PROFESSEUR_UTILISATEUR_FK FOREIGN KEY (UtilisateurId)REFERENCES UTILISATEUR (UtilisateurId)
             ON DELETE CASCADE
       , CONSTRAINT PROFESSEUR_FONCTION_FK FOREIGN KEY (FonctionId) REFERENCES FONCTION (FonctionId)
    ) ;

    On a créé une redondance, il faut donc la contrôler : on doit s’assurer que si c’est un élève qui se connecte, alors dans la table UTILISATEUR, l’utilisateur est bien du type élève (colonne TypeUtilisateur = 'E') et on doit le retrouver dans la table ELEVE. Le trigger associé à la table ELEVE évolue ainsi :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    CREATE TRIGGER ELEVE_PROF_XT ON ELEVE INSTEAD OF INSERT AS
     
    DECLARE @Count AS INT, @Err AS VARCHAR(128) ;
     
    SET @Count = (SELECT COUNT(*)
                  FROM   INSERTED AS x JOIN PROFESSEUR AS y ON x.UtilisateurId = y.UtilisateurId) 
    IF @Count > 0 
        BEGIN
            SET @Err = 'Tentative d’insertion d’un élève ayant même identifiant qu’un prof existant.'                           
            RAISERROR (@Err, 15, 1)
        END
    ELSE
        SET @Count = (SELECT COUNT(*)
                      FROM   UTILISATEUR AS x JOIN INSERTED AS y ON x.UtilisateurId = y.UtilisateurId 
                      WHERE  x.TypeUtilisateur = 'E')
        IF @Count = 0 
            BEGIN
                SET @Err = 'Table UTILISATEUR : pour un élève l’attribut TypeUtilisateur doit être égal à "E"'                         
                RAISERROR (@Err, 15, 1)
            END
        ELSE           
            INSERT INTO ELEVE
                   SELECT UtilisateurId, Moyenne
                   FROM   INSERTED 
    ;
    GO

    Même principe pour les profs.
    (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. #23
    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 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonsoir Steve,



    Citation Envoyé par steve-movi Voir le message
    Les services mobiles Azure ne permettent que de travailler sur des Tables. Donc lorsque je tente d'ajouter une Vue j'ai une erreur 500.
    Citation Envoyé par steve-movi Voir le message
    Je ne peux pas faire de jointure.
    Quel retour en arrière ! C’est quoi ces services ? Ça date des systèmes pré-relationnels des années soixante-dix ? Avez-vous droit à l’intégrité référentielle ? Aux contraintes CHECK dans les CREATE TABLE ? Aux triggers ? Aux fonctions ? Aux primitives de l’algèbre relationnelle (UNION, INTERSECTION, DIFFERENCE) ? Aux sous-requêtes ?
    (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.

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Désolé je n'avais pas eu la notification de réponse.

    Je parlais ici des API Azure standard, qui elles, ne gèrent que des tables.

    Par contre je me suis lancé dans la réalisation d'API personnalisées et je peux lancer les requêtes SQL que je souhaite. J'ai donc pu appliquer le modèle de donnée "optimum" à ma BDD et accéder/MAJ mes données via mes API personnalisées !

    Tout est nickel.

    Merci encore pour vos réponses et votre aide !

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


    Ouf ! Bonne route
    (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.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [WD14] Une fenêtre - deux tables à alimenter
    Par progscoubi dans le forum WinDev
    Réponses: 5
    Dernier message: 01/08/2011, 09h35
  2. Pour des commandes et réceptions de stock une ou deux tables?
    Par Patrick25300 dans le forum Bases de données
    Réponses: 5
    Dernier message: 10/02/2011, 18h17
  3. Réponses: 0
    Dernier message: 14/04/2010, 13h36
  4. Aide pour une requete, deux table, un champ commun.
    Par Space Cowboy dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/03/2007, 10h59
  5. Une requête, deux tables, fonction COUNT
    Par Nerva dans le forum Requêtes
    Réponses: 8
    Dernier message: 13/04/2006, 15h10

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