Что я должен использовать? Строка или 15 целочисленных полей?

9

Я занимаюсь разработкой программы слежения за студентами, в которой мне нужно хранить 15 экзаменационных оценок.

Я могу хранить метки в виде строки и разделять их, когда мне это нужно, для таких целей, как выполнение арифметических операций. Тем не менее, мне нужно как можно больше производительности.

Что лучше? Одно строковое поле или 15 отдельных полей int?

Майк
источник
«15 экзаменационных баллов» - это как множественный выбор одного экзамена или 15 тестов?
rfusca
результаты 15 тестов
майк
1
Без дополнительной информации о типе базы данных (традиционная реляционная с доступной индексацией?) И требованиях к доступу к данным и шаблонам использования трудно сказать, какой дизайн следует использовать и как он будет работать.
Cade Roux

Ответы:

27

Если вы уже говорите о разбиении и вычислении, не храните это как массив.

Независимо от теории отношений и традиционных правил нормализации и догм, это просто дизайн, который дает вам МИНИМАЛЬНУЮ гибкость.

Сделайте каждый результат экзамена подряд.

Я не пытаюсь предвидеть все, но есть очень большое количество вещей, которые облегчает этот более гранулированный (и, да, нормализованный) и только немного более дорогостоящий дизайн, который вам может понадобиться, а может и не понадобиться сейчас, а может и может не понадобиться в будущем:

  • Выбрасывая самый высокий и самый низкий результат? Вам придется разрезать массив и отсортировать его.

  • Усреднение? Вам придется нарезать его и подвести итог

  • Анализ результатов экзамена по экзамену среди студентов? Вам придется нарезать и поворачивать

  • Сортировка для подсчета (или, например, британские GCSE, где это может быть 7 As и 2B)? Вам придется нарезать и сортировать

Обратите внимание, что все эти нарезки и сортировки очень дешевы в индексированном, нормализованном дизайне.

Кейд Ру
источник
4
Только то, что я собирался сказать, но ты сказал это лучше! Хранение нескольких значений в одной строке - один из худших вариантов дизайна для любой базы данных.
HLGEM
+1 Большое дальнейшее объяснение от моего. Я склонен быть слишком лаконичным, смеется.
rfusca
12

Что касается результатов, то с точки зрения производительности явный победитель хранит их в числовом виде примерно так;

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

Его легко запрашивать, легко обновлять и добавлять, и супер легко и быстро выполнять агрегаты. Учитывая выбор «хранить эту информацию как строку, которую я должен разделить» или «хранить в столбце» ... победителем почти всегда будет «хранить в столбце» для большинства случаев использования в СУБД.

rfusca
источник
Если это всегда один и тот же набор из 15 экзаменов, вполне возможно, что их денормализованное хранение (15 столбцов) быстрее обрабатывается. Вопрос, вы специально предлагали целочисленный тип данных?
Эдвард Дортланд
Кроме того, на каждые 15 экзаменов 1 студента вы теперь сохраняете 15 раз идентификационный номер студента и дополнительный идентификационный номер теста.
Эдвард Дортланд
1
скрипка здесь - sqlfiddle.com/#!1/f7343/10
rfusca
6
@ EdwardDortland это всегда будет 15, пока это не так.
оттуда
1
@EdwardDortland: расчеты в порядке. Теперь вы можете сделать их для индексов, которые вам могут понадобиться?
ypercubeᵀᴹ
1

до тех пор, пока вы используете tiny int (от 0 до 255) с использованием char (15) или 15 tinyint одинаково (по размеру). Итак, с точки зрения производительности, перейдите на 15 крошечных, поскольку вы экономите на извлечении и обработке строк.

ОБНОВИТЬ

если метки являются двузначными, вам понадобится CHAR (30), и это будет в два раза больше, чем в 15 раз.

Эдвард Дортланд
источник
9
Учитывая эту чрезвычайно простую конструкцию, если на этой планете есть учебное заведение, в котором достаточно студентов, сдающих 15 экзаменов (с оценками), чтобы вызвать проблемы с производительностью в современной СУБД, я сегодня ночью заплачу.
Philᵀᴹ
1
Если знаки являются двузначными? Но крошечное int охватывает значения от 0 до 255 или от -127 до 127 в зависимости от того, как вы предпочитаете считать. Таким образом, поскольку баллы редко бывают отрицательными, это дает 250+ баллов за один экзамен, и большинство экзаменов оцениваются по шкале 0-100%. Я думаю, что tinyint здесь абсолютно полезен.
Jcolebrand
Да, мы согласны, я просто сказал, что с двузначными метками вместо однозначных становится еще хуже хранить его как символ. С тех пор вам понадобится char (30) вместо char (15). В то время как двузначный или нет, 15 крошечных целых всегда будет всего 15 байтов.
Эдвард Дортланд,
-1 потому что в этом ответе рекомендуются поля для каждого ряда строк, которые значительно уступают сохранению результатов каждого экзамена в отдельной строке, как это было предложено в других публикациях
чудо173