requete mysql ou comparaison de tableaux php ?

requete mysql ou comparaison de tableaux php ? - PHP - Programmation

Marsh Posté le 25-11-2013 à 23:05:04    

Bonjour à tous,
 
voici mon problème :
 
je développe un site de recettes de cuisine ; pour faire simple, j'ai une table de recettes 'recettes' (id_recette,nom_recette etc), une table de mots-clef 'tags_recette' (id_tag,nom_tag) et une table de relations entre les recettes et mots-clef 'tags_recette_assoc' (tags_assoc_id,tag_id,tag_recette) où tag_id se réfère à id_tag et tag_recette à id_recette.
 
Lorsque j'affiche la page d'une recette, j'aimerais proposer uniquement 3 recettes similaires à la fin, tant qu'à faire celles qui ont le plus de tags en commun avec elle.
 
Comment dois-je m'y prendre ? Requête(s) mysql ou comparaisons de tableaux php ? Avec mon peu de pratique je comptais mettre les tag_id correspondant à la recette en question dans un tableau, puis dans une boucle sur toutes les autres recettes de la table mettre les tags correspondants dans un tableau et comparer les tableaux avec un truc du genre array_values(array_intersect)), mais j'imagine que ça mange de la ressource non ? Sachant qu'il y a déjà beaucoup de requêtes dans l'affichage de cette page...
 
Merci pour votre aide !

Reply

Marsh Posté le 25-11-2013 à 23:05:04   

Reply

Marsh Posté le 25-11-2013 à 23:22:45    

Si tu as accès à un serveur avec du tomcat, je te conseilles de mettre en place un serveur Solr. Pour faire de la recherche sur du texte c'est assez bluffant.
 
Si ce n'est pas possible, avoir une table en myisam qui reçoit une copie des tags pour faire des recherches fulltext sera moins performant que du solr mais devrait donner des résultats plutôt pertinents.


---------------
Main/Alt1/Alt2/Alt3
Reply

Marsh Posté le 26-11-2013 à 23:16:06    

Tu peux récupérer tous les tags de la recette avec la requête mysql de ton choix.
 
Puis tu fais une requête pour récupérer les recettes qui ont le plus de tag en commun avec la recette :
SELECT COUNT(*) as count, tag_recette FROM tags_recette_assoc GROUP BY tag_recette WHERE id_tag IN ( ... ta liste de tag... ) ORDER BY count DESC LIMIT 3
 
Tu peux remonter les recettes en même temps avec cette requête.
 

Citation :

Comment dois-je m'y prendre ? Requête(s) mysql ou comparaisons de tableaux php ? Avec mon peu de pratique je comptais mettre les tag_id correspondant à la recette en question dans un tableau, puis dans une boucle sur toutes les autres recettes de la table mettre les tags correspondants dans un tableau et comparer les tableaux avec un truc du genre array_values(array_intersect)), mais j'imagine que ça mange de la ressource non ? Sachant qu'il y a déjà beaucoup de requêtes dans l'affichage de cette page...


 
La solution "tableau PHP" et "GROUP BY mysql" fonctionnent bien avec un petit nombre de recettes et de tag. Mais ce n'est plus le cas si le nombre de recettes dépasse un certain seuil, soit c'est le serveur PHP qui va flancher, soit le serveur MySQL. Lorsque le traitement est tel qu'il pose des problèmes de performance en temps réel, il faut stocker les résultats dans une base intermédiaire : dans une autre table, dans un serveur de cache etc. Et il faut contrôler la durée de vie des résultats de traitement, en faisant expirer la validité des données après une certain durée ou une action précise.


Message édité par czh le 26-11-2013 à 23:19:43
Reply

Marsh Posté le 26-11-2013 à 23:21:06    

Merci pour ta réponse Volkhen, apparemment non comme je suis mutualisé je n'ai pas de Tomcat.
Quant à ton autre solution, une recherche fulltext n'est-elle justement pas moins performante qu'une requête sur des tags déjà associés aux recettes dans une table, sachant qu'il n'y a pas plus de 8 tags par recette ?
Ce que je voulais savoir en fait, comme je me doute qu'une requête mysql directe sera plus performante qu'une comparaison de tableaux php, c'est à quoi ressemblerait cette requête avec mes tables ? Je ne maîtrise pas bien les jointures et les requêtes "complexes" de ce genre...


Message édité par nebenobo12 le 26-11-2013 à 23:54:37
Reply

Marsh Posté le 27-11-2013 à 00:24:27    

super czh, ta requête me semble adaptée à mon cas, je l'essaierai dès demain.
En fait comme je disais à Volkhen, je n'ai pas plus de 8 tags par recette, et j'ajouterai que je pense qu'il n'y aura jamais plus de 5000 recettes sur le site, du coup penses-tu que cette requête soit la solution la plus pertinente au regard de celles proposées par Volkhen ?

Reply

Marsh Posté le 27-11-2013 à 19:56:39    

ok merci czh, ta requête fonctionne mais j'ai dû y apporter 2 corrections :
 
SELECT COUNT(*) as count, tag_recette FROM tags_recette_assoc WHERE tag_id IN ( ... ta liste de tag... ) GROUP BY tag_recette ORDER BY count DESC LIMIT 3
 
Merci à tous !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed