-
Message publié le mardi 05 août 2003 à 16 h 38 par cedric59. cedric
-
bonjour,
dans une table j'ai 3 champs : id_element, element, et id_element_parent
ainsi, chaque element peut etre relié à un élément père
j'aimerais savoir si c'est possible en SQL de faire une requête récursive, à savoir d'affichier tous les fils d'un élément, et aussi ses petits-fils, arrières petits-fils, etc, jusqu'au bout...
ou alors faut-il faire une fonction récursive en PHP avec des tableaux ou on met les resultats et du coup tout un barda compliqué?
merci si vous pouvez m'aider :-)
-
Message publié le mardi 05 août 2003 à 17 h 34 par Séb..
-
Salut !
Un truc qui manque à SQL : la gestion de la récursivité.
=> Tu vas devoir passer par PHP.
-
Message publié le mercredi 06 août 2003 à 10 h 59 par cedric59. cedric
-
ok
merci pour cette info
après recherche, je me suis appercu que j'avais le choix entre :
1/ gérer la table de cette manière et faire uen fonction recursivederrière en PHP au moment ou je dois rechercher l'arborescence
ou
2/ utiliser une représentation par intervalle (chaque element est defini par un bord droit et un bord gauche, ses fils ayant des bornes comprises dans cet intervalle), auquel cas l'insertion d'un élément demande une mise à jour de bcp d'éléments, ce qui nécessite une transaction SQL.
que me conseillez-vous?
comment gérer l'interfacage d'une transaction MYSQL avec PHP?
ou trouver de la bonne doc la dessus ?
merci si vous pouvez m'aider :-)
-
Message publié le mercredi 06 août 2003 à 11 h 18 par Séb..
-
La représentation par intervalle peut sembler élégante (article sur
http://sqlpro.developpez.com/ pour ceux que ça intéresse) mais demande un certain temps d'adaptation et fait effectivement pas mal travailler le serveur à l'insertion, ce qui peut être embêtant avec MySQL qui ne gère pas les transactions (sauf si tu as accès aux tables InnoDB).
À ta place je ferai la 1 avec ou sans mysql_query( ) en récursif selon la structure de ton arbo.
"ou trouver de la bonne doc la dessus ?"
Sur le site officiel MySQL
http://www.mysql.com/ [;)]
-
Message publié le mercredi 06 août 2003 à 15 h 31 par cedric59. cedric
-
sur developpez.com, on me conseille de fonctionner par intervalle à partir du moment ou une des conditions suivantes est respectée :
1- l'arbre est profond (plus de 5 niveaux)
2- l'arbre est large (plus de 100 éléments sur un même niveau)
3- l'arbre contient beaucoup de valeurs (à partir de 200 à 300 éléments)
4- la majorité des requêtes sont des requêtes d'interrogation - SELECT (au moins 50% des requêtes)
pour ma part je suis dans le cas 3 et 4, et dans le cas 2 dans certains cas...
me conseillez vous néanmoins d'abandonner ce fonctionnement?
d'autre part, etant donné que MYSQL ne gere pas les transactions, comment cela se passe? une action lancée est systematiquement prioritaire sur les autres? la table est bloquée tant que la requête n'est pas terminée...?
par ailleurs, quels sont les autres moyens de fonctionner que d'utiliser mysql_query()?
merci si vous pouvez m'aider :-)
-
Message publié le mercredi 06 août 2003 à 16 h 15 par candide. Candide:-=
j'trouve que ça sent bon la neige... pas vous?
-
j'ai fais (à l'époque) un site se présentant comme un explorateur windows. Il s'agissait d'un catalogue.
J'avais pour cela utilisé essentiellement le php puisque ma structure d'arbre tenait dans une seule table.
Là ou je n'avais pas été très "élégant" tenait dans le fait que j'avais du utiliser des structures de données particulièrent à stocker dans la dite table.
Néanmoins, le script était très rapide et n'effectuait que peu de requètes vers la base de données...
-
Message publié le vendredi 08 août 2003 à 16 h 03 par cedric59. cedric
-
bonjour,
toujours pour ce probleme de choix de représentation de la base...
(intervalle/classique avec récursivité), voila ce que j'envisage de faire étant donné que mes requetes seront à 90% des select :
utiliser une représentation par intervalles avec en + une référence à l'ID parent pour plus de lisibilité au sein de la table (retrouver tres facilement le père de l'élément).
qu'en pensez-vous?
merci si vous pouvez m'aider :-)
-
Message publié le vendredi 08 août 2003 à 16 h 24 par Séb..
-
Salut !
Je déplace la conversation dans le salon modélisation.
-
Message publié le lundi 11 août 2003 à 10 h 49 par cedric59. cedric
-
yop,
je continue à me renseigner et voilà ce que j'ai trouvé pour éviter l'usage des transactions :
Un double représentation : représentation pere/fils récursive + représentation par intervalle
j'utilise l'intervalle pour les select (+ rapide)
pour les insert et les upadate, j'utilise la representation pere-fils, puis, apres chacune des requetes de ce type, j'effectue une reconstruction complete de l'arbre pour redefinir les intervalles gauches et droits
cela est géré en PHP de maniere recursive, et evite ainsi l'utilisation des transactions
qu'en pensez-vous ? :-)
-
Message publié le lundi 11 août 2003 à 11 h 01 par candide. Candide:-=
j'trouve que ça sent bon la neige... pas vous?
-
Je ne suis pas assez calé en BDD pour faire une bonne critique, mais je pense qu'un développement objet avec un maximum de tratement en php avec toutes les fonction ki vont bien me semble plus propre. Attend quand même l'avis de maitre Seb.
@++
[:-(p]suis fatigué...
-
Message publié le lundi 20 octobre 2003 à 22 h 15 par 20100D. 20100 1000 anes dans 1 prés et 120 dans l'aut'e alors....
Gestionnaire de fichiers audios en ligne :
http://perso.wanadoo.fr/madvincent/MadPlayer/
SQL, VB, VBA, NCL, C/C++, etc :
http://www.cv-vincent-dallaporta.fr.st
-
Salut Cedric59
Les fonctions récursives, c'est beau, c'est conci mais c'est infernal à maintenir...
Il faut en faire, pour le plaisir ou dans certain cas de limitation matériel.
Sinon il faut éviter. En plus la fonction n'est désallouée qu'en fin de traitement. Si elle est mal écrite et si elle utilise beaucoup de variable locale, rapidement la pile va s'incrémenter...
Autrement dit, si le nombre d'ittération n'est pas connu à l'avance, et peut facilement crever le plafonds, pour moi il y danger...
J'aime bien, mais je suis plus de l'avis de Candide.
A+
-
Message publié le dimanche 13 janvier 2008 à 22 h 56 par SQLpro. Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
-
Vous pouvez utiliser des requêtes récursives à la norme SQL:1999 si votre SGBDR le supporte : MS SQL Server, IBM DB2 et Sybase ASE supportent les CTE (Common table Expression) qui permettent de telles requêtes.
Pour une étude approfondie, voire l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/
A +