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 :

Comment traduire un heritage dans un schema de base de données [MPD]


Sujet :

Schéma

  1. #1
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut Comment traduire un heritage dans un schema de base de données
    Bonjour,

    Je suis dans un cas classique, j'ai un Administrateur qui herite des proprietes et methodes de l'Utilisateur.

    On est en PHP, et les classes ressemble plus ou moins a ca (a titre d'exemple) :
    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
    class Utilisateur {
    
      private $ip;
      private $date;
    
      ...
    
    }
    
    class Administrateur {
    
      public $login;
      public $adresseMail;
      public $niveauDroits;
    
      ...
    
    }
    Dois-je faire une table Utilisateurs avec mes 2 champs puis une table admin avec ceux qui restent ?

    Une table admin avec tous les champs utilisateurs compris ?

    Merci de m'eclairer sur ce cas si vous avez des idees.
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  2. #2
    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
    Voir cet article de SQLPro pour commencer.

    Personnellement, je suis partisan de stocker dans la table héritière seulement l'identifiant de la table mère en tant que clé étrangère et clé primaire :
    Utilisateurs(U_Id, ...)
    Administrateurs(A_IdUtilisateur, ...)

    Ainsi, pas de redondance de données.
    Si tu as plusieurs types d'utilisateurs et que certaines requêtes se font sur l'utilisateur avec besoin d'aller chercher les attributs du sous-type, il peut être utile d'ajouter une colonne U_TypeUtilisateur dans la table Utilisateurs pour savoir quelle table héritière interroger.
    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 !

  3. #3
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Je vais lire l'article, depuis le temps qu'on me le conseille sur ce forum .

    Pour l'heritage, merci pour ton tuyau, je vais faire comme ca.

    EDIT :

    Si tu as plusieurs types d'utilisateurs et que certaines requêtes se font sur l'utilisateur avec besoin d'aller chercher les attributs du sous-type, il peut être utile d'ajouter une colonne U_TypeUtilisateur dans la table Utilisateurs pour savoir quelle table héritière interroger.
    Je ne comprend pas bien comment a vrai dire. Meme en ajoutant une colonne precisant le sous type, je ne peux pas choisir ma table dans la requete, il faut que je la connaisse avant non ?
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  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
    Citation Envoyé par keaton2000 Voir le message
    Je ne comprend pas bien comment a vrai dire. Meme en ajoutant une colonne precisant le sous type, je ne peux pas choisir ma table dans la requete, il faut que je la connaisse avant non ?
    Sans trop réfléchir, il est peut-être possible de bidouiller avec les métadonnées contenues dans Information_schema.

    Sinon le programme utilisateur peut lancer une première requête sur la table mère pour connaître le type de l'utilisateur puis en fonction du type interroger la bonne table fille pour récupérer les infos qui manquent.

    Autre technique, s'il n'y a pas trop de tables filles et si l'ensemble des tables ne représente pas un nombre de lignes trop conséquent : faire un LEFT OUTER JOIN sur toutes les tables filles. L'une d'elle enverra les bonnes infos.
    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 éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Merci pour ces propositions, j'en était reste a tapoter des lignes de codes qui ne marchent pas sur une page blanche

    Sans trop réfléchir, il est peut-être possible de bidouiller avec les métadonnées contenues dans Information_schema.
    Je ne vois pas bien comment, je peux grâce a cela récupérer la liste des tables, mais en choisir une en fonction de critères, la problématique semble la même que de table a table. Il me faudrait un exemple si possible ^^

    Sinon le programme utilisateur peut lancer une première requête sur la table mère pour connaître le type de l'utilisateur puis en fonction du type interroger la bonne table fille pour récupérer les infos qui manquent.
    C'est ce que je ferai en dernier recours si je ne trouve pas de solutions, mais j'avais espoir qu'une base de données bien conçue était capable de renvoyer des informations dans n'importe quel sens, c'est comme abandonner quelque part

    Autre technique, s'il n'y a pas trop de tables filles et si l'ensemble des tables ne représente pas un nombre de lignes trop conséquent : faire un LEFT OUTER JOIN sur toutes les tables filles. L'une d'elle enverra les bonnes infos.
    Cela reviendrai en fait a ne pas avoir d'héritage, c'est a dire a avoir tous mes éléments dans ma table utilisateurs avec toutes les propriétés de tous les sous-types, peut-être que si je choisi cette option, il serait plus simple de tout regrouper sans pseudo modélisation d'héritage ?

    Le choix est difficile.
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  6. #6
    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 keaton2000,

    Si cela peut t'aider, voici un panorama des différents cas de généralisation / spécialisation (concept qui correspond au mécanisme d'héritage).


    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

  7. #7
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Merci je vais regarder ca
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/04/2013, 04h04
  2. Réponses: 3
    Dernier message: 17/01/2013, 19h46
  3. Schema de base de données dans variable de contexte?
    Par lylau dans le forum Développement de jobs
    Réponses: 8
    Dernier message: 11/05/2009, 10h08
  4. Réponses: 4
    Dernier message: 15/05/2006, 15h54

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