Page 1 sur 1

Quoi inserer ? une phrase type ou son code chiffre?

Posté : 29 sept. 2006, 09:13
par iruka2
Bonjour,

Je voudrais savoir s'il etait preferable d inserer dans une table des valeurs numeriques issues d un formulaire ou simplement enregistrer l info telle quelle ?

ex : un select avec 3 choix : le matin, le midi, le soir.

mieux vaut-il entrer 'le matin', 'le midi', 'le soir' ou une transformation '1','2','3'

Sur un seul cas, c est tout a fait gerable pour transformer cote php 1 vers le matin mais lorsqu on a cet exemple X 15 ou 20 fois, est-ce vraiment gerable? cela va t il permettre d alleger la table et les requetes ?

les transformations necessaires par php ne vont finalement pas faire perdre le suppose gain ?

Posté : 29 sept. 2006, 22:07
par Hubert Roksor
Tout dépend vraiment du contexte. Quelques points pouvant influencer la meilleure solution:
  • est-ce que ces valeurs sont utilisées à la fois dans des requêtes et dans des traitements en PHP
  • est-ce que le nombre de valeurs ("matin", "midi", etc...) est variable ? redéfinissable par l'utilisateur ?
Dans l'absolu, je recommanderais d'aller avec ce qui te parait le plus naturel parce qu'au niveau des performances la différence est très négligible en règle générale.

Si les valeurs en question ne sont pas redéfinissables, tu as deux solutions:
  • utiliser des constantes PHP comme:
    mysql_query('UPDATE table SET horaire = ' . MATIN . ' WHERE user_id = 2');
  • utiliser le type de données "ENUM" (MySQL uniquement) et là les performances pratiquement optimiale (quasi-identique en taille et en rapidité à ce que l'on pourrait obtenir en faisant la "traduction" en PHP). Là ta requête utilise directement les valeurs contenues dans ENUM, eg

    Code : Tout sélectionner

    UPDATE table SET horaire = 'matin' WHERE user_id = 2
    ...sauf qu'en interne, MySQL remplace le 'matin' par une valeur numérique stockée en interne.
Si les valeurs sont redéfinissables, alors le mieux est de les stocker dans une table avec une ID primaire AUTO_INCREMENTée et d'utiliser l'ID pour faire le lien.

Il m'arrive très souvent d'utiliser la troisième et la première solution, mais suivant ton style tu peux préférer la seconde.

Posté : 30 sept. 2006, 15:22
par iruka2
Merci Hubert Roksor pour tes explications!

Alors les donnees auxquelles je pense ne sont pas censees etre modifiable par l utilisateur.
elles sont utilisees pour des requetes.

je n ai pas compris la methode par constantes ?
on creer un fichier contenant toutes les variables :

define(MATIN,1);
define(APRESMIDI,2);
etc,

et on utilise les constantes pour les requetes et manipulations php?

l interet que je vois a cette methode est de pouvoir gerer beaucoup plus facilement la partie php notamment. MATIN parle beaucoup plus que 1.
c est le principe?

Concernant enum, je ne connaissais pas mais ca a l air pas mal aussi.
c est peut etre plus optimum cote DB mais peut etre moins evident a gerer sur le long terme par rapport a un fichier de constantes qui servirait d aide memoire tres utile?

La question que je me posais etait de savoir si
select membreid FROM journee WHERE momentdelajournee=1
est plus rapide que momentdelajournee='matin'
?
ensuite inserer 'matin' 3000 fois est, je suppose, plus lourd que 1 ?

Posté : 30 sept. 2006, 16:14
par Hubert Roksor
on creer un fichier contenant toutes les variables [...] et on utilise les constantes pour les requetes et manipulations php? [...] c est le principe?
Exactement. De cette façon, ton code PHP reste lisible parce que tu utilises des noms comme 'MATIN' ou 'SOIR' mais les requêtes, elles, contiennent la valeurs correspondant (1 ou 2 par exemple).
moins evident a gerer sur le long terme par rapport a un fichier de constantes qui servirait d aide memoire tres utile?
Sous phpMyAdmin ou dans le code de création de la table tu as forcément la liste des valeurs possibles. Si le champs "horaire" est de type ENUM('matin', 'midi', 'soir') tu ne pourras rien rentrer d'autre que 'matin', 'midi' ou 'soir'.
select membreid FROM journee WHERE momentdelajournee=1
est plus rapide que momentdelajournee='matin' ?
Pour te donner un ordre de grandeur, disons qu'un page web bien conçue demande 100ms. Le SELECT avec ENUM prendra peut-être 2ms, le même SELECT avec un chiffre (constante PHP) prendra quelque chose comme 1.8ms (mais ce que tu gagnes en MySQL tu le perds en PHP qui est obligé de "traduire" la constante). Le même SELECT avec un champs VARCHAR(255) prendrait... 2-3ms ? Autant dire qu'il ne s'agit pas vraiment d'un problème de performance puisque la requête en elle-même ne représente qu'une partie infime du travail nécessaire à la génération d'une page.

Quant à l'insertion... pas vraiment, les INSERT sont vraiment rapides, pas de quoi s'affoler.

Posté : 01 oct. 2006, 07:59
par iruka2
Merci encore pour tes explications!

a priori, les performances ne changent pas tant que ca quelque soit la methode mais je vais m essayer aux constantes pour voir !

merci !