URL:
https://linuxfr.org/news/requetes-et-jointures-avec-pgmodeler-postgresql
Title: Requêtes et jointures avec pgModeler (PostgreSQL)
Authors: Maxzor
BAud, Ysabeau, ZeroHeure et Xavier Claude
Date: 2019-12-18T02:04:37+01:00
License: CC by-sa
Tags: base_de_données, modélisation, postgresql, requête, sql, nlidb et pgmodeler
Score: 6
Bon voilà, j’ai développé ce plugin pour pgModeler (C++/Qt), et envie de partager dans une petite dépêche.
Mes motivations principales étaient de pouvoir requêter dans mon logiciel de modélisation préféré bien entendu, et le fait que les logiciels de modélisation que je connais ne supportent pas les jointures existantes et/ou automatiques.
Votre requêteur SQL est cool ? Mais est-il cool [à ce point](
https://github.com/Maxzor/pgmodeler_plugins_media/blob/master/inference.gif) ?! :)
Rapide présentation de pgModeler
================================
pgModeler est un logiciel de modélisation de base de données. Bien que plutôt généraliste -- si on s’en tient à un Modèle Logique des Données -- il est spécialisé PostgreSQL. Il permet entre autres de :
- Construire par interface graphique un modèle de base de données (tables, schémas, rôles…), mais bien plus. En fait, il propose toutes les fonctionnalités offertes par PostgreSQL, allant jusqu’aux extensions PostGIS.
- Créer une base de données à partir d’un modèle : passer de la représentation à l’implémentation.
- À l’inverse, créer un modèle à partir d’une base de données.
- Comparer une instance PostgreSQL avec un modèle et produire -- voire réintégrer -- les différences entre schémas.
- Administrer sa base, avec un module riche, mais qui n’égalera sans doute pas PgAdmin.
- Produire un dictionnaire des données.
Des discussions sont en cours pour rendre pgModeler nativement compatible avec les autres SGBDR grâce à l'excellent ETL [pgLoader](
https://pgloader.io/).
----
[Site officiel de pgModeler](
https://pgmodeler.io)
[Dépôt github de pgModeler](
https://github.com/pgmodeler/pgmodeler)
[Dépôt github du plugin Requêteur graphique ](
https://github.com/maxzor/plugins/tree/master/graphicalquerybuilder)
[Cui-cui officiel](
https://twitter.com/pgmodeler)
[Reddit](
https://www.reddit.com/r/pgmodeler/)
----
Présentation du requêteur graphique
===================================
Le requêteur graphique est un plugin pour pgModeler. La sortie officielle de ce plugin coïncide avec celle de la version 0.9.2 stable de pgModeler : c’est l’occasion de rappeler ces liens vers [l’annonce officielle](
https://twitter.com/pgmodeler) et [la liste des changements](
https://github.com/pgmodeler/pgmodeler/blob/develop/CHANGELOG.md).
Le requêteur graphique consiste en deux modules :
- Le **cœur**, qui permet de construire des requêtes SQL à partir des entités graphiques du modèle – tables, colonnes et relations.

- Le **moteur d’inférence de jointures**, qui, à partir de tables dans la clause `select`, propose une liste de jointures complètes possibles, classées par coût total.

Alors que le cœur est très classique et n’apporte pas grand-chose par rapport aux requêteurs graphiques de Microsoft Access, SQLServer Management Studio, PgAdmin3 ou autres Active query builder d’Activedbsoft… la partie solveur de jointures est plus intéressante et nous allons nous y attarder un peu ici.
Solveur de jointures
====================
Une vidéo de présentation (en anglais) tout aussi complète que la section suivante est [disponible ici](
https://tube.tux.ovh/videos/watch/ee0cba13-eeb0-49a1-bb8c-480c8567a254). Le README github (en anglais aussi) est aussi équivalent. La vidéo comporte en plus une partie guide d’utilisation.
Fonctionnement
--------------
Le solveur de jointures reçoit comme _entrée_ un **ensemble de tables à relier**, et _produit_ une **liste de chemins valides**, c’est-à-dire différentes façons de joindre ces tables.
La liste des chemins potentiels est triée par coût ascendant. Il y a une pondération par défaut, et il est possible de personnaliser celle-ci dans le menu paramètres du solveur.
Pendant la marche du solveur, un rapport d’avancement est affiché, et on peut arrêter le solveur s’il prend trop de temps. Il est aussi possible d’afficher en temps réel les tables inspectées (c’est le deuxième GIF du README du repo du plugin); et d’en apprendre plus sur l’algorithme. Parlons algorithmes justement!
Algorithmes
-----------
Ce plugin fait appel à différents algorithmes de graphes relativement simples.
Pour le mode manuel (sans solveur), la construction de la requête a recours à un [tri topologique](
https://fr.wikipedia.org/wiki/Tri_topologique), qui repose sur une implémentation du [parcours en profondeur](
https://fr.wikipedia.org/wiki/Algorithme_de_parcours_en_profondeur).
Pour le mode automatique (l’inférence), d’autres algorithmes entrent en jeu via les bibliothèques [Boost](
http://boost.org) et [Paal](paal.mimuw.edu.pl/) :
- une [découverte des tables connectées](
https://en.wikipedia.org/wiki/Connected-component_labeling) (via DFS) ;
- une recherche sur les [arbres de Steiner](
https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arbre_de_Steiner) dans le cas de trois tables ou plus à joindre ;
- un parcours de chemins les plus courts, via l'[algorithme de Dijkstra](
https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra) notamment ;
- un tri topologique pour finir, comme dans le cas manuel.
Quelques bases algorithmiques sont posées, on peut pour la suite envisager des choses bien plus intéressantes ! Je pense aux [réseaux de flot](
https://fr.wikipedia.org/wiki/R%C3%A9seau_de_flot) et au [théorème flot-max/coupe-min](
https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_flot-max/coupe-min) pour les `EXPLAIN ANALYZE` par exemple.
Bilan
-----
Le solveur a plus un statut expérimental -- c’était une stimulation intellectuelle sympathique dans sa conception -- que celui d’une fonctionnalité mature et éprouvée. L’algorithmique est plus que perfectible. Mais c’est surtout son intérêt qui reste à valider, et vos retours sont les bienvenus :
- dans les modèles simples, la valeur ajoutée par rapport au mode manuel n’est pas énorme ;
- dans les modèles complexes, le nombre de résultats renvoyés par le solveur, surtout sans paramétrage personnalisé, peut devenir désarmant.
Une fonctionnalité qui pourrait aider pour ce dernier type de modèle est celle des [calques multi-dimensionnels](
https://www.youtube.com/watch?v=eTHQ5EP2maU).
Ces calques contournent la limitation historique des bases de données relationnelles « table n - 1 schéma » pour en faire « table n - n calque ». Cela permettrait de stocker des états fonctionnels, des catégories de traitements ou de requêtes, dans un ensemble visuel… pour restreindre un _run_ du solveur à un tel ensemble.
Conclusion
==========
L’objectif initial de ce plugin était de ne plus avoir à se fader des `select` débiles. S’il peut servir à d’autres personnes c’est bien… et si les écoles pouvaient remplacer leurs Access dégueulasses par pgModeler dans leurs cours de conception de bases de données ça serait le rêve :D
Ce plugin est en version plus ou moins bêta : il ne devrait plus planter grossièrement, mais de nombreuses corrections mineures et plus importantes restent à faire. Une liste des améliorations envisagées est [disponible ici](
https://github.com/Maxzor/plugins/blob/master/graphicalquerybuilder/CONTRIBUTING.md), à vos claviers !
Au moment de la publication de cette dépêche [29/01/2020], le requêteur est sur le point d’être intégré au dépôt officiel, mais ce n’est pas encore tout à fait fini. Il n’est donc _pas encore distribué_ (binaires payants sur le site officiel, encore moins dépôts des distributions). Je vous suggère pour compiler d’utiliser la [branche 0.9.3-alpha de pgModeler](
https://github.com/pgmodeler/pgmodeler/tree/0.9.3-alpha) et la [branche develop du repo plugins](
https://github.com/pgmodeler/plugins/tree/develop).