Що я повинен використовувати? Рядок або 15 цілих полів?


9

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

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

Який краще? Одне рядове поле чи 15 окремих int-полів?


"15 оціночних балів" - так, як багаторазовий вибір одного іспиту чи балів 15 тестів?
rfusca

оцінки 15 тестів
Майк

1
Без додаткової інформації про тип бази даних (традиційний реляційний зв’язок із наявним індексуванням) та вимоги до моделей доступу та використання даних важко сказати, який дизайн ви повинні використовувати та як він буде виконуватись.
Кейд Ру

Відповіді:


27

Якщо ви вже говорите про розділення та обчислення, не зберігайте це як масив.

Незалежно від теорії реляцій та традиційних норм нормалізації та догматики, це просто дизайн, який надає МІНІМАЛЬНУ гнучкість.

Складіть кожен результат іспиту рядком.

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

  • Викинути найвищий і найнижчий результат? Вам доведеться нарізати масив і сортувати його.

  • Усереднення? Вам доведеться нарізати його і скласти

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

  • Сортування для підрахунку (або, наприклад, британські GCSE, де це може бути 7 As та 2B)? Вам доведеться нарізати і сортувати

Зауважте, що вся ця нарізка та сортування виходить дуже дешево в індексованому, нормалізованому дизайні.


4
Просто те, що я збирався сказати, але ви сказали це краще! Збереження багатомісних значень в одному рядку є одним з найгірших можливих варіантів дизайну для будь-якої бази даних.
HLGEM

+1 Відмінне подальше пояснення від мого. Я схильний бути занадто лаконічним лол.
rfusca

12

Що стосується балів, ефективність роботи, явний переможець зберігає його чисельно приблизно так;

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

Його легко запитувати, легко оновлювати та додавати, а також легко і швидко виконувати агрегати. З огляду на вибір "зберігати цю інформацію як рядок, який мені доведеться розділити" або "зберігати у стовпці" ... переможець майже завжди буде "зберігати в стовпці" для більшості випадків використання в RDBMS.


Якщо це завжди однаковий набір з 15 іспитів, цілком може бути, що зберігання їх денормалізованих (15 стовпців) обробляється швидше. Питання, чи ви цілеспрямовано запропонували цілий тип даних?
Едвард Дортленд

Крім того, на кожні 15 іспитів на 1 студента ви зараз зберігаєте 15 разів студентські посвідчення та додаткові тестові ідентифікатори.
Едвард Дортленд

1
скрипка тут - sqlfiddle.com/#!1/f7343/10
rfusca

6
@EdwardDortland завжди буде 15, поки не стане.
звідти

1
@EdwardDortland: Розрахунки чудові. Тепер, чи можете ви зробити їх за потрібними індексами?
ypercubeᵀᴹ

1

якщо ви використовуєте крихітний int (від 0 до 255), використовуючи char (15) або 15 tinyint, такий же (за розміром). Тож тоді з точки зору продуктивності перейдіть на 15 крихітних відтінків, оскільки заощадите на видобутку та обробці струн.

ОНОВЛЕННЯ

якщо позначки двозначні, вам знадобиться CHAR (30), що вдвічі перевищує 15-кратну мініатюру.


9
Враховуючи цю надзвичайно просту конструкцію, якщо на цій планеті є установа, в якій достатньо студентів, які здають 15 іспитів (з оцінками), щоб викликати проблеми з працездатністю в сучасних RDBMS, я заплачу собі спати сьогодні вночі.
Philᵀᴹ

1
Якщо позначки є двозначними? Але крихітний int охоплює бали від 0 до 255, або від -127 до 127, залежно від того, як ви вважаєте за краще вважати. Отже, оскільки бали рідко стають негативними, це дає 250+ балів за один іспит, а більшість іспитів оцінюються за шкалою 0-100%. Я думаю, що tinyint тут абсолютно корисний.
jcolebrand

Так, ми погоджуємось, я просто заявив, що з двозначними позначками, що передаються однозначним знакам, стає ще гірше зберігати його як char. З цього часу вам знадобиться char (30) замість char (15). Хоча двозначна чи ні, 15 крихітних точок завжди будуть лише 15 байтами.
Едвард Дортленд

-1 тому, що ця відповідь рекомендує поля для дизайну рядків, які значно поступаються збереженню кожного результату іспиту в його власному рядку, як це запропоновано іншими повідомленнями
miracle173
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.