PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Modéliser un arbre simplement dans PostgreSQL

Technique | Modéliser un arbre simplement dans PostgreSQL

Par Jean-Paul Argudo le 08/02/2005 - 14:54

Bonjour,

Parmis les problèmes récurrents auxquels on est confrontés lorsqu'on fait un schéma de données, il y a la modélisation des arbres.

Il s'agit de bien conceptualiser une structure hiérarchique dans une base de données. Je vous propose une méthode éprouvée pour le faire simplement! (attention, ne pas confondre avec un graphe...).

Deux méthodes "anciennes":

  • id / parent_id: Tout d'abord, on trouve la mĂ©thode id / parent_id. C'est Ă  dire qu'on boucle sur la mĂŞme table, en ajoutant une colonne du mĂŞme type que l'identifiant et en bouclant sur cette mĂŞme colonne, avec un lien père / fils.

    Il n'y a pas grand chose à dire sur cette méthode si ce n'est qu'elle montre un peu ses limites en matière de performances lorsqu'on a un arbre conséquent... De plus les mises à jour de l'arbre (suppression ou déplacement d'un noeud) sont assez hardues et nécessitent un code particulier.

  • nested loops (ou "boucles imbriquĂ©es): Il s'agit de modĂ©liser un arbre en sachant Ă  l'avance quelle sera la "largeur" de celui-ci. C'est Ă  dire que pour un arbre donnĂ©, la racine ira de 1 Ă  n, le premier fils de la racine, de 1 Ă  m. Le second fils de la racine, de m+1 Ă  n et ainsi dessuite pour les descendants. Je vous laisse le soin de dĂ©couvrir cette mĂ©thode en lisant http://www.intelligententerprise.com/001020/celko.jhtml?_requestid=145525]

Il existe bien mieux que ces deux mĂ©thodes !
Miguel Sofer, dans le travail de recherche qu'il a effectuĂ© prĂ©sente une mĂ©thode novatrice. Il s'agit d'ajouter une colonne Ă  toute table stockant les noeuds de l'arbre. Grâce Ă  un encodage particulier, on arrive ainsi Ă  savoir très rapidement :

  • quel est le niveau du noeud dans l'arbre ;
  • quel est le père d'un noeud dans l'arbre ;
  • quel est la lignĂ©e d'un noeud de l'arbre ;
  • etc.

Pour avoir un apperçu rapide de cette mĂ©thode, vous pourrez consulter l'article du projet OpenACS correspondant. Pour la petite histoire, ACS est un système de gestion du contenu qui ne tournait que sous Oracle. Lorsque son portage sous PostgreSQL fut rĂ©alisĂ©, il a fallu trouver un moyen pour :

  • modĂ©liser un arbre correctement dans une base de donnĂ©es, en privilĂ©giant la
    souplesse d'utilisation et les performances ;
  • remplacer l'Ă©criture de la syntaxe Oracle "CONNECT BY".

Je vous recommande très vivement de lire l'article original de Miguel Sofer sur cette mĂ©thode. Il dĂ©montre son efficacitĂ© de manière mathĂ©matique, et propose des exemples de code d'implĂ©mentation en PostgreSQL !

Vous pouvez tout aussi bien utiliser la contrib PostgreSQL qui s'appelle « ltree Â», qui utilise la mĂŞme mĂ©thode que celle de Miguel Sofer, mais dont l'implĂ©mentation a Ă©tĂ© rĂ©alisĂ©e par Oleg et Teodor, deux contributeurs majeurs Ă  PostgreSQL (index GiST, recherche plein texte tsearch2, etc.). Plus d'infos sur cette page.

Sachez enfin que l'implémentation du CONNECT BY nativement dans PostgreSQL est un sujet au goût du jour et ne serait tarder, comme on peut le lire sur ce thread(google groups).

En espérant que cet article puisse vous aider!

--
Jean-Paul Argudo
www.dalibo.com

© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.