Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3000 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Question de conception d'une table

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question de conception d'une table

n°1515930
cgo2
Dum spiro spero
Posté le 17-02-2007 à 11:50:19  profilanswer
 

Bonjour tout le monde,
 
J'ai une table qui contient un champ A, un champ B et un champ C (de type integer ou float). Dans mon application j'ai souvent besoin de selectionner, de filtrer (where) et de trier (order by) par une valeur Z qui est (A * B / 2.5) + C
 
Je me pose une question existentielle : quelle est la meilleure façon de représenter ça ? Pour l'instant, j'ai imaginé 3 possibilités :
 
1) Selectionner Z à chaque requete, par exemple :

SELECT A, B, C, (A * B / 2.5) + C as Z [...] ORDER BY Z


 
2) J'ajoute un champ Z à ma table et dans mon application, à chaque fois que je modifie A, B, ou C, je met également Z à jour.
 
3) Je crée une vue de ma table qui contient Z.
 
Que conseillez-vous, et pourquoi ?
 
Merci pour votre aide !


---------------
When it's from Finland it's good.  - Mon blog
mood
Publicité
Posté le 17-02-2007 à 11:50:19  profilanswer
 

n°1515962
Beegee
Posté le 17-02-2007 à 13:32:04  profilanswer
 

Ca dépend du SGBD en fait.
 
Certains permettent de créer des indexes basés sur le résultat d'une fonction (Oracle 8i et plus, par exemple: "function based index" ).
 
Mais ça n'est intéressant que si le volume de données est important, et si effectivement beaucoup des requêtes vont se servir de cet index ;)
Et tu perds un peu de perfs lors des insertions / mises à jour de la table.

n°1515971
cgo2
Dum spiro spero
Posté le 17-02-2007 à 14:18:16  profilanswer
 

J'utilise mysql 5...

n°1515991
Beegee
Posté le 17-02-2007 à 15:57:32  profilanswer
 

Apparemment y a ni vue matérialisée, ni index basé sur une fonction avec mySql 5 ...
 
A toi de faire des tests donc.
Crée la table sous mySql, insère le volume de données qui te semble adéquat, crée ou non la colonne supplémentaire (indexée), et lance tes requêtes pour mesurer le gain ;)

n°1516472
MagicBuzz
Posté le 19-02-2007 à 14:54:43  profilanswer
 

Pour reprendre ce que dit beegee, on a aussi les colonnes calculées, qu'on trouve sous SQL Server par exemple, et qui sont indexables (soit en utilisant l'index des champs d'origine, soit en stockant physiquement le résultat et en l'indexant). Mais bon, ça n'existe pas plus sous MySQL que le reste.
 
Tu as donc la solution de la vue. Niveau perfs, ce sera meilleurs que ta requêtes, mais il ne faut pas t'attendre à un super gain. Par contre c'est l'avantage de ne pas polluer ta table avec des données calculées, tout en conservant un moyen de retrouver ces valeurs simplement.
 
Reste la solution de créer ton propre système de colonne calculée, à savoir créer un champ Z, et créer deux trigger, un sur insert et un sur update, qui viendront le remplir (c'est l'assurance de ne pas avoir des données incohérentes dans ta table si un jour tu oublies de mettre à jour Z).
 
Normalement, tout ce dont tu as besoin pour faire ça sont dans MySQL 5


Message édité par MagicBuzz le 19-02-2007 à 14:55:43

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Question de conception d'une table

 

Sujets relatifs
Question sur ORDER BY avec MATCHproblème de table
Question bête sur "new"[Résolu] Récupérer le nom des champs d'une table MySQL
Comment créer une table InnoDB sous PHPMyadmin 2.9.1.1 ?modification table sous phpmyadmin
Question sur les CASE... BREAKQuestion sur mon programme Calculatrice...
modifier ou suppriemer une entrée dans une tableQuestion con VBA<->VBS
Plus de sujets relatifs à : Question de conception d'une table


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR