[BDD] Récupérer tout les descendant

ViPHP
ViPHP | 3607 Messages

30 juil. 2012, 13:46

Bonjour à tous,

Je suis face à un problème potentiellement bloquant.
J'ai une table actions :

Code : Tout sélectionner

id_action, ..., parent_action
et une table times :

Code : Tout sélectionner

id_time, ref_action, ...
Et je souhaiterais récupérer toutes les entrées (ou faire des opérations sur), de la table times qui font référence à l'action X ou à l'une de ses descendante.
En sachant que la largeur et la profondeur de l'arbre sont potentiellement infinies...
Actuellement je récupère récursivement tout les ids d'actions correspondants et je les places dans un IN() sur la requête sur la table times, mais ça va vite devenir n'importe quoi :/

Si vous aviez une piste pour traiter cette problématique ? Au moins me lancer sur les bons termes de recherche :)

Merci d'avance,

Cordialement,

ViPHP
xTG
ViPHP | 7331 Messages

30 juil. 2012, 13:57

Pas d'idées désolé, par contre j'ai une remarque.
Tu n'as pas peur d'avoir une boucle infinie avec un tel système sans contrainte ?

ViPHP
ViPHP | 3607 Messages

30 juil. 2012, 14:04

Bonjour,

Le problème d'une boucle infinie ne se posera pas (sauf si je code mal :-°), car l'administration de la table actions sera bien prévue en conséquence. Il ne sera pas possible de choisir comme action parente une descendante :)

ViPHP
ViPHP | 2287 Messages

30 juil. 2012, 14:32

As-tu regardé du côté des arbres intervallaires ? C'est très pratique (pour ne pas dire parfait) pour ce genre de chose : https://www.google.fr/search?ix=acb&sou ... rvallaires
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 3607 Messages

30 juil. 2012, 22:12

Ah :) Voilà le terme qu'il me fallait !
Après une petite recherche et la lecture de ce cours : http://sqlpro.developpez.com/cours/arborescence/
Je crois que je vais effectivement utiliser cette méthode.

Reste à écrire proprement les fonctions à utiliser :)
ça me semble possible en s'y prenant avec méthode !

Merci je passerais mettre résolu quand j'aurais réussit le passage au complet !

ViPHP
ViPHP | 3607 Messages

31 juil. 2012, 09:39

Bon voici ce que j'ai fait pour l'instant en php pour manipuler tout ça (insertion, suppression) :
<?php

class ArbreIntervallaire {
    
    private $_bg = 'borne_gauche';
    private $_bd = 'borne_droite';
    
    public static function insert($table,$borne_gauche_parent,Array $data=array()){
    
        $db = Zend_Db_Table_Abstract::getDefaultAdapter();
        
        $fields=array($this->_bg,$this->_bd);
        $values = array($borne_gauche_parent,$borne_gauche_parent+1);
        
        foreach($data as $k=>$v){
            $values[]=$v;
            $fields[]=$k;
        }
        $interros = array_fill(0,count($values),'?');
        $db->beginTransaction();

        try {
            
            $db->query('UPDATE '.$table.' SET '.$this->_bd.' = '.$this->_bd.' + 2 WHERE '.$this->_bd.' >= ?',$borne_gauche_parent);
            $db->query('UPDATE '.$table.' SET '.$this->_bg.' = '.$this->_bg.' + 2 WHERE '.$this->_bg.' >= ?',$borne_gauche_parent);
            $db->query('INSERT INTO '.$table.' ('.implode('',$fields).') VALUES ('.implode('',$interros).')',$values);

            $db->commit();
            $return = $db->lastInsertId();

        } catch (Exception $e) {
            
            $db->rollBack();
            $return = false;
        }
        
        return $return;
    }
    
    public static function delete($table,$borne_gauche){
        
        $db = Zend_Db_Table_Abstract::getDefaultAdapter();
        
        try {
            
            $db->query('DELETE FROM '.$table.' WHERE '.$this->_bg.' = ?',$borne_gauche);
            $db->query('UPDATE '.$table.' SET '.$this->_bg.' = '.$this->_bg.' - 2 WHERE '.$this->_bg.' >= ?',$borne_gauche);
            $db->query('UPDATE '.$table.' SET '.$this->_bd.' = '.$this->_bd.' - 2 WHERE '.$this->_bd.' >= ?',$borne_gauche);

            $db->commit();
            $return = true;

        } catch (Exception $e) {
            
            $db->rollBack();
            $return = false;
        }
        
        return $return;
    }
    
