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

Langage SQL Discussion :

Comment contrôler le sous-type d'une table ?


Sujet :

Langage SQL

  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 Comment contrôler le sous-type d'une table ?
    Bonjour,

    J'ai une table qui représente différent type de personne grâce à une liaison vers une table type_personne :

    Personne(id,nom,prenom,typePersonneId (fk),email,etc...)
    Type_personne(id,nomType) //nomType contient : admin,user,moderateur,etc...

    Dans ma base de donnée, différentes tables pointe vers cette table Personne, cependant j'ai des liaisons qui en vrai vise plutôt un type de personne en particulier (exemple : administrateur), comment garantir depuis la liaison (clé étrangère) entre deux tables que ces l'id d'un administrateur que je veux ?
    Merci.

  2. #2
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Bonjour,

    normalement ce genre de cas peut être géré au niveau conceptuel par un héritage qui peut être géré au niveau physique par des tables comme dans l'exemple la : http://www.developpez.net/forums/d94...-heritage-mcd/
    Je vois deux solutions pour répondre à ton problème :
    - soit tu as le droit de modifier la structure de la bd et dans ce cas tu appliques ton héritage
    - soit tu n'as pas le droit de modifier, et tu vérifies le type de tes entités liées par des triggers (oninsert et onupdate)

    A+

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Le modèle est néanmoins correct, surtout si les différents types de personnes partagent les même propriétés.
    Vous pouvez obtenir - et donc filtrer - le type de chaque utilisateur avec une simple jointure sur la table des types.

    Donc pour n'obtenir que les admins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT p.*
    FROM Personne p
    INNER JOIN Type_personne tp 
        ON tp.id = p.typePersonneId 
    WHERE tp.nomType  = 'admin'

  4. #4
    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,

    J'ai un problème similaire... je m'explique peut être que vous pourrez me proposer d'éventuel solution :

    Je suis entrain d'essayer d'utiliser justement comme proposer par Tidus159 une notion d'héritage appeler : Class table inheritance. Cependant, à partir de la documentation (lien précédent) une note sur les performances y est mentionnée
    There is a general performance consideration with Class Table Inheritance: If the target-entity of a many-to-one or one-to-one association is a CTI entity, it is preferable for performance reasons that it be a leaf entity in the inheritance hierarchy, (ie. have no subclasses)
    Personnellement je comprend que : si l'entité cible d'une association plusieurs-à-un ou un-à-un est une entité CTI (Class table inheritance), pour des raisons de performances il est préférable que ce soit une entité de la hiérarchie (donc enfant ?), (pas de sous classe -> cela contredirai la dernière parenthèse...)

    Selon votre réponse, deux cas se présenteront :
    1)Vous me dites que la cible (lorsqu'elle concerne une CTI) doit être un enfant, pas de problème cela m'arrange car dans mon exemple précédent la clé étrangère pointera sur les sous-type : admin,modérateur... au besoin.
    2)Vous me dites que la cible (lorsqu'elle concerne une CTI) doit être le niveau (parent) le plus élevé, nous nous retrouvons dans la question du premier post.

    N'hésiter pas à m'apporter ne serait-ce qu'une piste... merci.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/10/2011, 18h30
  2. comment modifier le type d'une table?
    Par patchouli dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/01/2007, 10h49
  3. comment rechercher les derniers enregistrement d'une table ?
    Par hornetboy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/09/2005, 09h13
  4. Comment importer un document CSV dans une table MySql ?
    Par magic8392 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/02/2005, 11h03
  5. Comment avoir 2 clés primaires dans une table
    Par Guigui_ dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 18/01/2005, 08h29

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