Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 01/05/2014 16:23:43
- tatou
- Membre
héritage , des tables , containtes clé étrangére
Bonjour postgresql ¨Pro ,
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
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
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
Pages : 1