    public static function deleteChildren($table,$borne_gauche,$borne_droite){
        
        $db = Zend_Db_Table_Abstract::getDefaultAdapter();
        
        try {
            
            $db->query('DELETE FROM '.$table.' WHERE '.$this->_bg.' >= ? AND '.$this->_bd.' <= ?',array($borne_gauche,$borne_droite));
            $db->query('UPDATE '.$table.' SET '.$this->_bd.' = '.$this->_bd.' - '.($borne_droite-$borne_gauche+1).' WHERE '.$this->_bd.' >= ?',$borne_gauche);
            $db->query('UPDATE '.$table.' SET '.$this->_bg.' = '.$this->_bg.' - '.($borne_droite-$borne_gauche+1).' WHERE '.$this->_bg.' >= ?',$borne_gauche);

            $db->commit();
            $return = true;

        } catch (Exception $e) {
            
            $db->rollBack();
            $return = false;
        }
        
        return $return;
    }
}
Il me manque les déplacement à coder et j'appliquerais ensuite tout ça à mon application pour vérifier que cela fonctionne bien :)

Merci encore

ViPHP
ViPHP | 3607 Messages

02 août 2012, 09:21

Bon j'avance dans l'utilisation des arbres intervallaires, et j'ai une chose qui me manque (et j'espère que j'ai mal cherché, j'ai pas envie de faire ça à la main), j'aimerais savoir s'il existe un générateur de graph de ce style : http://sqlpro.developpez.com/cours/arbo ... Ltree3.gif
Afin de vérifier que les scripts écrit donne bien les bons résultats...

Merci d'avance !

(note: le script plus haut est en partie buggué, je corrigerais une fois tout vérifié chez moi)

ViPHP
ViPHP | 2287 Messages

03 août 2012, 10:05

Bon j'avance dans l'utilisation des arbres intervallaires, et j'ai une chose qui me manque (et j'espère que j'ai mal cherché, j'ai pas envie de faire ça à la main), j'aimerais savoir s'il existe un générateur de graph de ce style : http://sqlpro.developpez.com/cours/arbo ... Ltree3.gif
Afin de vérifier que les scripts écrit donne bien les bons résultats...

Merci d'avance !

(note: le script plus haut est en partie buggué, je corrigerais une fois tout vérifié chez moi)
Je n'en connais pas, mais comme le format que tu choisis pour stocker ton arbre est toujours assez spécifique (en dehors des champs pour la gestion de l'arbre lui-même) le plus simple à mon avis est de générer un jeu de données à l'aide d'une interface de gestion d'arbre de ta création :) ( J'imagine que tu avais déjà planifié ce développement, non ? ;) )
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 3607 Messages

04 août 2012, 11:48

Bien sûr je compte bien pouvoir administrer cet arbre via une admin dand mon application.
Mais j'ai déjà des données à importer avant ça (5000 entrées), et je voudrais vérifier que ça se fait bien graphiquement :)
Donc je voulais me générer un petit graph pour ça !
Je vais peut-être essayer avec https://google-developers.appspot.com/c ... ry/treemap (ou un truc en html css, mais ça va vitre être chiant)

Bref à voir !

Mammouth du PHP | 1668 Messages

06 août 2012, 15:54

Bonjour,

Si tu n'as pas terminé regarde GraphViz, c'est pas mal pour représenter tout ce qui est arbres, graphes, modèles, etc.

PS : pour ton soucis tu as des bibliothèques déjà toutes faites pour les arbres ou les RI dans PostgreSQL, tu as même PostGIS qui gère les graphes, mais tu n'as pas mentionné ton SGBD(R) :/
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 3607 Messages

06 août 2012, 16:40

Je n'ai pas encore commencé ;)
Alors je vais regarder cet outil !

Pour le SGBD, je suis sous MySql.