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 :

Jointure ou pas?


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Jointure ou pas?
    Hello,

    Dans mon application, l'utilisateur est suceptible de vouloir récupérer un certain nombre d'objets avec un certain nombre de propriétés associées. Chaque objet est stocké dans une table TObjet, et l'ensemble des propriétés disponible est stocké dans d'autres tables. Exemple: la table TProp1 contient les propriétés P1, P2..., PN, la table TProp2 contient les propriétés PN+1,... PM etc... Chaque objet a un identifiant qui est évidement présent dans les tables de propriétés afin d'identifier l'objet qui correspond a une propriété (et vice versa).

    Dans ma base de données, il peut y avoir un nombre arbitraire de propriétés et de table: c'est l'utilisateur qui gère ca.

    Ma question est la suivante: lorsque l'on souhaite récupérer des objets de la base avec l'ensemble des propriétés (ou un sous set peu importe), quel est plus optimal en terme de temps de calcul:

    1 - Récupérer l'ensemble par une seule requête en utilisant des jointures sur les ID ? (jointure multiple donc)

    2 - Récupérer la liste de propriété a récupérer, les trier par table, et récupérer les propriétés par table (une seule condition sur les ID donc, pas besoins de jointure à chaque fois)

    Ma question est peut être naïve, mais si je la pose c'est bien parce que j'ai peu d'expérience en la matière...

    Merci d'avance

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Hello,

    Sans aucun conteste la première solution.
    Déjà parce que je n'ai pas compris ce que tu voulais faire par ta deuxième solution.
    Et ensuite, les moteurs SGBD se comporte relativement mieux si tu lui dit clairement que c'est des jointures que tu veux. Il décidera comme un grand ensuite de la manière de récupérer tes données.

    Si chacune de tes tables de propriété est indexée par ID, alors tout devrait bien se passer.

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Exemple pour la solution 1:
    SELECT o1, p1, p2, p3, p4 (...) FROM TObj, T1, T2, T3 WHERE TObj.oid = T1.t1id AND TObj.oid = T2.t2id AND TObj.id = T3.t3id
    Exemple pour la solution 2:
    SELECT o1, p1(...) FROM TObj, T1, WHERE TObj.oid = T1.t1id
    (traitement...)
    SELECT o1, p5(...) FROM TObj, T2, WHERE TObj.oid = T2.t2id
    (traitement...)
    SELECT o1, p10(...) FROM TObj, T3, WHERE TObj.oid = T3.t3id
    (traitement...)
    Je ne connais pas bien ce qui tourne derrière les SGDB... D'où ma question.

  4. #4
    Scorpi0
    Invité(e)
    Par défaut
    Donc tu oublie la solution 2, pour hier, pour maintenant, pour demain, pour jamais, pour toujours, ca fait trop mal aux yeux !

    Et ta solution 1 va s'écrire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TObj.o1, T1.p1, T1.p2, T2.p3, T2.p4, (...) 
    FROM TObj INNER JOIN T1 ON TObj.oid = T1.t1id
              INNER JOIN T2 ON TObj.oid = T2.t2id
              INNER JOIN T3 ON TObj.oid = T3.t3id
    Non négociable !

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut


    Y'a une raison particulière?

    Autre chose, il me faut récupérer TOUS les objets demandés, même ceux qui ne sont pas référencés dans certaines tables (Tn...).

    En surfant un peu, j'ai pu constater qu'il faut dans ce cas utiliser les jointures externes. Auquel cas ma query deviendrait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT TObj.o1, T1.p1, T1.p2, T2.p3, T2.p4, (...) 
    FROM TObj LEFT OUTER JOIN T1 ON TObj.oid = T1.t1id
              LEFT OUTER JOIN T2 ON TObj.oid = T2.t2id
              LEFT OUTER JOIN T3 ON TObj.oid = T3.t3id
    C'est bien la solution optimale?

    Merci pour tes lumières en tout cas, et désolé d'avoir abimé tes yeux (j'avais prévenu pourtant!)

    EDIT: il faut rajouter le mot clé DISTINCT aprés le select... J'ai testé rapidment, et si il y a plus d'une table a joindre, il me fait un produit cartésien...

  6. #6
    Scorpi0
    Invité(e)
    Par défaut
    Disons que les moteurs SGBD sont quand même conçu pour faire du travail ensembliste, et sont particulièrement efficace sur les jointures.
    De manière plus simple aussi, avec la solution 1, tu accèdes une fois a la table objet, et une fois à chaque table de propriété.
    Avec la solution 2, tu accèdes 3 fois à la table objet, et une fois a chaque table de propriété.
    Donc forcement, la solution 1 parait la plus rentable.

    Ensuite oui, pour récupérer tout tes objets, il te faut une jointure externe que tu as très bien écrite.
    Le mot clé DISTINCT sert à supprimer deux enregistrements identiques, à priori si tu as une clé primaire sur l'ID objet de toute tes tables, tu n'es pas censé avoir des doublons, donc pour le coup, le distinct n'est pas utile.

    Enfin, comment tu as vu qu'il te fesait un produit cartésien ? au niveau du résultat ? Là il nous faudrait ton SGBD, et un jeu de données, parce que ca m'étonne cette histoire de produit cartésien !

  7. #7
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Bon bah j'arrive pas a reproduire le produit cartésien qu'il m'a fait tout a l'heure On va dire que j'ai halluciné ou fait une mauvaise manip :S (je suis sous MySQL)

    En tout cas merci encore pour tes explications!

  8. #8
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    Je pense qu'un modèle en métadonnées t'aiderait bien pour gérer des objets avec propriétés :

    http://sqlpro.developpez.com/cours/m...n/metadonnees/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [gros nul] jointures ou pas ?
    Par jfouche dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/10/2009, 18h10
  2. Jointure ou pas ?
    Par ITCsoft54 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/09/2007, 13h43
  3. Jointure ou pas
    Par PickEpique dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/06/2007, 20h30
  4. Like + jointure => marche pas
    Par Choupinou dans le forum Oracle
    Réponses: 10
    Dernier message: 26/06/2006, 09h18
  5. jointure renvois pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/08/2002, 12h51

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