IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Existe-t-il une méthodologie pour avoir tout de suite la bonne requête ?


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Existe-t-il une méthodologie pour avoir tout de suite la bonne requête ?
    Bonjour

    Je développe le titre . J'avais "pondu" une requête" qui me donnait satisfaction avec le jeu de données que j'utilisais . hélas , patatras , avec un nouveau jeu fourni par mon client , ce ne réponds plus (pas) comme je l'espère . J'ai parcouru le site , feuilleté un certain nombre de bouquin sur SQL mais je n'ai pas trouvé de méthode pour concevoir une requête parfaite à la premiere écriture . Auriez vous des documents /liens qui pourraient me guider ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Tu ne précises pas ici quel a été le problème rencontré, mais quoi qu'il en soit je ne pense pas qu'il existe de méthode "universelle" pour avoir la bonne requête du premier coup, surtout si celle-ci est un tant soit peu complexe.

    Il y a tout de même des erreurs classiques, par exemple l'hypothèse du monde clos, qui fait qu'on ne choisit pas toujours la bonne jointure.
    la propagation des nuls dans des calculs, une jointure qui ramène plus de ligne que prévu et qui "fausse" les agrégats…

    Bref dès qu'un formule une hypothèse, par exemple un article a toujours une marque, un ticket de vente est toujours lié à un client, il convient de la vérifier (ici en vérifiant les cardinalités).

    Tatayo.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Effectivement , c'est sans aucun doute sur les choix de jointure que je pêche . Je sais quelles données je veux récuperer et que celles-ci sont réparties sur plusieurs tables et qu'il faut que je passe par des tables auxiliaires (lé schéma a été généré à partir de Django ). J'imagine que l'ordre dans lequel on enchaine les jointures à un impact . Pour parler concrétement , dans mon cas , les données que je veux sont dans 2 tables différentes mais ii faut que je passe par 4 tables supplémentaires pour avoir le résultat final.
    Je ne quand même assez surpris qu'il n'y ait pas une méthodologie pour la construction d'une requête .

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    un début de réponse ici ?

    https://sqlpro.developpez.com/cours/sqlaz/jointures/

    La jointure de multiples tables peut se représenter sous la forme d'un arbre. Cet arbre possède donc une racine, c'est la table principale, celle d'où l'on veut que l'information parte. Elle possède aussi des feuilles, c'est-à-dire des tables d'entités. Les tables situées entre la racine et les feuilles sont souvent des tables de jointure, possédant en principe deux clefs étrangères. Dans le principe toute table de jointure devrait être un nœud de l'arbre.
    La représentation arborescente d'une jointure est un excellent moyen pour visualiser si la clause de jointure de votre requête est à priori correcte. En effet, une référence circulaire dans la clause de jointure ne peut pas être représentée sous la forme d'un arbre et il y a fort à parier que la requête soit incorrecte.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par Pach30 Voir le message
    Je ne quand même assez surpris qu'il n'y ait pas une méthodologie pour la construction d'une requête .
    Ca dépend ce que vous entendez par méthodologie.
    En tout cas il y a plusieurs méthodologie de modélisation de base de données, et c'est là le nerf de la guerre.

    La méthodologie de construction de requête c'est de commencer par le début de votre besoin (une table client avec un client par exemple), et d'étendre au fur et à mesure en vérifiant à chaque nouvelle étape (que ce soit une jointure, un filtre, une expression) que le résultat est conforme à vos attentes.
    Comme vous l'avez compris, les données que vous regardez ne reflètent pas l'intégralité des règles de gestion à implémenter, c'est pour ça qu'une bonne modélisation avec contraintes est importante. Si en plus vous pouvez discuter avec des chefs de projets fonctionnel (ou PO/PM si vous êtes agile) qui vous donneront des règles plus exhaustives, ça vous permet d'être plus fin dans votre code.

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Déjà il faut que le modèle de données soit bien fait, ce qui est rarement le cas.
    La première chose à faire est de bien mettre au clair le besoin. Donc identifier les tables dans lesquelles se trouvent les informations dont on a besoin (et c'est souvent ça la grande difficulté quand on ne connait pas bien le modèle!).
    Une fois les tables identifiées, il faut savoir comment les joindre.
    Normalement quand je n'ai pas besoin des colonnes d'une table impliquée, je la place dans un semi-join (condition EXISTS). Si le besoin est un peu compliqué, alors il y a de très fortes chances que je fasse intervenir des fonctions analytiques. Ensuite ça peut-être parfois de la subtilité, par exemple transformer des conditions OR en UNION ALL, ou encore transposer des lignes en colonnes pour réduire la cardinalité. Ecrire des requêtes SQL c'est un peu comme de l'art. La quasi totalité des problèmes de performance viennent d'un modèle mal conçu et/ou de requêtes mal écrites.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Déjà il faut que le modèle de données soit bien fait, ce qui est rarement le cas.
    Bon , la , je commence mal déja puisque le modèle de donnée a été generé par "Django " ( quoique Reinhardt , c'était un artiste , non ? )

    La première chose à faire est de bien mettre au clair le besoin. Donc identifier les tables dans lesquelles se trouvent les informations dont on a besoin (et c'est souvent ça la grande difficulté quand on ne connait pas bien le modèle!).
    ici , je sais

    Une fois les tables identifiées, il faut savoir comment les joindre.
    ah , j'ai bien identifié la ou je coince

    Normalement quand je n'ai pas besoin des colonnes d'une table impliquée, je la place dans un semi-join (condition EXISTS). Si le besoin est un peu compliqué, alors il y a de très fortes chances que je fasse intervenir des fonctions analytiques. Ensuite ça peut-être parfois de la subtilité, par exemple transformer des conditions OR en UNION ALL, ou encore transposer des lignes en colonnes pour réduire la cardinalité. Ecrire des requêtes SQL c'est un peu comme de l'art. La quasi totalité des problèmes de performance viennent d'un modèle mal conçu et/ou de requêtes mal écrites.
    Pour l'instant , j'essaye le technique de l'arbre et ca m'a permis de progresser (par ex j'avais construit ma requête à l'inverse en partant des résultats que je voulais donc en descendant dans les tables plutôt que des données présentes à remonter dans le résultat )

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Citation Envoyé par Pach30 Voir le message
    Bon , la , je commence mal déja puisque le modèle de donnée a été generé par "Django " ( quoique Reinhardt , c'était un artiste , non ? )
    On serait plutôt Jango Edwards ici

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Pach30 Voir le message
    ... J'imagine que l'ordre dans lequel on enchaine les jointures à un impact ....
    Dans un bon SGBDR non (Microsoft SQL Server, Oracle, IBM DB2) dans un mauvais oui (PostGreSQL, MySQL...) L'optimiseur est là pour choisir l'ordre de jointure le plus judicieux pour économiser les ressources...

    Pour parler concrétement , dans mon cas , les données que je veux sont dans 2 tables différentes mais ii faut que je passe par 4 tables supplémentaires pour avoir le résultat final.
    Je ne quand même assez surpris qu'il n'y ait pas une méthodologie pour la construction d'une requête .
    Cela fait 5 jointures ce qui n'est pas le bout du monde. Cela ne devrait pas être lent si :
    1) la base est bien modélisée (respect des formes normales)
    2) la base est bien indexée
    3) l'optimiseur est de qualité

    Dans le pire des cas il existe des moyens d'optimiser encore plus comme les vues indexées par exemple.
    À lire : https://www.developpez.net/forums/d6...t/vue-indexee/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Existe t-il une documentation pour Blend ?
    Par Aniki dans le forum Autres langages pour le Web
    Réponses: 3
    Dernier message: 05/04/2007, 18h13
  2. Existe t il une fonction pour effacer une page
    Par teen6517 dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2007, 14h20
  3. Réponses: 1
    Dernier message: 10/09/2006, 16h09
  4. Comment modifie une requete pour avoir des sommes?
    Par F@ce27 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/06/2006, 13h47
  5. Réponses: 2
    Dernier message: 02/06/2006, 20h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo