[BDD] Récupérer tout les descendant

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [BDD] Récupérer tout les descendant

Re: [BDD] Récupérer tout les descendant

par jojolapine » 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.

Re: [BDD] Récupérer tout les descendant

par katagoto » 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) :/

Re: [BDD] Récupérer tout les descendant

par jojolapine » 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 !

Re: [BDD] Récupérer tout les descendant

par Calimero » 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 ? ;) )

Re: [BDD] Récupérer tout les descendant

par jojolapine » 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)

Re: [BDD] Récupérer tout les descendant

par jojolapine » 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

Re: [BDD] Récupérer tout les descendant

par jojolapine » 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 !

Re: [BDD] Récupérer tout les descendant

par Calimero » 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

Re: [BDD] Récupérer tout les descendant

par jojolapine » 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 :)

Re: [BDD] Récupérer tout les descendant

par xTG » 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 ?

[BDD] Récupérer tout les descendant

par jojolapine » 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,