IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Gestion d'un arbre hiérarchique ?


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Gestion d'un arbre hiérarchique ?
    Bonjour à tous,

    Je souhaite utiliser le système "d'arbre hiérarchique" tel que décrit dans cet excellent - mais ancien - article : https://sqlpro.developpez.com/cours/arborescence/ sur une table existante, mais je ne comprend pas la logique nécessaire pour faire un update des colonnes BG(gauche) et BD(droite).

    Ma table est classique : ID - NOM - ID PARRAIN - BG - BD

    Les nœuds ("pères") ont un ID PARRAIN à 0 tandis que les feuilles ("enfants") ont un ID PARRAIN égal à l'ID de leur père. Bien entendu il y a plusieurs niveaux.

    En fouillant, j'ai trouvé une autre méthode décrite ici : https://www.mysqltutorial.org/mysql-...ncy-list-tree/ mais elle nécessite MySQL 8 alors que je suis limité à 4.9. sur mon serveur Infomaniak. Peut-être existe t'il une autre méthode, mais je ne l'ai pas trouvée.

    Pouvez vous m'aider ?
    D'avance merci.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 351
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 351
    Billets dans le blog
    17
    Par défaut
    je ne comprend pas la logique nécessaire pour faire un update des colonnes BG(gauche) et BD(droite)
    L'article explique le principe à l'aide de schémas section II. et de :
    on décale de deux unités tous les bords, droits ou gauches, sans distinction aucune, dont la valeur est supérieure ou égale à la borne droite du père visé par l'insertion.
    Une autre façon de voir les choses est de dire que l'intervalle du père visé par l'élément à insérer, grossit de deux unités pour absorber le nouveau fils et que cela conduit tous les bords situés à droite du père à un décalage de deux unités
    Relis bien tout cela.

    je suis limité à 4.9
    MySQL 5 date de ~2005
    Je ne suis même pas sûr que MySQL 4.9 ait existé (de mémoire on est passé quasiment de 3 à 5, 4 ayant été très peu utilisé), tu dois confondre avec autre chose, phpMyAdmin ?
    Fais un select version(); pour connaître la version du serveur.

    Les arbres bornés sont rapides à lire, mais plus difficiles à appréhender et à modifier. Le jeu n'en vaut peut-être pas la chandelle. Un modèle classique en

    member
    -----------
    id
    name
    parent_id (=> member.id)

    est peut-être suffisant. Tu peux reconstituer l'arbre en PHP ou avec une CTE récursive (MySQL 8).

  3. #3
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour et merci de ta réponse claire.
    Je vais lire et tenter de capter cet article et je reviens

    Pour la version tu as raison c'est PhpMyAdmin ! La SQL est 5.4

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 351
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 351
    Billets dans le blog
    17
    Par défaut
    La SQL est 5.4
    La 5.4 n'est pas référencée parmi les archives => https://downloads.mysql.com/archives/community/
    La 5.5 date de 2009
    Tourner sur de si vieux serveurs ne permettra pas d'utiliser les derniers progrès

  5. #5
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Me suis gourré, voici ce que me donne version()

    5.7.30-log
    Pas bon ?

  6. #6
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Je reviens sur l'intervallaire de ma table...

    J'ai compris que je dois traiter chaque parrain (dont id_parrain = 0) séparément. Ok.
    Si je prends l'ID 1, un simple WHERE id_parrain=1 me donne tous les filleuls. Mais après, comment je descends dans l'arbre de chaque filleul pour l'update des bornes gauche et droite ? Une requête récursive en php ?

    Et si je traite le parrain 2 de la même façon, je vais me retrouver avec plusieurs BG et BD de valeur identique ?

    Ben je galère bien...

  7. #7
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 351
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 351
    Billets dans le blog
    17
    Par défaut
    Il ne faut pas mélanger les 2 représentations hiérarchiques ! Mélanger ces 2 représentations est source de redondance, de confusion et donc d'incohérences.
    => Soit tu utilises une clef étrangère ID parrain
    => Soit tu utilises la représentation intervallaire, et là tu n'as plus de colonne "ID parrain", mais seulement des bornes

    Définis tes besoins et choisis la représentation de l'arbre en fonction de ces derniers.

    Chercher le parrain d'un membre selon son :parrain_id, modèle classique :

    SELECT ALL id, nom
    FROM membre
    WHERE id = :parrain_id
    Chercher le parrain d'un membre selon ses :bg et :bd, modèle intervallaire :

    SELECT ALL id, nom
    FROM membre
    WHERE bg < :bg AND bd > :bd -- Parents du membre (bornes englobantes)
    ORDER BY bd - bg ASC        -- Triés pas proximité (delta du plus faible au plus élevé)
    LIMIT 1                     -- On en conserve un seul, le parrain
    Concernant la màj, lis la section II-K. Insertion d'un élément dans cette arborescence, fais des tests, et en cas de blocage pose des questions précises avec des exemples de données SQL et de requêtes.

    https://sqlpro.developpez.com/cours/arborescence/

  8. #8
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Merci, j'y retourne

Discussions similaires

  1. Gestion de l'arbre des composant d'une vue
    Par bza88 dans le forum JSF
    Réponses: 6
    Dernier message: 21/07/2017, 19h01
  2. Arbres intervallaires - gestion de plusieurs arbres
    Par _Jnie_ dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/05/2015, 15h31
  3. Réponses: 0
    Dernier message: 11/05/2012, 15h16
  4. Gestion d'arbres par représentation intervallaire
    Par Djebel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/10/2006, 17h28
  5. Gestion d'arbres par représentation intervallaire
    Par brice01 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/01/2006, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo