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 14/08/2013 14:08:49

Conseils requête

Bonjour,


Tout d'abord, désolé pour le sujet du message : j'avoue avoir beaucoup peiné à trouver un titre résumant ma problématique... Si quelqu'un a une idée smile , lâchez-vous !


Voilà mon cas :


Je dispose d'une table operation_reseau reliée à 5 tables : geo_1, geo_2, geo_3, geo_4 et geo_5 avec les structures suivantes :


- operation_reseau (ope_id, ope_date, ope_commune, ope_commentaire)
- geo_1(gid, matricule, longueur, ope_id)
- geo_2(gid, matricule, longueur, ope_id)
- geo_3(gid, matricule, longueur, ope_id)
- geo_4(gid, matricule, longueur, ope_id)
- geo_5(gid, matricule, longueur, ope_id)


Le principe est que je peux avoir plusieurs enregistrements dans une table geo_x correspondant à un unique enregistrement dans la table operation_reseau (relation 1 - n). Deuxième point important : un enregistrement de la table operation_reseau ne peut faire référence qu'à une seule table geo_x.


Je souhaite écrire une requête qui me permette de mettre en forme un tableau du genre :



     ope_id    |     Table geo     |     Nombre d'enregistrements
------------------------------------------------------------------------
  1               |  geo_1             |   3
  2               |  geo_3             |   1
  3               |  geo_2             |   8
  4               |  geo_5             |   2


> Par exemple : l'enregistrement de la table operation_reseau dont ope_id = 1 fait référence à 3 enregistrements de la table geo_1.


Le souci est qu'il faudrait que je réussisse à détecter à quelle table geo_x un enregistrement donné de la table operation_reseau fait référence, puis à rapatrier le nom de la table dans la colonne Table geo de ma requête. J'ai déjà un bout de script mais le problème est que je ne tape que dans la table geo_1 et je ne récupère pas son nom :


SELECT a.ope_id, COUNT(geo_1.gid) AS "Nombre d'enregistrements"
 
FROM operation_reseau a 
 LEFT JOIN geo_1 b ON a.gid = b.ope_id

GROUP BY a.ope_id ;


Quelqu'un pourrait-il m'aider à compléter le script ?


Merci beaucoup d'avance,


Thomas

Dernière modification par Thomas Williamson (14/08/2013 14:10:09)

Hors ligne

#2 14/08/2013 14:51:25

arthurr
Membre

Re : Conseils requête

pour moi il y a un pbs de conception, mais peut être que je ne comprends pas assez bien ton problème ...
J’aurai fait 3 tables :
- operation_reseau(operation_reseau_id(PK), ...)
- geo(geo_id(PK), type_geo_id(FK), operation_reseau_id(FK), ...)
- type_geo(type_geo_id(PK), num_geo, ...)

avec dans la colonne num_geo de la table type_geo les X des tables geo_X (1,2,3,4, ...)

C'est à mon avis bcp plus simple par la suite pour faire tes comptages.
Concernant tes contraintes (un operation_reseau_id pour un seul type_geo_id, mais avec N lignes possibles) -> vérification à faire par trigger BEFORE INSERT, UPDATE

Hors ligne

#3 28/08/2013 17:02:42

SQLpro
Membre

Re : Conseils requête

Effectivement problème e conception gravissime ce qui se traduit par :
1) difficulté d'écrire des requêtes. D'où votre post...
2) performances dégradées...

Revoyez votre modèle pour un vrai MCD conforme à la normalisation et vous verrez que vous n'aurez plus de question à vous poser sur l'écriture des requêtes !

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

#4 29/08/2013 10:43:14

Re : Conseils requête

Bonjour,


Merci pour vos réponses. Merde alors, j'avais pourtant passé du temps sur la modélisation... Pour éclaircir un peu le sujet, je joins les liens vers le MCD (avec les cardinalités) et le modèle relationnel qui en découle (l'utilisation des balises img avec ces adresses ne marchent pas...). Je ne comprends pas bien la table intermédiaire geo dont parle arthurr puisque les cardinalités (1,1) n'impliquent pas la création de ce type de table, mais seulement d'une clé étrangère dans les tables geo_x. J'espère que ces schémas peuvent vous aider à me dire ce qui cloche.


Merci encore pour votre aide !


Thomas

Hors ligne

#5 29/08/2013 17:17:07

SQLpro
Membre

Re : Conseils requête

Dans votre CMD vous devez placer des verbes dans vos associations.... a, b, c, d, e, f ne veut rien dire.
Un MCD montre la sémantique d'articulation des entités informationnelles entres elles; Sans verbe, aucun intérêt !

1) si des entités portent les mêmes noms à un détail près (ici N allant de 1 à 6) et les mêmes colonnes, alors il y a certainement un défaut de conception
2) si en outre, la sémantique et la cardinalité des associations envers ces mêmes entités similaires, alors il y a un autre défaut de conception.

En tout état de cause vous n'avez effectivement besoij que d'une seule entité de nom geo, comportant en sus une colonne "geo_n" dont le domaine irait de 1 à 5 et est à rajouter à la clef de votre entité comportant déjà la colonne geo_gid.
Voter seule association entre geo et opération_reseau gardant la même, cardinalité.

Et rien ne vous empêche de rajouter à votre base les vues geo1, geo2, geo3 construite sur le modèle suivant :

CREATE VIEW V_geo_1
AS
SELECT geo_gid, geo_matricule, geo_longueur, ope_id
FROM  geo
WHERE  geo_n = 1

Lisez UML pour SQL aux éditions Eyrolles, un ouvrage consacré à la modélisation des bases de données co écrit par mon collègue Christian Soutou et moi même...

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

Pied de page des forums