8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Au moment où je réfléchis à remettre en forme une de mes premières bases dans laquelle j'ai rajouté des choses au fur et à mesure des mes besoins, je me pose une questions sur la normalisation de celle-ci...

Exemple: je gère une base de données de résultats de F1 et de GP2, soit 2 catégories pour une seule table résultats.

Me souvenant du peu de cours que j'ai eu sur le sujet, je l'avais, à l'époque, normalisée au maximum, à savoir:

1 table `resultats` comprenant les résultats et faisant référence à une table `categories` via le champ `xid_categorie`.

Ma table `categories` ne comprend que les valeurs suivantes:

id_categorie 	categorie 
1	F1
2	GP2


Le champ `xid_categorie` de ma table `resultats` ne comprend donc que des 1 et des 2.

Je sais que d'un point de vue performances, et dans le cas où je n'interroge que ma table `resultats`, c'est préférable d'utiliser des 1 et des 2 que des mots style 'F1' ou 'GP2'. Mais d'un point de vue pratique, ayant souvent besoin du nom de la catégorie (pour la faire afficher dans des liens ou des tableaux,...), je me retrouve à faire une jointure.

Le problème est que je lie souvent ma table `resultats`à d'autres tables également, et ça me fait donc une jointure de plus à gérer (source d'erreur accrue, lisibilité de la requête moins aisée, etc.)

Bref, pensez-vous que je doive conserver une normalisation si pointue de ma base? Ou bien cela ne changera pas grand-chose de mettre directement le nom de mes catégories dans ma table de résultats, si ce n'est de me faciliter la vie sur la construction des mes requêtes?

Et quid des performances?

J'ai fait également la même chose avec les saisons par exemple, ou le champ `xid_saison` comprend des valeurs de 1 à 8 au lieu de contenir directement l'année de la saison, à savoir 2003, 2004, 2005,...


Merci d'avance pour vos avis éclairés.
Administrateur
Et bien tout est toujours question de compromis entre
- performances
- lisibilité
- espace de stockage

Selon la quantité de champs à maintenir et leur mode d'insertion / mise à jour et la quantité de lectures. Il est évidemment toujours préférable "sur la forme" d'utiliser des jointures (avec des clés INT de préférence et non du texte).

Je dirais que dans le cas présent, si c'est juste pour classer en catégorie 1 / 2 et que celles-ci ne bougent pas trop, il est possible de les "hardcoder" (en PHP dans un petit tableau par exemple) ou tout simplement de les stocker en texte pur dans cette même table. Une petite requête update en viendra à bout le moment venu.
Merci Dew pour ta réponse. C'est donc +/- bien ce que je pensais...

Quant tu dis "hardcoder les catégories dans un tableau php", tu veux dire traiter la catégorie directement dans mon code, et non plus l'extraire depuis la DB?

Sinon, concernant les saisons, autre exemple décrit plus haut, tu en penses quoi? Je sais qu'il y a plus de saisons que de catégories, et que contrairement à ces dernières, elles évoluent (chaque année = nouvelle saison Smiley smile ). Mais d'un autre côté, il ne s'agit que d'une donnée numérique (2007, 2008,...) qui ne sera jamais mise à jour (2007 restera toujours 2007) et qui est donc simplement codée sur 4 caractères plutôt que 1 seul dans le cas d'une clé étrangère... Alors, est-ce que ça vaut vraiment la peine de normaliser cette donnée?

Merci encore.
Administrateur
Xav1979 a écrit :
Quant tu dis "hardcoder les catégories dans un tableau php", tu veux dire traiter la catégorie directement dans mon code, et non plus l'extraire depuis la DB?


Par exemple oui, si vraiment cela se limite à deux catégories fixes.

Xav1979 a écrit :
Sinon, concernant les saisons, autre exemple décrit plus haut, tu en penses quoi?


Dans ce cas, il est peut-être préférable d'utiliser une clé étrangère en effet.
De toute manière les jointures
- sont assez performantes
- sont lisibles lorsqu'on commence à avoir l'habitude de les utiliser (ex : écrire les requêtes sur plusieurs lignes)