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

PostgreSQL Discussion :

Conception d'un forum hiérarchique


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut Conception d'un forum hiérarchique
    Bonjour à tous

    Je m'interroge sur la façon de concevoir un forum hiérarchique (à la manière des mailings list où chaque réponse est susceptible de recevoir une réponse et ainsi créer un "nouveau" sujet). Mon interrogation se porte notamment sur la façon de dérouler l'arborescence des messages.

    Je pense actuellement à créer une procédure stockée en base de données pour permettre d'aller chercher récursivement les messages et réponses des messages mais je ne suis pas sûr que ce soit la meilleure stratégie. Qu'en pensez-vous et quelle serait votre démarche pour concevoir ce type de forum ?

  2. #2
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Table Message :
    id | pid | titre | description

    id est un identifiant unique pour le message posté, pid (pour parent id) et l'identifiant du message père (celui auquel l'utilisateur répond).
    Ce schéma te donne un arbre (hiérarchie) ou les enfants connaissent leur père mais la réciproque n'est pas vrai. Ce n'est pas génant vu qu'un fils ne peut avoir qu'un père et qu'un père peut avoir plusieurs fils.
    Quand tu veux cherché si un message à des réponses tu n'as qu'à vérifier si :
    A.id == B.pid avec A ton objet père et B n'importe quel objet que tu parcours qui se révèlera fils si l'égalité est vérifiée.

  3. #3
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Salut et merci pour la réponse

    J'étais également arrivé à une structure de table similaire pour stocker les messages. Partant de là, si je veux savoir combien de réponses à un message par exemple, chaque sous-message y compris, je pense qu'il faut que je fasse une sorte de requête récursive en base de données..du genre, en algorithmie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FONCTION ObtenirReponsesAuMessage(IdMessage)
       SELECT reponses FROM messages WHERE id = IdMessage;
       TANTQUE reponses->nextResult() FAIRE
          ObtenirReponsesAuMessage(reponse->nextResult().Id)
       FINTANTQUE
    FINFONCTION
    Cependant je ne sais pas si l'approche est la meilleure, ce genre de fonction peut prendre beaucoup de temps processeur dans le cas d'un volume important de messages.

    Qu'en pensez vous ?

  4. #4
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT reponses FROM messages WHERE id = IdMessage;
    Plutôt ça (id => pid) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT reponses FROM messages WHERE pid = IdMessage;
    Sinon ouai c'est à peut près ça sauf qu'il faut que tu stocke les résultats dans un tableau par exemple.
    Il est vrai qu'avec cette approche tu dois à chaque fois reparcourir tous les message ce qui n'est pas très performant (mais tu peux placer un index sur pid pour avoir une recherche beaucoup plus rapide).

    Ce que tu peux faire c'est l'inverse. Au lieu que les fils retiennent leur père, ce sont les pères qui vont retenir leurs fils. Ainsi tu n'as pas besoin de parcourir tous les messages. Par contre cette architecture est moins souple, si tu veux déplacer un sujet par exemple avec la première architecture tu n'as qu'à changer le pid du message à déplacer alors qu'avec la deuxième tu es obliger de parcourir un tableau contenant tous les fils, trouver l'élèment à déplacer, copier son ID dans le message cible et supprimer son ID dans le message source. Mais il est vrai que ça doit être bien plus performant comme ça, ça se discute

  5. #5
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Il me semble que dans tous les cas, que les pères aient une référence vers leur fils ou l'inverse, il faudra parcourir récursivement l'ensemble des messages pour pouvoir reconstruire l'arbre des réponses !!!

    L'idée serait de pouvoir récupérer cet arbre depuis n'importe quel message, (premier, dernier, n-ième). La question est comment implémenter une récupération de cet arbre en base de données de manière efficace !

    Je vais faire quelques tests avec une procédure stockée récursive et voir ce que ça donne. J'aimerais pouvoir éviter de reconstruire l'arbre depuis la couche modèle et laisser la couche métier s'en occuper car cela amènerait à multiplier les requêtes !

  6. #6
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Citation Envoyé par muad'dib Voir le message
    Il me semble que dans tous les cas, que les pères aient une référence vers leur fils ou l'inverse, il faudra parcourir récursivement l'ensemble des messages pour pouvoir reconstruire l'arbre des réponses !!!
    Oui en effet tu as raison je suis entrein de dev en C++ là et je voyais l'identifiant comme un pointeur donc oui dans tous les cas là il faudra parcourir tous les éléments, moi j'ai opté pour l'approche le fils retient son père, c'est simple et souple. Tu cherche à faire quoi à éliminer la récursivité de la recherche ? Si c'est le cas tu devrais y arriver sans problème mais en utilisant la deuxième approche.

Discussions similaires

  1. Conception d'un SGBD hiérarchique
    Par itmak dans le forum Débuter
    Réponses: 8
    Dernier message: 29/01/2008, 09h39
  2. conception d'un forum
    Par bebecop dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/12/2006, 10h50

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