URL: https://linuxfr.org/news/requetes-et-jointures-avec-pgmodeler-postgresql Title: RequĂȘtes et jointures avec pgModeler (PostgreSQL) Authors: Maxzor BAud, Davy Defaud, Ysabeau đ§¶, BenoĂźt Sibaud, claudex et ZeroHeure Date: 2019ćčŽ12æ18æ„T02:04:37+01:00 License: CC By-SA Tags: base_de_donnĂ©es, modĂ©lisation, postgresql, requĂȘte, sql, nlidb et pgmodeler Score: 64 Bon, voilĂ , jâai dĂ©veloppĂ© ce greffon pour pgModeler (C++/Qt), et jâai envie de le partager dans une petite dĂ©pĂȘche. Mes motivations principales Ă©taient de pouvoir effectuer des requĂȘtes dans mon logiciel de modĂ©lisation prĂ©fĂ©rĂ©, bien entendu, et le fait que les logiciels de modĂ©lisation que je connais ne prennent pas en charge les jointures existantes ou automatiques. Votre client 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 lâ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 systĂšmes de gestion de bases de donnĂ©es relationnelles (SGBDR) grĂące Ă lâexcellent extractoâchargeur ([ETL](https://fr.wikipedia.org/wiki/Extract-transform-load "Extract-transform-load")) [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 greffon de requĂȘtage 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 greffon pour pgModeler. La sortie officielle de ce greffon 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, SQL Server Management Studio, pgAdmin 3 ou autres Active Query Builder dâActive Database Software... 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 fichier README de 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 lâ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 dĂ©pĂŽt du greffon) et dâen apprendre plus sur lâalgorithme. Parlons algorithmes justement ! Algorithmes ----------- Ce greffon 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 des 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 multidimensionnels](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, etc., pour restreindre une exĂ©cution du solveur Ă un tel ensemble. Conclusion ========== Lâobjectif initial de ce greffon Ă©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 Microsoft Access dĂ©gueulasses par pgModeler dans leurs cours de conception de bases de donnĂ©es, ça serait le rĂȘve. :D Ce greffon 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 [28 janvier 2020], le requĂȘteur est sur le point dâĂȘtre intĂ©grĂ© au dĂ©pĂŽt officiel, mais ce nâest pas encore fait, il nâest donc _pas encore distribuĂ©_ (binaires payants sur le site officiel, encore moins dans les 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 _master_ de ma divergence des greffons](https://github.com/Maxzor/plugins).