Bonjour!

je suis en train d'essayer de concevoir une base de données qui doit être optimisée pour l'extraction de données. Et là j'ai un petit souci de conception pour lequel j'ai besoin de conseils éclairés (je ne le suis moi-même pas beaucoup)...
Dans ma base, il y aura des mesures effectuées par des chercheurs sur divers paramètres physiques (taux de machin truc, taux de bidule chouette, etc.) sur des sites de mesures. En général, l'utilisation qu'on fait de la base, c'est de lui demander d'afficher des valeurs pour certains paramètres à certaines dates, pour pouvoir comparer différents paramètres mesurés entre eux un même jour par exemple.

Et là voici les deux possibilités que je vois, et entre lesquelles je ne saurais choisir, sachant (je le répète, je sais), que ça doit être optimisé pour l'extraction et pas spécialement pour l'insertion :

1. Soit je crée autant de tables qu'il existe de paramètres :


2. Soit je fais une seule table permettant de stocker toutes les mesures :


Et dans ce cas, lors de l'extraction, je crée autant d'alias de cette table qu'il y a de paramètres demandés.

J'ai pensé que pour la solution 1, l'inconvénient majeur est qu'il y a un trop grand nombre de tables à parcourir, et qu'alourdir la base avec beaucoup de tables n'est peut-être pas top (eh oui, il y a pas mal de paramètres mesurés).

Mais pour la solution 2, l'inconvénient est que dans une même table il va y avoir beaucoup beaucoup de données, et donc le temps de parcours dans une seule table risque d'être assez énorme... surtout que lorsqu'on crée un alias, il va falloir poser une condition qui restreint l'alias, du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
SELECT 
taux_machin.valeur, taux_bidule.valeur 
FROM parametre_mesure taux_machin, parametre_mesure taux_bidule 
WHERE taux_machin.param_id=(SELECT param_id FROM param WHERE param_nom='taux machin') 
AND taux_bidule.param_id=(SELECT param_id FROM param WHERE param_nom='taux bidule')
AND taux_bidule.mesure_date=taux_machin.mesure_date
ou encore, pour éviter les sous-requêtes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
SELECT 
taux_machin.valeur, taux_bidule.valeur 
FROM parametre_mesure taux_machin, parametre_mesure taux_bidule,
param param_machin, param param_bidule
WHERE taux_machin.param_id=param_machin.param_id AND param_machin.param_nom='taux machin'
AND taux_bidule.param_id=param_bidule.param_id AND param_bidule.param_nom='taux bidule'
AND taux_bidule.mesure_date=taux_machin.mesure_date
Voilà, ça fait des grosses requêtes, et quand il y a beaucoup de paramètres je vous raconte pas...
Alors que pour la solution1, le type de requête ressemblera plutôt à :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT taux_machin.valeur, taux_bidule.valeur
FROM taux_machin, taux_bidule
WHERE taux_machin.mesure_date=taux_bidule.mesure_date
Donc simple, rapide et écrire... je pencherais personnellement opur cette solution là (la 1 donc), mais je voudrais être sûre de ne pas faire fausse route... est-ce que l'extraction sera effectivement plus rapide, comme je le pense, car la requête est très simple malgré le très grand nombre de tables qu'il risque d'y avoir dans ma bd ?

Merci beaucoup pour vos conseils

Claire