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

Symfony PHP Discussion :

Optimisation d'un code [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut Optimisation d'un code
    Bonjour, voici mon "probleme", en quelque sorte ...
    J'ai une liste de "sites", que je veux organiser en arbre, selon divers critères

    • Par département
      • Loire
        • Site 1
        • Site 2
        • Site n
      • Saone et Loire
        • Site n
    • Par ville
      • Lyon
        • Site 1
        • Site n
      • Paris
        • Site 1
        • Site 2
        • Site n
    • Par région
      • Rhone-Alpes
        • Site 1
        • Site n
      • Haute-Alpes
        • Site 2
        • Site n
    • DE A a Z
      • Site 1
      • Site 2
      • Site n


    Un Site peut donc être présent plusieurs fois.
    Mon souci vient de l'optimisation du code, en effet pour chaque nouveau critère (département, ville, région ...), je fais une nouvelle requête dans mon action.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $this->list_%%critere%%=Doctrine::getTable('%%critere%%')
                                             ->getWithSiteQuery()
                                             ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
    foreach($this->list_%%critere%% as $key=>$value){
          $q = Doctrine::getTable('%%critere%%')
                                ->getSiteQuery($value['id']);
     
          $this->list_%%critere%%[$key]['sites']=$q->execute();
    }
    J'utilise ici %%critere%% pour vous faire comprendre que ce bloc de code est dupliqué à chaque fois, avec un nouveau critère.

    Question : Ca serait pas un peu barbare ma technique ? , d'autant plus que je vais avoir de plus en plus de critères, des idées pour optimiser tout ca ?

    Je trouve bizarre de faire autant de requêtes, alors qu'on va chercher les mêmes objets en DB, et que juste l'affichage est différent.

    Merci d'avance,

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je ne comprend pas comment tu peux faire une relation "many-to-many" avec seulement deux tables ?

    Je suppose que getSiteQuery() et getWithSiteQuery() sont des méthodes que tu as développées, sans le code sous-jacent, difficile de comprendre.

    Peux-tu donner plus d'information et aussi le shema.yml de ta base ?

  3. #3
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut
    En fait c'est une relation one-to-many. C'est à dire que par exemple un département comprend n sites, je voulais simplement dire qu'un site sera présent à la fois dans le département "Loire", mais aussi dans la liste de A a Z et dans la ville "Lyon".

    Voici le code de mon action en totalité, j'ai remis le code factorisé du modèle pour plus de clarté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    public function executeIndex(sfWebRequest $request){
     
        // la liste des départments avec leurs sites	
        $this->departement_liste=Doctrine::getTable('departement')
                    ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
        foreach($this->departement_liste as $key=>$value){
            $q = Doctrine_Query::create()
                                 ->from('site s')
                                ->where('s.id_departement = ?', $value['id'];
     
            $this->departement_liste[$key]['sites']=$q->execute();
        }
     
        // la liste des villes avec leurs sites
        $this->ville_liste=Doctrine::getTable('ville')
                            ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
        foreach($this->ville_liste as $key=>$value){
            $q = Doctrine_Query::create()
                                ->from('site s')
                                ->where('s.id_ville = ?', $value['id'];
     
            $this->ville_liste[$key]['sites']=$q->execute();
        }
     
        // la liste des régions avec leurs sites
        $this->region_liste=Doctrine::getTable('region')
                            ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
        foreach($this->region_liste as $key=>$value){
            $q = Doctrine_Query::create()
                                ->from('site s')
                                ->where('s.id_region = ?', $value['id'];
     
            $this->region_liste[$key]['sites']=$q->execute();
        }
     
        // la liste des sites de A a Z
        $this->AtoZ_liste=Doctrine::getTable('site')
                            ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
    }
    J'imagine qu'il doit y avoir plus simple et plus optimisé.
    Merci en tout cas d'avoir pris du temps pour me répondre

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Et une requête du genre (attention, c'est juste une idée, je n'ai pas testé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $q = new Doctrine_Query::create()->
                    from('Site s')->
                    leftJoin('s.Departement d')->
                    where('s.id_departement = ?', $value['id'])->
                    orWhere('s.id_ville = ?', $value['id']);
    devrait retourner les sites d'un département ou d'une ville et les régions correspondantes.

    Plus d'info dans DQL (Doctrine Query Language) sur le site de Doctrine (en anglais mais facilement compréhensible).

  5. #5
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut
    Normalement ca devrais marcher ta requête, sauf que je veux aussi la liste de tous les départements,
    la liste donnée dans mon premier poste constitue le rendu exact dans ma page, rien de plus, rien de moins.


    je vois 3 méthodes pour avoir ce rendu
    - celle que j'ai utilisé, avec des requêtes distinctes selon le type de tri
    - une requête simple sur la table "site", puis tout retrier en PHP
    - une requête simple sur la table "site", puis tout retrier en javascript

    Quelle est la méthode la plus rapide ?

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Dans ton exemple de début, les départements affichés ont tous un site et il n'y a pas de site pour les départements qui ne soient dans les autres listes...

    Il faudra effectivement faire quelques tris dans les tableaux de résultats, mais en mémoire.

    On peut aussi créer trois requêtes, une pour les départements, une pour les villes et une pour les régions, cela fait toujours beaucoup moins que l'actuel. Ceci me semble être la solution la plus simple, et peut-être la plus rapide car une très grosse jointure avec plusieurs conditions "ou" qui ne pourront pas être optimisées par un index...

    Quant a re-trier en javascript, cela condamne tous ceux qui n'ont pas ou on désactivé le javascript, ce qui me semble une mauvaise idée.

  7. #7
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut
    Ok, donc le php serait la meilleure solution face a trop de requêtes SQL.

    Pour l'instant ... mais je suis toujours preneur d'une solution ou d'un concept plus élégant

    Merci en tout cas.

  8. #8
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    En fait, je suis un peu "sec" sur ta structure de base de données.

    De plus j'ai beaucoup de mal à voir la différence entre ville, région et département, pour moi, c'est trois niveaux d'une même arborescence : une ville fait partie d'un département qui fait partie d'une région. Et je ne vois pas pourquoi un site ferait partie d'une ville (Lyon) d'une région (Bretagne) tout en étant rattaché au département Ile de France...

    Où alors un site peut être lié à plusieurs villes, département, régions...

    Pour l'écran tel que tu le souhaite, et les 4 listes, le plus simple, après réflexion me semble 4 requêtes DQL.

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 277
    Par défaut
    Salut,

    J'ai eu quelque chose de similaire: c'était pour la gestion de catégories, sous catégories et sous catégories.....

    Tu peux peut être regarder du côté de la gestion d'arbres par représentation intervallaire.

    Ya un très bon tuto sur le site: http://sqlpro.developpez.com/cours/arborescence/


  10. #10
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut
    Citation Envoyé par mimi68 Voir le message
    Et je ne vois pas pourquoi un site ferait partie d'une ville (Lyon) d'une région (Bretagne) tout en étant rattaché au département Ile de France...
    Euh oui en fait, j'ai refait un exemple, mais totalement incohérent il est vrai
    En fait ca ne sera pas seulement des catégories géographiques, il y aura aussi d'autres critères. Donc un site pourra faire partie de Lyon, Rhone-Alpes, et "sites xxxx" et A-Z

    Pour la représentation intervallaire, du lourd !!!!
    Je sais pas si je vais l'utiliser (un peu short sur les délais ), mais je garde de tuto en stock c'est clair.

  11. #11
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Tu pourrais simplement créer une méthode dans ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    public function getCriterias($criteria){
        $membername = 'list_'.$criteria;
        $this->{$membername} = Doctrine::getTable($criteria)
                                             ->getWithSiteQuery()
                                             ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
        foreach($this->{$membername} as $key=>$value){
             $q = Doctrine::getTable($criteria)
                                ->getSiteQuery($value['id']);
             $this->{$membername}[$key]['sites']=$q->execute();
        }
    }
    Pour gérer dynamiquement le nommage des membres internes de ta classes, tu peux très probablement implémenter la méthode magique __get :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function __get($key){
        if(!property_exists(get_class($this), $key)){
             $this->$key = NULL;
        }
        return $this->$key;
    }

  12. #12
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut
    Merci pour ces réponses, je vais me diriger vers la solution de ThomasR.
    Mais je garde la représentation intervallaire sous le coude dès que mon arbo dépasse 3 niveaux.

  13. #13
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je me permet encore deux petites remarques :

    Attention à la fonction __get(), elle est utilisé dans de nombreux objets sous symfony et doctrine, ne pas oublier de faire appel au parent;

    Il y a dans doctrine et donc dans symfony un outils intégré de gestion de hiérarchies avec 2 types de hiérarchies supportées :
    • Simple origine
    • Multiple origines

    Et tous ce qui va autour pour gérer les nœuds.

    Peut-être est une autre piste ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Optimisation C++] Calcul code altitude
    Par Spout dans le forum C++
    Réponses: 7
    Dernier message: 13/11/2007, 22h17
  2. Y a-t-il une solution pour optimiser mon petit code ?
    Par pierre987321 dans le forum Delphi
    Réponses: 20
    Dernier message: 14/06/2007, 10h53
  3. Optimisation de mon code ActionScript
    Par amnesias dans le forum Flash
    Réponses: 9
    Dernier message: 01/04/2007, 22h04
  4. Optimisation d'un code !
    Par leserapheen dans le forum Pascal
    Réponses: 20
    Dernier message: 09/03/2007, 14h00
  5. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/05/2006, 18h47

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