Apa yang harus saya gunakan? String atau 15 bidang bilangan bulat?

9

Saya sedang mengembangkan program pelacakan siswa di mana saya harus menyimpan 15 nilai ujian.

Saya dapat menyimpan tanda sebagai string dan membaginya ketika saya perlu, untuk tujuan seperti melakukan operasi aritmatika. Namun, saya membutuhkan kinerja sebanyak mungkin.

Mana yang lebih baik? Bidang string tunggal, atau 15 bidang int individual?

mikrofon
sumber
"15 nilai ujian" - jadi seperti beberapa pilihan ujian tunggal atau skor 15 ujian?
rfusca
skor 15 tes
mike
1
Tanpa informasi lebih lanjut tentang jenis database (hubungan tradisional dengan pengindeksan tersedia?) Dan persyaratan untuk akses data dan pola penggunaan, sulit untuk mengatakan desain apa yang harus Anda gunakan dan bagaimana kinerjanya.
Cade Roux

Jawaban:

27

Jika Anda sudah berbicara tentang pemisahan dan komputasi, jangan simpan ini sebagai array.

Terlepas dari teori relasional dan aturan normalisasi tradisional dan dogma, itu hanya desain yang memberi Anda MINIMAL fleksibilitas.

Buat setiap hasil ujian berturut-turut.

Saya tidak mencoba mengantisipasi semuanya, tetapi ada sejumlah besar hal-hal yang lebih terperinci ini (dan, ya, dinormalisasi) dan hanya sedikit lebih banyak ruang yang memfasilitasi desain mahal yang mungkin atau mungkin tidak Anda perlukan sekarang dan mungkin atau mungkin tidak perlu di masa depan:

  • Membuang hasil tertinggi dan terendah? Anda harus mengiris array dan mengurutkannya.

  • Rata-rata? Anda harus mengirisnya dan menjumlahkannya

  • Analisis hasil ujian dengan ujian lintas siswa? Anda harus mengiris dan memutar

  • Menyortir untuk penghitungan (atau misalnya GCSE Inggris, di mana mungkin 7 As dan 2Bs)? Anda harus mengiris dan menyortir

Perhatikan bahwa semua pengirisan dan penyortiran ini datang sangat murah dalam desain yang diindeks dan dinormalisasi.

Cade Roux
sumber
4
Hanya apa yang akan saya katakan tetapi Anda mengatakannya lebih baik! Menyimpan nilai mulitiple dalam satu string adalah salah satu pilihan desain yang paling buruk untuk database apa pun.
HLGEM
+1 Penjelasan lebih lanjut dari saya. Saya cenderung terlalu ringkas lol.
rfusca
12

Untuk skor, berdasarkan kinerja, pemenang yang jelas menyimpannya secara numerik seperti ini;

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

Mudah untuk ditanyakan, mudah untuk diperbarui dan ditambahkan, dan super mudah dan cepat untuk melakukan agregat. Diberi pilihan "simpan informasi ini sebagai string yang harus saya bagi" atau "simpan dalam kolom" ... pemenangnya hampir selalu akan "disimpan dalam kolom" untuk sebagian besar kasus penggunaan di RDBMS.

rfusca
sumber
Jika selalu set 15 ujian yang sama, bisa jadi menyimpannya didenormalkan (15 kolom) lebih cepat untuk diproses. Sebuah pertanyaan, apakah Anda sengaja mengusulkan tipe data integer?
Edward Dortland
Selain itu, untuk setiap 15 ujian dari 1 siswa Anda sekarang menyimpan 15 kali ID siswa dan ekstra ID tes.
Edward Dortland
1
bermain biola di sini - sqlfiddle.com/#!1/f7343/10
rfusca
6
@EdwardDortland akan selalu 15 sampai tidak.
dari sana
1
@EdwardDortland: Perhitungannya baik-baik saja. Sekarang, dapatkah Anda melakukannya untuk indeks yang mungkin Anda butuhkan?
ypercubeᵀᴹ
1

selama Anda menggunakan int kecil (0 hingga 255) menggunakan char (15) atau 15 tinyint adalah sama (ukuran bijaksana). Jadi dari perspektif kinerja, gunakan 15 tinyints karena Anda menghemat ekstraksi dan penanganan string.

MEMPERBARUI

jika tanda adalah dua digit, Anda perlu CHAR (30) dan itu dua kali ukuran 15 kali tinyint.

Edward Dortland
sumber
9
Dengan desain yang sangat sederhana ini, jika ada lembaga di planet ini yang memiliki cukup banyak siswa yang duduk 15 ujian (dengan nilai) untuk menyebabkan masalah kinerja dalam RDBMS modern, saya akan menangis sampai tertidur malam ini.
Philᵀᴹ
1
Jika tanda adalah dua digit? Tapi int kecil mencakup skor dari 0 hingga 255, atau -127 hingga 127 tergantung pada bagaimana Anda lebih suka menghitung. Jadi, karena skor jarang negatif, itu memberi 250+ poin untuk satu ujian, dan sebagian besar ujian diberi skor pada skala 0-100%. Saya pikir tinyint sangat berguna di sini.
jcolebrand
Ya kami setuju, saya sederhana menyatakan bahwa dengan tanda dua digit sama dengan satu digit, menjadi lebih buruk untuk menyimpannya sebagai char. Sejak itu Anda akan membutuhkan char (30), bukan char (15). Sementara dua digit atau tidak, 15 int kecil akan selalu hanya 15 byte.
Edward Dortland
-1 karena jawaban ini merekomendasikan bidang per baris desain yang jauh lebih rendah daripada menyimpan setiap hasil ujian di barisnya sendiri seperti yang diusulkan oleh posting lain
miracle173