Que dois-je utiliser? Une chaîne ou 15 champs entiers?

9

Je développe un programme de suivi des étudiants où j'ai besoin de stocker 15 notes d'examen.

Je peux stocker les marques sous forme de chaîne et les diviser lorsque j'en ai besoin, à des fins telles que l'exécution d'opérations arithmétiques. Cependant, j'ai besoin d'autant de performances que possible.

Ce qui est mieux? Un champ de chaîne unique ou 15 champs int individuels?

Mike
la source
"15 notes d'examen" - comme un choix multiple d'un seul examen ou les résultats de 15 tests?
rfusca
scores de 15 tests
mike
1
Sans plus d'informations sur le type de base de données (relationnel traditionnel avec indexation disponible?) Et les exigences d'accès aux données et les modèles d'utilisation, il est difficile de dire quelle conception vous devez utiliser et comment elle fonctionnera.
Cade Roux

Réponses:

27

Si vous parlez déjà de fractionnement et de calcul, ne le stockez pas sous forme de tableau.

Indépendamment de la théorie relationnelle et des règles et dogmes de normalisation traditionnels, c'est simplement une conception qui vous donne une flexibilité MINIMALE.

Faites chaque résultat d'examen une rangée.

Je n'essaie pas de tout prévoir, mais il y a un très grand nombre de choses que cette conception plus granulaire (et, oui, normalisée) et seulement un peu plus coûteuse en espace facilite dont vous pourriez ou non avoir besoin maintenant et peut ou peut-être pas besoin à l'avenir:

  • Jetant le résultat le plus élevé et le plus bas? Vous devrez découper votre tableau et le trier.

  • Moyennage? Vous devrez le découper et le totaliser

  • Analyse du résultat de l'examen par examen parmi les étudiants? Vous devrez couper et pivoter

  • Tri pour le comptage (ou par exemple GCSE britannique, où il pourrait être 7 As et 2B)? Vous devrez trancher et trier

Notez que tout ce découpage et ce tri sont très bon marché dans une conception indexée et normalisée.

Cade Roux
la source
4
Juste ce que j'allais dire mais tu l'as mieux dit! Le stockage de plusieurs valeurs dans une chaîne est l'un des pires choix de conception possibles pour n'importe quelle base de données.
HLGEM
+1 Grande explication supplémentaire de la mienne. J'ai tendance à être trop concis lol.
rfusca
12

Pour les scores, en termes de performances, le gagnant clair le stocke numériquement quelque chose comme ça;

create table test_scores
(
  student_id int,
  test_id int,
  score int
);

Son facile à interroger, facile à mettre à jour et à ajouter, et super facile et rapide pour effectuer des agrégats. Étant donné le choix de "stocker ces informations sous forme de chaîne que je dois diviser" ou "stocker dans une colonne" ... le gagnant va presque toujours être "stocker dans une colonne" pour la plupart des cas d'utilisation dans un SGBDR.

rfusca
la source
S'il s'agit toujours du même ensemble de 15 examens, il se pourrait bien que leur stockage dénormalisé (15 colonnes) soit plus rapide à traiter. Une question, avez-vous volontairement proposé un type de données entier?
Edward Dortland
De plus, pour 15 examens d'un étudiant, vous stockez maintenant 15 fois une carte d'étudiant et une carte de test supplémentaire.
Edward Dortland
1
violon ici - sqlfiddle.com/#!1/f7343/10
rfusca
6
@EdwardDortland ce sera toujours 15 jusqu'à ce qu'il ne soit pas.
1
@EdwardDortland: Les calculs sont corrects. Maintenant, pouvez-vous les faire pour les indices dont vous pourriez avoir besoin?
ypercubeᵀᴹ
1

tant que vous utilisez tiny int (0 à 255) en utilisant un char (15) ou 15 tinyint est le même (en termes de taille). Donc, du point de vue des performances, optez pour les 15 minuscules puisque vous économisez sur l'extraction et la gestion des chaînes.

MISE À JOUR

si les marques sont à deux chiffres, vous aurez besoin de CHAR (30) et cela fait deux fois la taille de 15 fois un minuscule.

Edward Dortland
la source
9
Compte tenu de cette conception extrêmement simple, s'il y a une institution sur cette planète qui a suffisamment d'étudiants qui passent 15 examens (avec des notes) pour causer des problèmes de performance dans un SGBDR moderne, je vais pleurer pour dormir ce soir.
Philᵀᴹ
1
Si les marques sont à deux chiffres? Mais les minuscules int couvrent les scores de 0 à 255, ou -127 à 127 selon la façon dont vous préférez compter. Ainsi, puisque les scores deviennent rarement négatifs, cela donne plus de 250 points pour un examen, et la plupart des examens sont notés sur une échelle de 0 à 100%. Je pense que tinyint est absolument utile ici.
jcolebrand
Oui, nous sommes d'accord, j'étais simple en déclarant qu'avec des marques à deux chiffres comme opposées à des marques à un chiffre, il devient encore pire de le stocker en tant que caractère. Depuis lors, vous auriez besoin de char (30) au lieu de char (15). À deux chiffres ou pas, 15 minuscules seront toujours à seulement 15 octets.
Edward Dortland
-1 car cette réponse recommande des champs par conception de ligne qui sont bien inférieurs au stockage de chaque résultat d'examen dans sa propre ligne comme proposé par les autres articles
miracle173