Question optimisation

Question optimisation - PHP - Programmation

Marsh Posté le 17-02-2011 à 01:40:52    

Bonjour,
 
je vous explique rapidement mon problème:
 
J'ai 2 tables: 1 table de "rubriques" et une table de "sous rubriques" contenant la clé de la rubrique parente..
 
dans ma page php, je dois afficher toutes les rubriques avec leurs sous rubriques. mais quelle est la meilleure procédure?
 
J'ai pensé à :
 
1 requete vers la table "rubriques"
1 requete vers la table "sous-rubriques"
1 boucle sur les résultats de "sous rubriques" en stockant les résultats dans un tableau style $rubrique[$result->rubrique_id]=$sous_rubrique
 
et apres affichage avec foreach
comme ca on a que 2 requetes SQL
 
en fait je voulais savoir si c'était la meilleure solution ou s'il y a une technique bien plus simple et optimisée..
 
Je vous remercie!

Reply

Marsh Posté le 17-02-2011 à 01:40:52   

Reply

Marsh Posté le 17-02-2011 à 08:57:38    

Pourquoi ne pas faire simplement une jointure SQL ?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 17-02-2011 à 11:40:21    

parce que:

 

je veux récupérer 3 paramètres dans ma table rubriques
je peux avoir beaucoup de sous rubriques

 

exemple:
30 rubriques, chacun 20 sous rubriques

 

en utilisant ma méthode:
- 1 requete simple sur rubriques pour récup 30 résultats
- 1 requete simple sur sous rubriques pour récup 600 résultats

 

en faisant une jointure, j'ai toujours 600 résultats à trouver, mais je me dis que la requete sera bien plus gourmande, à chaque résultat j'aurai:

 

id_sous_rubrique / id_rubrique / nom_rubrique / date_creation_rubrique / createur_rubrique / nom_sous_rubrique / champs de sous rubriques

 

les champs en gras étant les champs récupéres grace à la jointure...

 

c'est justement ce que je me pose: dans un souci d'optimisation, quelle méthode choisir?


Message édité par elpibedeoro81 le 17-02-2011 à 11:40:57
Reply

Marsh Posté le 17-02-2011 à 11:52:18    

Une remarque en passant : la notion de rubrique/sous-rubrique est une arborescence. Il n'y a donc pas besoin de 2 tables pour ça. 2 modélisations possibles :
1) 1 table avec comme clé étrangère "ParentID" qui pointe en fait sur la même table, sur la rubrique parente. Avantage, c'est facile à gérer lors des insert/update, par contre, pour récupérer toute l'arbo ou une partie de la filiation, faut faire de la récursivité (donc plusieurs requêtes).
 
2) la représentation intervallaire : http://sqlpro.developpez.com/cours/arborescence/ et http://dev.mysql.com/tech-resource [...] -data.html
Avantage, 1 seule requête pour récupérer toute ou partie de l'arbo, inconvénient, lors d'un insert/update, faut recalculer les intervalles.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-02-2011 à 11:56:33    

Tu peux filtrer les champs que tu veux récupérer, tu n'es pas obligé de faire un SELECT *.
 
Penses tu sérieusement que les mecs qui codent un SGBD sont tellement nuls qu'en recodant leur boulot en PHP tu feras de l'optimisation ?
 
N'essaie jamais d'optimiser tant que tu ne maitrises pas encore correctement les outils de base à ta disposition. Ce sera toujours contre productif. Et si un jour quelqu'un doit repasser derrière, il aura envie de se tirer une balle.

Reply

Marsh Posté le 17-02-2011 à 12:06:19    

Et puis récupérer 30 ou 600 résultats, pour le SGBD, ça va pas faire une grosse différence au niveau perf (ça va se jouer à 0.01s) :/ Tu ferais mieux de revoir ta modélisation d'arborescence car avec ta solution, t'es limité à un niveau de sous-rubrique alors qu'avec mes 2 solutions, non.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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