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

Requêtes MySQL Discussion :

Joindre plusieurs tables crées pour un partitionnement horizontal en une seule table


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 7
    Points
    7
    Par défaut Joindre plusieurs tables crées pour un partitionnement horizontal en une seule table
    Bonjour à tous,

    Dans le cadre d'un projet de moteur de recherche j'ai le schéma suivant de BDD

    Une table keyword avec 2 champs :
    keyword_id : identifiant du mot
    keyword_word : mot en lui même

    Par exemple
    1 afin
    2 amenage
    3 amigo
    4 antigel
    5 apareil
    6 argentine
    7 articl
    8 asta
    9 avec
    10 aventur
    11 avez

    Ensuite une table page avec 2 champs
    page_id : identifiant de la page
    page_titre : titre de la page

    Et enfin une table link qui permet de relier les mots clefs aux pages :
    link_page_id : id de la page dans la table page
    link_keyword_id : id du mot clef dans la table keyword
    link_poids : coefficient d'importance du keyword pour la page

    Cela me permet grâce à la requête suivante de lister dans l'ordre les pages en fonction des mots demandés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT page_id, page_titre, (SUM(link_poids)) AS poids 
    FROM keyword
    LEFT JOIN link ON link_keyword_id = keyword_id
    LEFT JOIN page ON page_id = link_page_id
    WHERE keyword_word IN ('est','pas') 
    GROUP BY link_page_id 
    HAVING COUNT(*) >= 2
    ORDER BY poids DESC
    Jusque là ça marche, la requête utilise bien les index et ne parcours pas trop de lignes. Seulement le problème c'est que le nombre de pages grandissant (50 000 et des bananes), la table link grossit aussi mais beaucoup plus rapidement (7 448 696 entrées) ce qui rend la requête de lecture un peu plus lente (avant mise en cache).

    J'ai donc voulu partitionner horizontalement la table link pour réduire le nombre de lignes à parcourir. Utilisant MySQL 5.1 j'ai donc accès au partitionnement décris dans ce cours : http://krierjon.developpez.com/mysql/partitionnement/. l'ennui c'est que les infos de la table que je veux partitionner (link) ne me donne pas la possibilité de la partitionner comme je veux : je voulais une partition pour chaque première lettre de chaque mot (donc 26 partitions).

    J'ai donc essayé de faire un partitionnement manuel en créant moi même des tables de partitionnement et en gérant moi même les enregistrement dans la bonne table :

    J'ai donc créé 26 tables nommées linka pour le mots commençant par a, linkb pour les mots commençant par b, ..., linkz pour les mots commençant par z avec la même structure que la table link

    Tout marche au poil sauf une chose et c'est pour ça que je demande de l'aide ou des conseils : Dans ma nouvelle requête de recherche utilisant ces "tables partitions" je n'arrive pas à l'écrire correctement pour joindre les tables
    linke et linkp (dans mon exemple) pour ensuite faire les jointures avec les autres tables. J'ai essaye avec UNION mais ça n'a pas l'air d'être la solution (ou alors je l'ai mal utilisé).

    Si vous avez une idée ou même une solution je suis preneur, ou même un conseil sur une autre façon de procéder je vous en remercie.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Si j'ai bien compris ton problème tu n'arrives pas à faire une jointure sur le résultat d'une UNION.
    Pour cet aspect du problème, voilà ce que je te propose
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT page_id, page_titre, (SUM(u.link_poids)) AS poids 
    FROM keyword
    LEFT JOIN 
    (SELECT * FROM linke 
    UNION
    SELECT  * FROM  linkp)AS u 
    ON u.link_keyword_id = keyword_id
    LEFT JOIN page ON page_id = u.link_page_id
    WHERE keyword_word IN ('est','pas') 
    GROUP BY u.link_page_id 
    HAVING COUNT(*) >= 2
    ORDER BY poids DESC
    Mais je crois qu'il est pertinent de t'interroger sur d'autres façons de faire.
    Il y a peut-être des pistes dans ce long échange plutôt polémique : NOSQL
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Merci, c'est ce que je voulais faire.

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

Discussions similaires

  1. [2.x] Plusieurs entités pour une seule table
    Par JackStrieger dans le forum Symfony
    Réponses: 7
    Dernier message: 03/09/2013, 22h24
  2. Réponses: 10
    Dernier message: 21/04/2011, 10h20
  3. plusieurs tables dans une seule table
    Par scully2501 dans le forum Access
    Réponses: 1
    Dernier message: 10/10/2005, 09h19
  4. Réponses: 4
    Dernier message: 14/09/2005, 16h29
  5. Une seule table VS plusieurs tables
    Par LostControl dans le forum Requêtes
    Réponses: 1
    Dernier message: 11/08/2003, 10h56

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