<?xml version="1.0"?>
<rss xmlns:php="http://php.net/xsl" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Requêtes récursives avec Derby - Chicoree</title><link>http://www.chicoree.fr/w/Requ%C3%AAtes_r%C3%A9cursives_avec_Derby</link><atom:link href="http://www.chicoree.fr/w/Requ%C3%AAtes_r%C3%A9cursives_avec_Derby?action=toFeed" rel="self" type="application/rss+xml"/><description><![CDATA[Beaucoup de donnée s'accomodent naturellement d'une représentation hiérarchique. Que ce soient les catégories d'un wiki, des groupes d'utilisateurs ou les messages dans une liste de diffusion, toutes ces données peuvent être organisées sous forme de graphes ou d'arbres. La manière naturelle de représenter cette structure de données est par une liste d'adjascence où chaque élément contient une référence sur son parent. Or cela suppose la possibilité d'effectuer des requêtes récursives pour pouvoir trouver l'ensemble des parents ou enfants d'un noeud.
Malheureusement, Apache Derby, comme beaucoup de SGBD-R (Système de Gestion de Bases de Données Relationnelles) , ne supporte pas directement les requêtes récursives. Heureusement, Derby peut facilement être doté de fonctions utilisateurs – et celles-ci, écrites en Java – permettent de contourner cette limitation. C'est ce que nous allons voir ici.
]]></description><item><title>1 Le problème</title><link>http://www.chicoree.fr/w/Requ%C3%AAtes_r%C3%A9cursives_avec_Derby#Le_probl.C3.A8me</link><description><![CDATA[<p>Après cette introduction qui a peut-être soulevée plus de questions qu'elle n'a apporté de réponses, prenons quelques instants pour examiner un cas typique de ce genre de problème. Considérons le groupe de grande distribution <i>Système Z</i>. Ce groupe possède des magasins affiliés en France et en Europe. Au gré de l'évolution du groupe et de l'affiliation de nouveaux magasins, ceux-ci se sont vus rattachés à des <i>zones</i>. Celles-ci peuvent être à l'échelle d'une ville, d'une région voire même d'un pays. Le groupement en zone permet de centraliser les approvisionnements et participe à la gestion administrative de la chaîne de magasins, tout en permettant une relative autonomie et suffisamment de souplesse pour s'adapter aux besoins du marché local. Çà, c'était pour les arguments commerciaux.
</p>]]></description></item><item><title>2 Requêtes récursives en Java</title><link>http://www.chicoree.fr/w/Requ%C3%AAtes_r%C3%A9cursives_avec_Derby#Requ.C3.AAtes_r.C3.A9cursives_en_Java</link><description><![CDATA[<p>Or donc, la solution réside dans le monde Java. Parce que Derby permet de définir nos propres <b>fonctions-tables</b> (<i>table functions</i> – ou <i>tables virtuelles</i>). Késako? Et bien ce sont des fonctions Java dont le résultat est une table. Autrement dit encore, des fonctions dont le résultat peut servir comme une table <i>ordinaire</i>. Et dont le résultat peut donc être exploité par la machinerie SQL dans une requête SELECT.
Pour plus de renseignement sur ce sujet, je vous engage à lire l'article <a>Tables virtuelles sous Derby</a>. En deux mots, il s'agit d'écrire une méthode Java qui renvoit une instance de <tt><a><span>ResultSet</span></a></tt>, afin que Derby puisse manipuler ces données comme une table.
</p>]]></description></item><item><title>2.1 Fonctions-tables</title><link>http://www.chicoree.fr/w/Requ%C3%AAtes_r%C3%A9cursives_avec_Derby#Fonctions-tables</link><description><![CDATA[<p>Or donc, la solution réside dans le monde Java. Parce que Derby permet de définir nos propres <b>fonctions-tables</b> (<i>table functions</i> – ou <i>tables virtuelles</i>). Késako? Et bien ce sont des fonctions Java dont le résultat est une table. Autrement dit encore, des fonctions dont le résultat peut servir comme une table <i>ordinaire</i>. Et dont le résultat peut donc être exploité par la machinerie SQL dans une requête SELECT.
Pour plus de renseignement sur ce sujet, je vous engage à lire l'article <a>Tables virtuelles sous Derby</a>. En deux mots, il s'agit d'écrire une méthode Java qui renvoit une instance de <tt><a><span>ResultSet</span></a></tt>, afin que Derby puisse manipuler ces données comme une table.
</p>]]></description></item><item><title>2.2 Recursive ou itérative</title><link>http://www.chicoree.fr/w/Requ%C3%AAtes_r%C3%A9cursives_avec_Derby#Recursive_ou_it.C3.A9rative</link><description><![CDATA[<p>En fait, si en SQL nous aurions besoin de requêtes <i>récursives</i> à cause de la nature déclarative de ce langage, comme Java est un langage impératif, il devient possible d'utiliser une <i>itération</i> à la place.
</p>]]></description></item><item><title>3 Conclusion</title><link>http://www.chicoree.fr/w/Requ%C3%AAtes_r%C3%A9cursives_avec_Derby#Conclusion</link><description><![CDATA[<p>Pour terminer, un petit avertissement: <b>ce n'est pas parce qu'on peut le faire qu'il faut le faire!</b> Ainsi, si nous avons vu qu'il était possible avec Derby d'écrire une <i>fonction table</i> qui permet d'explorer une structure arborescente définie par une liste d'adjascence, ça n'est pas forcément la panacée. En effet, vous comprenez que cela implique l'exécution d'un certain nombre de requête par le SGBD. Même si ces requêtes sont <i>cachées</i> dans le code Java. Au final, cela peut devenir d'autant plus pénalisant, que la profondeur de l'arbre est importante. Par contre, là où les listes d'adjascence sont imbattables, c'est au niveau de l'ajout: Puisqu'une seule requête est nécessaire.
</p>]]></description></item><item><title>4 Références</title><link>http://www.chicoree.fr/w/Requ%C3%AAtes_r%C3%A9cursives_avec_Derby#R.C3.A9f.C3.A9rences</link><description/></item></channel></rss>
