Si il a un champ ou il n'y a jamais que 4 valeurs différentes (oui,non, bof, demain), on aurait tout à y gagner à utiliser un indice numérique pour lequel on utilisera une jointure pour récupérer sa valeur texte.
@Berzemus
Oui et mille fois oui dans le cas d'une base de données "normale".
Mais là on se place dans le cas de base de données avec des dizaines de millions de lignes utilisée en consultation. On est dans des cas qui sont (ou qui se rapprochent) des techniques de datawarehouse. Et comme je le répète, dans ce genre de système, on évite les jointures et on fait péter les règles sur la normalisation : ce n'est pas grave, on sait qu'on fait quelque chose qui n'est pas dans les standards et on le fait de manière consciente et contrôlée.
Exemple : On va créer une table de consultation (script très simplifié) des abonnés du téléphone
Code : Tout sélectionner
drop table consultation;
create table consultation
as
select a.nom, a.prenom, a.codepostal, a.telephone, v.libelle as ville, d.codedepartement, d.libelle as departement
from abonne a, ville v, departement d
where a.codepostal = v.codepostal
and v.codedepartement = d.departement;
Ce script va tourner une fois tous les week-end. Les jointures ne seront faites qu'une seule fois. Peu importe que cela prenne 1 heure.
Après on met des index sur codepostal et codedepartement
Au final, on a une table consulation (nom, prenom, telephone, codepostal, ville, codedepartement, departement)
C'est cette table qui est utilisée tous les jours par les milliers d'utilisateurs. Et tu vas avoir des requêtes :
Code : Tout sélectionner
select nom, prenom, telephone, ville, departement from consultation where codedepartement = '92'
qui seront beaucoup plus rapides que d'exécuter plusieurs milliers de fois par jour
Code : Tout sélectionner
select a.nom, a.prenom, a.telephone, v.libelle as ville, d.libelle as departement
from abonne a, ville v, departement d
where a.codepostal = v.codepostal
and v.codedepartement = d.departement
and d.departement = '92'
Encore une fois, entendons-nous bien : il ne s'agit pas de mettre ce genre de structure en place pour de mises à jour, des insert, ... mais uniquement pour des consultations et en plus, pas sur des tables qui sont mises à jour en temps réel, mais sur des tables de consultation qui sont mises à jour tous les jours, toutes les semaines, toutes les années,...
Et d'un autre côté, on aura les tables remplies tous les jours chaque fois que quelqu'un déménage ou se fait poser le téléphone. Celles-là sont bien sûr parfaitement normalisées.
Pour la consultation, on dénormalise, on embarque les libellés avec les codes : ce n'est pas ce qui est écrit dans les manuels SQL, c'est vrai. Mais du moment que l'on sait que l'on n'est plus dans les clous, que l'on sait pourquoi, qu'on justifie pourquoi et que tout ça est bien documenté, il n'y a pas de problème.
Parce qu'à un moment, il faut bien répondre au besoin de l'utilisateur : il est hors de question que l'on dise à l'utilisateur "vous allez attendre 20 secondes parce que les règles SQL disent qu'il faut normaliser". Il y a un moment où il faut être pragmatique. Comme le disait un de mes premiers responsable "Appliquer des règles sans réfléchir est aussi dangereux que de ne pas appliquer de règles" ou "L'excès de méthode est aussi dangereux que l'absence de méthode".
Donc pense ce que tu veux, trouve cela horrible, impie, hérétique, ... mais la dénormalisation est une méthode couramment employée pour les consultations des grosses bases de données.