PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 01/05/2014 16:23:43

tatou
Membre

héritage , des tables , containtes clé étrangére

Bonjour postgresql ¨Pro smile,

J'aimerais concepter ma base de données en utilisant l'héritage j'éssaye avec un petit exemple :

---------------- Table: mere  qui références à une table num et a deux fils--------------------------------

-- DROP TABLE mere;

CREATE TABLE mere
(
  id serial NOT NULL,
  num integer,
  nbre integer,
  CONSTRAINT mere_pkey PRIMARY KEY (id),
  CONSTRAINT mere_num_fkey FOREIGN KEY (num)
      REFERENCES num (num) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE mere
  OWNER TO postgres;

------------------ Table: num------------------------------------

-- DROP TABLE num;

CREATE TABLE num
(
  num integer NOT NULL,
  CONSTRAINT num_pkey PRIMARY KEY (num)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE num
  OWNER TO postgres;

-- -----------------------Table: fils1------------------------------------------------

-- DROP TABLE fils1;

CREATE TABLE fils1
(
-- Hérité(e) from table mere:  id integer NOT NULL DEFAULT nextval('mere_id_seq'::regclass),
-- Hérité(e) from table mere:  num integer,
-- Hérité(e) from table mere:  nbre integer,
  statu integer,
  CONSTRAINT fils1_pkey PRIMARY KEY (id)
)
INHERITS (mere)
WITH (
  OIDS=FALSE
);
ALTER TABLE fils1
  OWNER TO postgres;

-- -----------------------------------Table: fils2-------------------------------------------------

-- DROP TABLE fils2;

CREATE TABLE fils2
(
-- Hérité(e) from table mere:  id integer NOT NULL DEFAULT nextval('mere_id_seq'::regclass),
-- Hérité(e) from table mere:  num integer,
-- Hérité(e) from table mere:  nbre integer,
  moy integer,
  CONSTRAINT fils2_pkey PRIMARY KEY (id)
)
INHERITS (mere)
WITH (
  OIDS=FALSE
);
ALTER TABLE fils2
  OWNER TO postgres;

mon probléme est que les deux tables fils n'héritent pas la contrainte de la clé étrangére , ni les données de la table mere   sad
je serais rreconnaissante si tu peux m'aider de le résoudre
merci d'avance pour ton aide appréciée

Hors ligne

#2 01/05/2014 17:33:29

gleu
Administrateur

Re : héritage , des tables , containtes clé étrangére

Les contraintes ne sont pas héritées, il n'y a pas grand-chose que vous pourrez faire pour ça. Concernant les données, je n'ai pas compris ce que vous vouliez dire.


Guillaume.

Hors ligne

#3 01/05/2014 17:48:42

tatou
Membre

Re : héritage , des tables , containtes clé étrangére

merci gleu pour ta réponse
au fait j'ai choisi l'héritage pour éliminer la répétition des données puisque les données dans la table mére sont les mem dans les tables fils afin de perfomer la conception de la base de données alors je définis ainsi lec clés étrangéres dans la table mére ??

pour les données : quand je vais populer la table mére je veux que de mem les tables fils sera rempli avec les valeurs des champs table mére

Hors ligne

#4 01/05/2014 18:40:27

gleu
Administrateur

Re : héritage , des tables , containtes clé étrangére

OK, on va reprenrre en causant SQL, ça sera peut-être plus simple. Quand vous insérez des données dans la table mère, vous faites quoi comme requête ?


Guillaume.

Hors ligne

#5 01/05/2014 18:59:13

tatou
Membre

Re : héritage , des tables , containtes clé étrangére

des requêtes imbriquées  et des requets select paramétré

je vais insérer des données dans la tables fils alors la table mére sera remplie en respectant l'héritage
de mem je veux que les clés étrangéres  seront héritées dans les tables fils

exple de requete :

select attribut1

from table (table dont le quel référence la table mére )

where   clé_étrangére de la table fils = clé primaire de la table référencée  //  ça cause un erreur car la table fils n'hérite pas la clé étrangére !!

Hors ligne

#6 01/05/2014 19:13:11

gleu
Administrateur

Re : héritage , des tables , containtes clé étrangére

Alors, les (im)possibilités de PostgreSQL avec l'héritage :

* pas d'utilisation de clé primaire globale (une clé primaire dépend d'un index, or un index ne peut pas s'étendre sur plusieurs tables)
* pas d'utilisation de clé étrangère (elle dépend d'une contrainte unique, qui dépend d'un index, or un index ne peut pas s'étendre sur plusieurs tables)
* un insert sur une table enregistre la donnée dans la table indiquée (donc dans la table mère si l'insert se fait sur la table mère ou dans la table fille si elle se fait sur la table fille... mais pas dans les deux, sauf à avoir un trigger qui gère ça)


Guillaume.

Hors ligne

#7 01/05/2014 19:54:39

tatou
Membre

Re : héritage , des tables , containtes clé étrangére

merci gleu pour ces explications smile
alors tu me recommande de travailler avec les clés étrangéres tt en eliminat l'héritage et pour les indexes comment doit-on choisir les colonnes indexés ?
et concernant la répitition des données quel est son impact sur la performance de la base de données ??

Hors ligne

#8 02/05/2014 00:14:30

gleu
Administrateur

Re : héritage , des tables , containtes clé étrangére

Je n'ai malheureusement aucune information pour recommander telle ou telle solution. Il est clair par contre qu'il faut une véritable raison pour utiliser le partitionnement dans PostgreSQL, raison que vous n'avez pas encore donné.

PS : j'ai bien reçu votre mail. Il est préférable de continuer sur le forum, cela permet aux autres de participer.


Guillaume.

Hors ligne

#9 02/05/2014 00:24:03

tatou
Membre

Re : héritage , des tables , containtes clé étrangére

merci gleu pour ton aide
tu peux encore m'expliquer le concept partitionnement postgresql;  j'ai cherché sur le site officiel du postgreSQFR mais  j'arrive pas à le  comprendre !

Hors ligne

#10 02/05/2014 11:09:58

gleu
Administrateur

Re : héritage , des tables , containtes clé étrangére

Le partitionnement sur PostgreSQL est basé sur le concept d'héritage. L'héritage permet de déclarer les partitions. Le planificateur est capable de ne parcourir que les partitions nécessaires si ces dernières ont des contraintes CHECK sur la clé de partitionnement. En ce qui concerne les écritures, si elles se font sur la table mère, cette dernière doit avoir des règles ou des triggers qui vont rediriger l'écriture sur la bonne partition. Enfin, pour PostgreSQL, en dehors de l'héritage, ce sont des tables indépendantes. Du coup, pas d'index sur la table globale (ie la table mère et ses partitions)... du coup pas clé primaire et de contrainte unique globale.


Guillaume.

Hors ligne

Pied de page des forums