Arbres avec MySQL

Le
Christophe CLEMENT
Bonjour,

Je me demande quelle est la façon la plus intelligente de représenter
des arbres dans une table sql.
Prenons un exemple : usenet.

Chaque message a identifiant Message-ID.
Chaque message peut avoir une référence à un article précédent, dans ce
cas la référence est le Message-ID du père.
Un message qui n'a pas de référence est un message père, les messages
fils ayant une référence.

On peut récupérer tous les messages pères, on regarde ensuite pour
chaque message père la liste des messages fils, et pour chaque fils
s'ils ont aussi des fils, et pour chaque fils, etc etc etc.
Ceci afin de reconstituer dans le programme principal l'arbre, afin de
pouvoir l'afficher par exemple.

Alors quelle représentation utiliser ?

Pour usenet par exemple, les messages fils ont pour référence leur
père, leur grand père, leur arrière grand père, etc
C'est donc une chaine de caractères de taille variable qui contient la
concaténation de tous les Message-ID. Et dans ce cas pour récupérer les
fils, il faut faire un sélect avec un "%", ce qui peut prendre un
certain temps. Ensuite le programme principal doit passer tous les
résultats à la moulinette pour reconstituer une arborescence.

Autre solution : chaque message a un numéro unique, et peut avoir un
père seulement, ou 0 s'il n'a pas de père.
Mais dans ce cas, comment regrouper les requètes ? Ceci d'avoir un
nombre de requète constant, quel que soit le nombre de feuilles (de 0 à
200 par exemple).

Christophe
--
Pour me répondre, cliquez ici -> http://www.75018.org/email.cgi
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christophe CLEMENT
Le #21844081
Le 06/03/2004 vers 18h02, "Seo-Kyeong KIM-BOUDOT"

Il s'agit de tables hierarchiques, je te recommande la lecture de cet
article :

http://sqlpro.developpez.com/Tree/SQL_tree.html




Merci ! J'ai trouvé ça très instructif :-)
Ça correspond bien à ce que je cherchais.

Je me demandais si en sql il était possible d'avoir un champ de type
tableau d'entiers dans lequel on pourait mettre la liste des pères, et
des fonctions qui permettraient de regarder dans la table s'il y a dans
le champ en question une apparition de ce nombre. Ou un moyen de
simuler un tableau d'entiers, en évitant d'utiliser des chaines de
caractère de longueur arbitraire et des select from X where Y like
"%1234%".


Christophe
--
Pour me répondre, cliquez ici -> http://www.75018.org/email.cgi
bertrand
Le #21844071
Le 06/03/2004 14:17, Christophe CLEMENT a écrit :

Bonjour,

Je me demande quelle est la façon la plus intelligente de représenter
des arbres dans une table sql.
Prenons un exemple : usenet.
...
Christophe



Une solution simple :
chaque message contient l'identifiant de son père et l'identifiant du
l'ancètre initial de la suite de message.
Comme cela il suffit pour afficher la liste des fils de discussion de
sélectionner les messages qui ont leur propre identifiant comme ancètre.
Pour développer un fil, il suffit de selectionner tous les messages
ayant le même ancètre (ordonné par identifiant de père et identifiant de
message pour les avoir dans l'ordre de leur création).

Bonne programmation

--
Bertrand Perrotte

Webmaistre secrétaire du Canoë Kayak Gennevilliers
Christophe CLEMENT
Le #21844061
Le 06/03/2004 vers 20h55, bertrand
Une solution simple :
chaque message contient l'identifiant de son père et l'identifiant du
l'ancètre initial de la suite de message.
Comme cela il suffit pour afficher la liste des fils de discussion de
sélectionner les messages qui ont leur propre identifiant comme ancètre.
Pour développer un fil, il suffit de selectionner tous les messages
ayant le même ancètre (ordonné par identifiant de père et identifiant de
message pour les avoir dans l'ordre de leur création).



Ça me semble effectivement une solution plus simple que celle des
intervalles.
Mais elle a pour défaut que pour un fils donné, on ne puisse pas
directement extraire les descendants : il faut remonter par le père,
puis faire le tri.
Pour celà, la méthode des intervalles a l'air mieux.

Sinon j'ai pensé mettre comme référence une clé unique, et créer une
table annexe qui contiendrait deux champs : clé et message_id
Ainsi un message qui serait le petit fils du père initial aurait deux
entrées dans la table annexe.

Pensez-vous que c'est une solution raisonnable de faire comme ça ? Ou
bien la solution des intervalles est mieux ?

Bonne programmation



Merci !

Christophe
--
Pour me répondre, cliquez ici -> http://www.75018.org/email.cgi
Nicolas Krebs
Le #21843451
Bonjour,

Christophe CLEMENT écrivit dans l'article
news:c2cmh9$3dc$

Bonjour,

Je me demande quelle est la façon la plus intelligente de représenter
des arbres dans une table sql.



Poser la question dans le bon groupe.
news:fr.comp.applications.sgbd Discussions sur les bases de données.

( http://www.usenet-fr.net/liste-groupes.html#comp )
Publicité
Poster une réponse
Anonyme