Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
Pages: 1
- Sujet précédent - QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS - Sujet suivant
#1 Tue 24 June 2014 14:34
- dungeonkeeper81
- Participant actif
- Lieu: Lausanne
- Date d'inscription: 12 Jan 2011
- Messages: 70
- Site web
QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Bonjour,
J'ai modélisé une relation un à plusieurs dans QGIS pour des données stockées dans PostGIS.
Ça fonctionne pas trop mal, hormis un petit soucis d'identifiant que je n'arrive pas à utiliser en type serial.
C'est là que vous allez peut-être pouvoir m'aider.
Si ça vous intéresse, je vous présente ma démarche et si vous avez des propositions d'améliorations, je suis preneur.
Je n'ai pas trouvé de tutoriels complet sur le web.
Contexte
Il s'agit de modéliser des tronçons (axes) routiers et de leurs assigner un ou plusieurs rapports de mesures acoustiques.
Données de base
- des tronçons routiers (table troncon, type données géométriques)
- des rapports de mesures acoustiques (table mesure, type données attributives)
Modèle de données
[img]http://img4.hostingpics.net/pics/928990mcd.jpg[/img]
Impossible d'utiliser troncon.id en type serial.
QGIS génére un message d'erreur car mesure.fk_troncon est de type integer.
Comment pourrais-je résoudre ce problème ?
Implémentation dans PostGIS/PostgreSQL
J'ai implémenté le modèle ci-dessus avec une contrainte de clef étrangère sur la table mesure.
ALTER TABLE mesure
ADD CONSTRAINT fk_troncon FOREIGN KEY (fk_troncon)
REFERENCES troncon (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION;
Implémentation dans QGIS
J'ai défini dans les propriétés du projet la relation suivante:
[img]http://img4.hostingpics.net/pics/336645propriete.jpg[/img]
Exploitation
Hormis un bug d'affichage des données au moment de leur création, la saisie dans QGIS est fonctionnelle.
Cependant la gestion des ID de la table troncon doivent se faire manuellement
[img]http://img4.hostingpics.net/pics/152703carte.jpg[/img]
Dernière modification par dungeonkeeper81 (Tue 24 June 2014 14:37)
Hors ligne
#2 Tue 24 June 2014 15:30
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Salut,
si j'ai bien compris, troncon.id est de [pseudo]type serial.
Tu peux changer son type en integer et changer sa valeur par défaut comme suit :
Code:
ALTER TABLE troncon ALTER COLUMN id SET DEFAULT nextval('seq_troncon'::regclass);
ou seq_troncon est le nom de la séquence liée a à colonne troncon.id.
Hors ligne
#3 Tue 24 June 2014 16:59
- dungeonkeeper81
- Participant actif
- Lieu: Lausanne
- Date d'inscription: 12 Jan 2011
- Messages: 70
- Site web
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Salut,
Merci pour cette information mais là n'est pas le problème.
J'ai déjà testé le type serial pour l'attribut troncon.id.
Dans ce cas de figure QGIS refuse les nouveaux enregistrement qui dépendent de cette clef.
Le message d'erreur indique que le type integer de l'attribut mesure.fk_troncon n'est pas compatible avec le type serial de l'attribut troncon.id.
Je ne sais pas quel type attribuer à la clef étrangère (mesure.fk_troncon) pour que cela fonctionne.
Hors ligne
#4 Tue 24 June 2014 21:18
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Salut,
ce que je te propose de faire c'est de convertir troncon.id en int
Code:
ALTER TABLE troncon ALTER Column id type integer
tu conservera l’incrémentation automatique de ta clef primaire et plus de problème de compréhension de la part de QGIS.
Dernière modification par tumasgiu (Tue 24 June 2014 21:20)
Hors ligne
#5 Wed 25 June 2014 13:56
- dungeonkeeper81
- Participant actif
- Lieu: Lausanne
- Date d'inscription: 12 Jan 2011
- Messages: 70
- Site web
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Merci pour les pistes tumasgiu, j'ai résolu mon problème grâce à vous.
J'ai défini troncon.id en type integer et je lui ai attribué une séquence
id integer NOT NULL DEFAULT nextval('troncon_id_seq'::regclass),
Il n'y a plus de problème de typage.
Et logiquement il faut enregistrer l'objet "parent" avant de lui assigner des données "enfants", sinon ça coince avec la valeur.
[img]http://img4.hostingpics.net/pics/377059nextval.png[/img]
Hors ligne
#6 Mon 19 January 2015 12:04
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Bonjour à tous,
je remonte ce sujet car je suis confronté au même "problème".
Pour reprendre l'exemple de dungeonkeeper81, j'aimerai pouvoir créer un tronçon et les mesures qui y font référence dans le même formulaire, sans devoir d'abord créer le tronçon.
Quelqu'un a-t-il une solution ? Ça nécessite que QGis récupère la valeur de la séquence attribuée au tronçon et la répercute dans les différentes lignes de la table mesure, créées en relation avec ce tronçon...
Merci d'avance pour vos retours éventuels.
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#7 Mon 19 January 2015 13:15
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 170
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Bonjour,
En remontant le file de la discussion (que je découvre) une remarque pour commencer:
Le type "serial" dans postgres/postgis n'est qu'un artifice créé pour simplifier la tache des gestionnaire de base de données.
En choisissant ce type cela créé automatiquement une clé primaire et une séquence.
Dans les faits si l'on veut créer proprement une clé primaire, il vaut mieux (c'est plus long mais on maitrise tout):
1 La séquence
Code:
CREATE SEQUENCE crue_interv_id_seq...
2 La table
Code:
CREATE TABLE crue_interv ( id integer NOT NULL DEFAULT nextval('crue_interv_id_seq'::regclass), …. CONSTRAINT crue_interv_fk_crue_fkey PRIMARY KEY (id) )
Sinon pour votre question, un trigger ne serait-il pas une piste à explorer?
On peut vraiment gérer pas mal de choses côté SGBD
Sylvain
Hors ligne
#8 Mon 19 January 2015 13:46
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Bonjour Sylvain,
merci pour votre réponse. Ma clé primaire est un bien un "integer" avec une valeur par défaut issue de la séquence.
Mon soucis ne se situe pas "coté base de données" mais bien du coté de QGis. Dans l’idéal, il faudrait que QGis insère la donnée référencée en base, récupère l'identifiant attribué à la ligne nouvellement créée et la répercute dans la clé étrangère des lignes filles.
Pour l'instant, j'ai beau retourner le problème dans tous les sens, je ne vois pas de solution (non programmée) me permettant d'utiliser un seul formulaire.
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#9 Mon 19 January 2015 14:53
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 170
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Je reste persuadé que ça peut se gérer côté BD:
Cela implique de gérer un peu de manière différente la saisie côté QGIS.
Au moment de l'INSERT d"un nouveau tronçon, le TRIGGER insert le nombre d'enregistrements dans les tables liées par la FK.
Ensuite ce n'est plus de la saisie, mais un UPDATE des info insérées par le TRIGGER
Hors ligne
#10 Thu 23 January 2020 19:41
- fabien_sig
- Juste Inscrit !
- Date d'inscription: 11 Jun 2018
- Messages: 2
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Bonjour,
Je rencontrer le même problème sur la version Qgis 3.10.
ERREUR: syntaxe en entrée invalide pour l'entier : « nextval(....) » au sein de la table intermédiaire.
Quelqu'un a t'il trouvé une solution ?
Hors ligne
#11 Fri 24 January 2020 07:11
- aguenec
- Participant occasionnel
- Lieu: Bretagne
- Date d'inscription: 13 Sep 2014
- Messages: 38
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Bonjour,
Voir cette discussion (https://georezo.net/forum/viewtopic.php?id=106599) qui évoque le sujet avec la solution suivante : Projet > Propriétés > Source de données > Cocher la case évaluer les valeurs par défaut depuis le fournisseur de données.
Bonne journée
Antoine
Hors ligne
#12 Mon 27 January 2020 14:13
- fabien_sig
- Juste Inscrit !
- Date d'inscription: 11 Jun 2018
- Messages: 2
Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS
Bonjour et Merci Antoine,
Le problème est partiellement résolu.
Bonne journée
Hors ligne
Pages: 1
- Sujet précédent - QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS - Sujet suivant