JeuWeb - Crée ton jeu par navigateur
[MySQL]1 ou 2 requêtes pour un "maitre détail" - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [MySQL]1 ou 2 requêtes pour un "maitre détail" (/showthread.php?tid=4776)

Pages : 1 2


RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - Kihmé - 27-04-2010

il ne va pas pouvoir le faire en une requète, car à mon avis il veut un truc comme ça :

id / info 1 / info 2 / Info 3 /
- ingrédient : quantité
- ingrédient : quantité

voilà un exemple que j'ai déjà fait pour un projet, on avait des randonnées qui avaient des informations et qui traversaient plusieurs sommets, on voulait lister chaque randonnée et ses sommets, un peu comme là tu veux lister chaque recette et y indiquer chacun de ses ingrédients :

Code :
declare @code_randonnee int
declare @nom_randonnee char(20)
declare @code_sommet int
declare @nom_sommet char(20)
declare cursor1 cursor for
    select distinct code_randonnee, nom_randonnee
    from randonnee, traverser, sommet
    where code_randonnee = randonnee
    and sommet = code_sommet
    order by nom_randonnee

open cursor1
fetch cursor1 into @code_randonnee, @nom_randonnee
while (@@fetch_status = 0)
begin
    print '- La randonnée ' + @nom_randonnee + ' passe par le(s) sommet(s) :'
    declare cursor2 cursor for
        select code_sommet, nom_sommet
        from sommet, traverser
        where code_sommet = sommet
        and randonnee = @code_randonnee
        order by position
    open cursor2
    fetch cursor2 into @code_sommet, @nom_sommet
    while (@@fetch_status = 0)
    begin
        print '    - ' + @nom_sommet
        fetch cursor2 into @code_sommet, @nom_sommet
    end
    close cursor2
    deallocate cursor2
    fetch cursor1 into @code_randonnee, @nom_randonnee
end
close cursor1
deallocate cursor1



RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - Roworll - 27-04-2010

Petite(s) remarque(s)
Ce code est en SQL Server apparemment.
Si on transpose dans un environnement MySQL, la syntaxe sera différente et il est même possible que les curseurs ne soient pas supportés en fonction de la version de MySQL.

Ensuite, puisque c'est du code SQL Server, je me permets de rappeler que l'utilisation de curseurs doit être évitée dans la mesure du possible (Best Practice from MS). C'est bien trop gourmand en ressources. (petit lien)

Dans l'exemple donné, je pense qu'il aurait été possible de s'en sortir avec l'instruction PIVOT (SQL 2005 & 2008), évitant ainsi ce double curseur.

Pour en revenir au sujet original, je rejoindrais cyberbobjr. A vue de nez, je pense que la requête unique sera plus performante mais ça reste à confirmer par un benchmark.
La quantité d'information dupliquée sur la table "maître" par la requête jointe peut faire la différence.


RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - Ter Rowan - 27-04-2010

(27-04-2010, 10:52 AM)pascal a écrit :
(26-04-2010, 07:37 PM)Ter Rowan a écrit : Info complémentaire pour le contexte
le nombre d'enregistrements de maitre devrait tourner entre 100 et 400
le nombre d'enregistrements de détail devrait tourner entre 400 et 4000

Je retourne la question :
Est-ce pertinent de renvoyer autant d'infos via une (ou deux) requête ?
C'est pour quelle utilisation ?
Et la pagination dans tout ça ?

A+

Pascal
Je n'ai pas été très clair ^^ les volumes que j'annonçais étaient les données en BDD, pas en récupération de données (on en récupèrera 1 le plus souvent voire 4-5 dans les cas exceptionnels je pense) ni même en affichage

(27-04-2010, 03:09 PM)Roworll a écrit : Pour en revenir au sujet original, je rejoindrais cyberbobjr. A vue de nez, je pense que la requête unique sera plus performante mais ça reste à confirmer par un benchmark.
La quantité d'information dupliquée sur la table "maître" par la requête jointe peut faire la différence.

