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

Conception Web Discussion :

Dilemme Performance/Base de données


Sujet :

Conception Web

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 12
    Points
    12
    Par défaut Dilemme Performance/Base de données
    [Désolée si je n'ai pas mis le sujet dans le bon forum, il me semblait adapté :/]

    Voila, je travaille sur un projet avec un collègue qui est en alternance, comme moi, mais nous ne nous voyons quasiment jamais et il est très difficile à contacter. Nous devons ainsi nous débrouiller tous seuls dans notre coin quand nous codons quelque chose, et il se trouve que cette semaine je me retrouve à coder une fonctionnalité qu'il a déjà mis en place sur une autre partie du site.
    Alors, je pourrai reprendre son code, l'adapter bêtement et simplement, mais je n'ai pas envie de le faire pour plusieurs raisons :
    • Je suis dèv en Laravel et Symfony, et ce code est fait avec le Framework CodeIgniter. Tant qu'à faire, j'aimerai bien pouvoir coder en comprenant ce que je fais (question de compétences pour mon futur emploi);
    • Ca ne me semble absolument pas optimisé du tout pour la base de données.

    Pour expliquer tout simplement ce que fait cette fonctionnalité demandée, il s'agit d'un compteur de mot-clefs dans des textes pour notre site. Ainsi, nous pouvons voir facilement combien d’occurrences pour un mot-clefs spécifique il existe pour une catégorie/un produit donné, et nous aider pour le référencement naturel.
    Mon collègue a fait une table en base de données, avec uniquement deux colonnes : categ_id et keyword. Il n'y a pas de clef primaire, et donc la ligne est non-modifiable dans phpmyadmin, ce qui me semble déjà un peu à polémique. Il n'y a pas non plus de nombre d'occurrence du mot-clef, puisqu'il le fait au chargement de la page.
    Alors je pensais qu'il le faisait automatiquement en AJAX pour rendre tout ça dynamique, mais non, c'est en php dans le controller, avec une regex.

    Alors pourquoi une telle tartine ? Pendant mes cours de base de données, notre prof nous indiquait qu'il ne fallait surtout pas surcharger la base de données avec des informations qu'on peut calculer au chargement de la page (ici, l'analyse d'un texte pour compter des occurrences). Cependant notre prof de PHP nous disait de surcharger la base justement pour les performances. Et une troisième prof qui nous disait que des fois fallait surcharger, des fois non.
    Là, c'est une page qui n'est accessible qu'en partie administrateur (nous sommes trois personnes uniquement à avoir les logs), avec une connexion internet nulle (petit village perdu dans les montagnes). Du coup, je voulais avoir vos avis sur la question suivante :

    Dois-je faire un attribut "occurrence" dans la Bdd pour cette nouvelle fonctionnalité, et modifier la ligne à l'édition du texte concerné, ou est-ce que je dois laisser le calcul se faire au moment du chargement de la page ?

    Voila voila, j'espère que j'ai bien réussi à retranscrire mon soucis ^^"

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 239
    Points : 15 539
    Points
    15 539
    Par défaut
    Citation Envoyé par Yog-Sothot Voir le message
    Pendant mes cours de base de données, notre prof nous indiquait qu'il ne fallait surtout pas surcharger la base de données avec des informations qu'on peut calculer au chargement de la page (ici, l'analyse d'un texte pour compter des occurrences). Cependant notre prof de PHP nous disait de surcharger la base justement pour les performances. Et une troisième prof qui nous disait que des fois fallait surcharger, des fois non.
    Histoire de vous embrouiller un peu plus, je pense que les 3 profs ont raison.

    Recommençons au début puisque la règle que j'essaye d'appliquer quand je développe dit qu'il ne faut pas réfléchir à l'optimisation tant que toutes les fonctionnalité ne sont pas développées.
    Donc pendant le développement, il faut veiller à ne pas avoir d'informations en double dans la base de données. Donc le calcul du nombre de mots clés se fait à partir des textes cherchés dans la base et ces nombres ne sont pas stockées.
    Quand cette partie est développée et fonctionne bien, c'est maintenant le temps de l'optimiser. Si par exemple les textes sont modifiés une fois par jour et que le nombre de mots clés sont affichés toutes les 5 minutes, on voit bien la perte de temps de refaire le calcul à chaque fois si cela ne change pas souvent. Et donc à cette étape on peut optimiser en stockant le résultats des calculs dans une table et en faisant bien en sorte que cette table ne se mélange pas avec les tables de données (en mettant un nom qui commence par "cache_" par exemple).
    Donc le traitement est maintenant d'effacer et reconstruire cette table uniquement quand les textes sont modifiés et de lire cette table pour afficher les résultats du calcul.

    Là ce sont les 2 étapes de façon grossière. Quand on affine un peu, on arrive à d'autre problème :
    1 : à quel moment mettre à jour la table de cache ? la fonctionnalité à optimiser est le calcul des nombres donc normalement seulement elle devrait être modifiée. mais dans ce cas la 1re fois qu'on lit les nombres après une modification, on aura droit à une attente énorme le temps que le calcul se fasse
    2 : une optimisation de l'optimisation serait alors de faire ce calcul au moment ou un texte est modifié. dans le cas l'attente est reportée à l'enregistrement d'un texte, c'est un peu plus logique qu'un traitement prenne plus de temps qu'un affichage mais c'est encore trop long
    3 : pour optimiser le problème du 2 je vois déjà 2 possibilités 3a et 3b
    3a : au lieu d'effacer la table de cache en entier, on recalcule seulement ce qui est nécessaire. cela peut-être fait avec une table intermédiaire qui stocke des mots et la modification d'un texte ajout ou supprime des mots dans cette 2e table de cache. ça ressemble un peu à la solution de votre collégue
    3b : c'est un processus extérieur qui teste régulièrement si la cache à besoin d'être mis à jour. si par exemple ce test est fait tous les 5 minutes cela veut dire qu'il est possible que pendant 5 minutes après l'édition d'un texte, les nouveaux nombres ne sont pas encore disponibles


    au final, c'est peut-être le 3e prof qui a mieux répondu à la question en disant "ça dépend". ça dépend de la fréquence de la lecture par rapport aux mise à jours, ça dépend du temps de calcul du serveur, ça dépend de la quantité de données à traiter. ça dépend des vitesses des différents réseaux.
    Si par exemple le serveur est un vieil ordinateur et que la connexion réseau est directe avec un câble réseau, il vaut peut être mieux envoyer tous les textes au navigateur et le calcul des nombre de mots se fera en JavaScript

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Merci d'abord pour ta réponse très détaillée
    Alors dans notre cas, notre site est hébergé sur un serveur mutualisé, donc fi de serveur branlant et de connexion arthritique. Comme nous avons fait le lancement du site en octobre environ et que nous avons eu énormément de mal à reprendre l'activité (notamment dû aux attentats de Novembre, qui ont terriblement affecté les ventes en ligne), nous avons commencé une campagne de référencement naturel avec une entreprise externe.
    Ainsi, l'entreprise nous a conseillé de changer très régulièrement pour toutes les pages importantes (accueil, produits phares, catégories...) les textes et rajouter si possible des occurrences pour chaque mots clefs. On doit s'occuper de ces pages tous les jours, sinon tous les deux jours, dans l'optique d'améliorer notre classement. C'est justement parce que nous y allons très régulièrement que je me suis posé la question. Après nous n'avons pas non plus des milliards de mot-clefs à compter, mais c'était pour le principe (et pourquoi pas l'avenir ? ^^)

    Je verrai éventuellement pour optimiser aussi le système d'affichage des prix, mais cette fois-ci en partie utilisateur : nous utilisons le Framework laravel, et l'autre alternant (là depuis plus longtemps que moi) a mis des fonctions dans les Model pour calculer le prix le plus bas qui s'affichera en priorité dans les catégories/sous-catégories.
    Code php : 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
    public function prix(){
            $temp=0;
            foreach($this->tailles as $t)
            {
     
                if($temp==0){
                    if($t->prix_promo == 0){
                        $temp=$t->prix;
                    }
                    else{
                        $temp=$t->prix_promo;
                    }
     
     
                }
                else{
                    if($temp>$t->prix){
                        if($t->prix_promo == 0){
                            $temp=$t->prix;
                        }
                        else{
                            $temp=$t->prix_promo;
                        }
                    }
                }
            }
            return $temp;
        }
    Quand j'ai dû faire une fonction pour trier par prix ascendants ou descendants dans les catégories, je me suis retrouvée bien embêtée car je ne pouvais pas utiliser sa fonction en plus de la fonction Paginate de laravel, et j'ai dû faire une colonne dans la base de données correspondant au prix le plus bas à l'instant t où on le récupère. Je me suis faite engueuler par l'autre alternant car "pas joli", mais je reste convaincue que non seulement je n'avais pas tout à fait la possibilité de faire autrement, mais qu'en plus j'ai permis d'alléger d'un iota le temps de chargement de la page pour un utilisateur.

    Enfin voila, mes petits déboires informatiques ^^" Je vais du coup garder ta réponse sous le coude, je pense qu'elle me sera utile et pas seulement pour cette fois

    Et pour ce qui est des profs, les deux premiers ont des circonstances atténuantes : le premier nous apprenait le SQL en première année de BTS, donc il voulait qu'on intègre le principe des interactions entre tables. Le deuxième était notre prof de PHP de première année de BTS aussi, et essayait de nous inculquer quelques notions d'optimisation et de performance en nous indiquant qu'il ne fallait pas faire absolument comme le précédent prof nous avait enseigné.
    La troisième prof enfin est notre prof de Java, et pour un Bac+4 : leurs attentes sont différentes, et nous connaissons suffisamment les bases de nos langages pour commencer à réfléchir en terme performances et gains. Voila

Discussions similaires

  1. Grosse base de données et performances
    Par Promeneur dans le forum Optimisations
    Réponses: 26
    Dernier message: 19/05/2012, 11h47
  2. Performance base de données en réseau
    Par didieu dans le forum Access
    Réponses: 2
    Dernier message: 27/08/2007, 14h20
  3. Performance Base de données
    Par nicolep dans le forum Optimisations
    Réponses: 2
    Dernier message: 11/05/2007, 17h25
  4. Réponses: 13
    Dernier message: 21/02/2006, 23h43
  5. [Crystal] Performance sur grosses base de données
    Par Nico118 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 14/11/2003, 15h27

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