Was soll ich verwenden? Eine Zeichenfolge oder 15 Ganzzahlfelder?

9

Ich entwickle ein Studenten-Tracking-Programm, in dem ich 15 Prüfungsnoten speichern muss.

Ich kann die Markierungen als Zeichenfolge speichern und sie bei Bedarf aufteilen, um beispielsweise arithmetische Operationen durchzuführen. Ich brauche jedoch so viel Leistung wie möglich.

Welches ist besser? Ein einzelnes Zeichenfolgenfeld oder 15 einzelne int-Felder?

Mike
quelle
"15 Prüfungsnoten" - also wie Multiple Choice einer einzelnen Prüfung oder die Punktzahl von 15 Tests?
Rfusca
Ergebnisse von 15 Tests
Mike
1
Ohne weitere Informationen über den Datenbanktyp (traditionell relational mit verfügbarer Indizierung?) Und die Anforderungen für Datenzugriff und Verwendungsmuster ist es schwierig zu sagen, welches Design Sie verwenden sollten und wie es funktionieren wird.
Cade Roux

Antworten:

27

Wenn Sie bereits über Spaltung sprechen und Berechnung, nicht speichern diese als Array.

Unabhängig von der relationalen Theorie und den traditionellen Normalisierungsregeln und Dogmen ist es einfach ein Design, das Ihnen minimale Flexibilität bietet.

Machen Sie jedes Prüfungsergebnis zu einer Reihe.

Ich versuche nicht, alles vorwegzunehmen, aber es gibt eine sehr große Anzahl von Dingen, die dieses detailliertere (und ja normalisierte) und nur etwas platzsparendere Design erleichtert, das Sie jetzt oder möglicherweise nicht benötigen und möglicherweise oder möglicherweise benötigen möglicherweise nicht in der Zukunft benötigen:

  • Höchstes und niedrigstes Ergebnis rauswerfen? Sie müssen Ihr Array in Scheiben schneiden und sortieren.

  • Mittelwertbildung? Sie müssen es in Scheiben schneiden und summieren

  • Analyse des Prüfungsergebnisses durch Prüfung zwischen Studenten? Sie müssen schneiden und schwenken

  • Sortieren zum Zählen (oder Instanz britischer GCSEs, wo es 7 As und 2Bs sein könnte)? Sie müssen schneiden und sortieren

Beachten Sie, dass all dieses Schneiden und Sortieren in einem indizierten, normalisierten Design sehr billig ist.

Cade Roux
quelle
4
Genau das, was ich sagen wollte, aber du hast es besser gesagt! Das Speichern mehrerer Werte in einer Zeichenfolge ist eine der schlechtesten Entwurfsoptionen für jede Datenbank.
HLGEM
+1 Tolle weitere Erklärung von mir. Ich neige dazu, zu prägnant zu sein, lol.
Rfusca
12

In Bezug auf die Leistung speichert der klare Gewinner die Leistung numerisch in etwa so;

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

Es ist einfach abzufragen, einfach zu aktualisieren und hinzuzufügen und super einfach und schnell Aggregate durchzuführen. Angesichts der Wahl zwischen "Diese Informationen als Zeichenfolge speichern, die ich aufteilen muss" oder "In einer Spalte speichern" ... wird der Gewinner für die meisten Anwendungsfälle in einem RDBMS fast immer "In einer Spalte speichern" sein.

rfusca
quelle
Wenn es sich immer um den gleichen Satz von 15 Prüfungen handelt, kann es durchaus sein, dass das Speichern derormalisierten Prüfungen (15 Spalten) schneller zu verarbeiten ist. Eine Frage, haben Sie absichtlich einen ganzzahligen Datentyp vorgeschlagen?
Edward Dortland
Zusätzlich speichern Sie für jeweils 15 Prüfungen von 1 Schüler 15-mal einen Studentenausweis und einen zusätzlichen Testausweis.
Edward Dortland
1
Geige hier - sqlfiddle.com/#!1/f7343/10
rfusca
6
@ EdwardDortland es wird immer 15 sein, bis es nicht ist.
dort
1
@ EdwardDortland: Die Berechnungen sind in Ordnung. Können Sie sie jetzt für die Indizes ausführen, die Sie möglicherweise benötigen?
Ypercubeᵀᴹ
1

Solange Sie tiny int (0 bis 255) mit einem char (15) oder 15 tinyint verwenden, ist dies dasselbe (in Bezug auf die Größe). Aus Sicht der Leistung sollten Sie sich also für die 15 winzigen Punkte entscheiden, da Sie beim Extrahieren und beim Umgang mit Zeichenfolgen sparen.

AKTUALISIEREN

Wenn die Markierungen zweistellig sind, benötigen Sie CHAR (30) und das ist doppelt so groß wie das 15-fache eines winzigen Wertes.

Edward Dortland
quelle
9
Angesichts dieses extrem einfachen Designs werde ich mich heute Abend in den Schlaf weinen, wenn es auf diesem Planeten eine Institution gibt, in der genügend Studenten 15 Prüfungen (mit Noten) ablegen, um Leistungsprobleme in einem modernen RDBMS zu verursachen.
Philᵀᴹ
1
Wenn die Markierungen zweistellig sind? Aber winzige int deckt Werte von 0 bis 255 oder -127 bis 127 ab, je nachdem, wie Sie zählen möchten. Da die Ergebnisse selten negativ sind, ergibt dies mehr als 250 Punkte für eine Prüfung, und die meisten Prüfungen werden auf einer Skala von 0 bis 100% bewertet. Ich denke, tinyint ist hier absolut nützlich.
Jcolebrand
Ja, wir sind uns einig, ich habe einfach gesagt, dass es mit zweistelligen Markierungen im Gegensatz zu einstelligen Markierungen noch schlimmer wird, sie als Zeichen zu speichern. Seitdem würden Sie char (30) anstelle von char (15) benötigen. Ob zweistellig oder nicht, 15 winzige Ints sind immer nur 15 Bytes.
Edward Dortland
-1, weil diese Antwort empfiehlt, dass die Felder pro Zeilendesign, die der Speicherung jeder Prüfung weit unterlegen sind, zu einer eigenen Zeile führen, wie von den anderen Beiträgen vorgeschlagen
miracle173