je pense que les données dupliquées seront de 5 entiers au maximum pour la table maître (et comme un enregistrement maitre doit donner entre 5 et 10 enregistrements détail, on dupliquera d'autant)

Je vais essayer les deux méthodes mais je ne sais pas si je verrais grand chose :/

en tout cas merci pour vos infos


RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - pascal - 27-04-2010

Dans ce cas une seule requête, sans hésiter.

++

Pascal


RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - Sephi-Chan - 27-04-2010

C'est vrai qu'en dehors du cas d'un ORM, tu peux tout à fait faire ça facilement en 1 requête. Smile


Sephi-Chan


RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - Kihmé - 27-04-2010

(27-04-2010, 03:09 PM)Roworll a écrit : Petite(s) remarque(s)
Ce code est en SQL Server apparemment.
Si on transpose dans un environnement MySQL, la syntaxe sera différente et il est même possible que les curseurs ne soient pas supportés en fonction de la version de MySQL.

Ensuite, puisque c'est du code SQL Server, je me permets de rappeler que l'utilisation de curseurs doit être évitée dans la mesure du possible (Best Practice from MS). C'est bien trop gourmand en ressources. (petit lien)

Dans l'exemple donné, je pense qu'il aurait été possible de s'en sortir avec l'instruction PIVOT (SQL 2005 & 2008), évitant ainsi ce double curseur.

Pour en revenir au sujet original, je rejoindrais cyberbobjr. A vue de nez, je pense que la requête unique sera plus performante mais ça reste à confirmer par un benchmark.
La quantité d'information dupliquée sur la table "maître" par la requête jointe peut faire la différence.

oui le code est bien du sql server mais je l'ai mis à titre d'exemple de ce qu'est un curseur. Après pour le reste si c'est une mauvaise utilisation je n'en ai aucune idée donc si tu le dis c'est surement vrais


RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - NicoMSEvent - 28-04-2010

Le choix est cornélien... A mon avis, c'est se chatouiller pour se faire rire, les données sont tellement faibles, et les calculs tellement simples... ça changera que de quelques millisecondes le chargement de ta page. En orienté objet, tu aurais deux requêtes distinctes (récupération de l'objet "recette" et récupération des objets "ingrédients"), voir même trois si tu y ajoutes des relations spécifiques ( recette -> recette_utilise_x <- ingrédient )

ce qui te permettrait de récupérer un type d'ingrédient pour plusieurs recettes (exemple : un ingrédient composé : un roux, ou une pâte brisée, ...), avec la quantité qui pourrait changer d'après la recette. Ca permettrait certainement de limiter ton nombre d'ingrédient a quelques dizaines au lieu d'en avoir des milliers

D'un point de vue conceptuel, je préfèrerais cette dernière solution, qui utilise 3 requêtes Wink


RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - Sephi-Chan - 28-04-2010

Nico, même avec une cardinalité pour chaque ingrédient, ça se fait très proprement en 2 requêtes : la première pour la recette, la deuxième sur la table de liaison avec une jointure sur la table des ingrédients. Smile


Sephi-Chan


RE: [MySQL]1 ou 2 requêtes pour un "maitre détail" - NicoMSEvent - 28-04-2010

1ere requete : je charge toutes les recettes

2eme requete : je charge tous les ingrédients

3eme requete (la plus grosse, surtout si on prends toutes les lignes, mais dans mon cas, je ne prends que ce qui m'intéresse -> juste quelques dizaines de lignes maximum) : je prends les recettes que je souhaite afficher (petite clause where), en considérant ça comme un multigraphe, et je crée des liens pondérés (ici les quantités d'ingrédients).

Je ne vois pas comme faire plus simple, et plus économe en mémoire, vu que même si mon ingrédient apparait 100x, il n'est qu'une seule fois en mémoire (un seul objet). (contrairement a si je lie ma requete sur la table intermédiaire, et ingrédients)