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

 PostgreSQL Discussion :

question sur l'héritage


Sujet :

PostgreSQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut question sur l'héritage
    Bonjour,

    je suis en train de faire une application qui me demande de passer par l'héritage. Pour simplifier, j'ai une table parent "produit" et beaucoup de tables (plus de 100) enfant "produit1 produit2 ..."

    Je pourrais le gérer sans héritage avec des clé étrangére et des jointures mais c'est vraiment pas pratique et l'héritage simplifierait les choses.

    De plus je ne sais pas si une jointure avec plus de 100 tables est très efficace...

    Voici mon problème :

    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
     
    CREATE TABLE produit
    (
      id numeric NOT NULL,
      "name" text,
      CONSTRAINT "PK" PRIMARY KEY (id)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE produit OWNER TO postgres;
     
     
    CREATE TABLE produit1
    (
    -- Geerbt from table produit1:  id numeric NOT NULL,
    -- Geerbt from table produit1:  "name" text,
      capacite numeric,
      CONSTRAINT "PK2" PRIMARY KEY (id)
    )
    INHERITS (produit)
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE produit1 OWNER TO postgres;
     
     
    CREATE TABLE produiit2
    (
    -- Geerbt from table produiit2:  id numeric NOT NULL,
    -- Geerbt from table produiit2:  "name" text,
      epaisseur numeric,
      CONSTRAINT "PK3" PRIMARY KEY (id)
    )
    INHERITS (produit)
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE produiit2 OWNER TO postgres;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO produiit2(
                id, "name", epaisseur)
        VALUES (2, 'planche', 18);
    INSERT INTO produiit2(
                id, "name", capacite)
        VALUES (1, 'classeur', 100);
    Jusque l'à tout va bien.

    Apres je veux faire un select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
      FROM produit;
    j'obtiens :
    1;"classeur"
    1;"planche"

    Ca semble cohérent.

    Mais n'est il pas possible d'obtenir aussi les colonnes Capacité et épaisseur en sélectionnant la table produit et sans faire de jointures ?

    Que j'obtienne cela :

    1;"classeur";NULL;100
    1;"planche";18;NULL

    Sur le même principe j aimerais faire un select comme ceci sans jointure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from produit where capacite =100
    mais bien sur écrit comme ceci il me dit que la colonne n'éxiste pas.

    Est ce qu'une solution éxiste ou il faut passer par les jointures obligatoirement ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Des jointures à 100 tables, ça ressemble plus à un problème qu'à une solution... Le SGBD va avoir beaucoup de mal avec.
    Il semble que l'utilisation de l'héritage dans cette conception de base ne soit pas forcément une bonne idée.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    ok, et dans mon cas présent tu ferais comment ?

    Pour décrire vite fait, j'ai une table parent avec environ 12 attributs et une les tables enfants avec maximum 4 ou 5 attributs supplémentaires.

    Mon idée pour éviter héritage et jointure serait de faire une seule table avec 13 attributs. Le dernier serait un string avec les 4 ou 5 attributs spécialisant concaténés en CSV. C'est pas élégant mais je vois pas comment faire autrement...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    En préambule, il est difficile de donner des conseils de conception de schéma sans la connaissance globale du problème à résoudre.
    Néanmoins ce que m'inspire ces attributs de "produits", c'est que peut-être une organisation de type EAV, c.a.d des triplets (produit, nom ou id du champ, valeur du champ) pourrait peut-être convenir mieux qu'une concaténation dans un seul champs.
    Le modèle EAV peut être très pratique ou catastrophique à l'usage, ça dépend de l'ensemble des requêtes qu'on veut pouvoir faire avec, il faut bien cerner ça en phase de conception.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    Je pense commencer avec le csv et puis si jamais je vois que le projet fonctionne je changerais le modèle pour un autre.

    Passer d'un champ csv au modèle que t'as expliqué ne doit pas être trop compliqué je pense, au niveau de la base de données en tout cas.

  6. #6
    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
    J'ai l'impression que tu essaies de spécialiser outre mesure tes produits.

    Il semble que tes tables produitX ne contiennent que quelques propriétés spécifiques aux produits.

    Ne serait-il pas plus simple de partir de ce schéma (MCD) ?
    Produit -0,n----Avoir----0,n- Caractéristique

    Ce qui donnerait les tables suivantes :
    produit (p_id, p_name, p_autresColonnesCommunesATousLesProduits...)
    caracteristique (c_id, c_name...)
    produit_caracteristique (cp_id_produit, cp_id_caracteristique, cp_valeur...)

    Et les lignes suivantes dans les tables (reprises des données de ton exemple) :
    produit (p_id, p_name...)
    (1, 'classeur'...)
    (2, 'planche'...)

    caracteristique (c_id, c_name...)
    (1, 'capacite'...)
    (2, 'epaisseur'...)

    produit_caracteristique (cp_id_produit, cp_id_caracteristique, cp_valeur...)
    (1, 1, 100...)
    (2, 2, 18...)
    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 !

Discussions similaires

  1. Questions sur l'héritage multiple
    Par beegees dans le forum C++
    Réponses: 12
    Dernier message: 31/03/2008, 17h01
  2. Question sur l'héritage (débutant en C++)
    Par beegees dans le forum C++
    Réponses: 19
    Dernier message: 30/03/2008, 14h45
  3. petite question sur l'héritage et les cast
    Par baedal dans le forum Langage
    Réponses: 3
    Dernier message: 29/02/2008, 00h48
  4. Questions sur l'héritage dans Matisse
    Par Cassios dans le forum NetBeans
    Réponses: 8
    Dernier message: 14/03/2007, 23h23
  5. Question sur l'héritage
    Par the big ben 5 dans le forum Delphi
    Réponses: 28
    Dernier message: 06/06/2006, 17h27

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