Ne kullanmalıyım? Bir dize mi, 15 tamsayı alanı mı?


9

15 sınav notunu saklamam gereken bir öğrenci takip programı geliştiriyorum.

İşaretleri dize olarak saklayabilir ve gerektiğinde aritmetik işlemler yapmak gibi amaçlar için bölebilirim. Ancak, mümkün olduğunca fazla performansa ihtiyacım var.

Hangisi daha iyi? Tek bir dize alanı mı, yoksa 15 ayrı int alanı mı?


"15 sınav notları" - bu yüzden tek bir sınav çoktan seçmeli ya da 15 test puanları gibi?
rfusca

15 test puanları
mike

1
Veritabanı türü (geleneksel indeksleme ile ilişkisel?) Ve veri erişimi ve kullanım kalıpları için gereksinimler hakkında daha fazla bilgi olmadan, hangi tasarımı kullanmanız gerektiğini ve nasıl çalışacağını söylemek zordur.
Cade Roux

Yanıtlar:


27

Zaten bölme ve bilgi işlemden bahsediyorsanız, bunu bir dizi olarak saklamayın.

İlişkisel teori ve geleneksel normalleştirme kuralları ve dogma ne olursa olsun, size MINIMAL esneklik sağlayan bir tasarımdır.

Her sınav sonucunu bir satır yapın.

Ben her şeyi tahmin etmeye çalışmıyorum, ama bu daha ayrıntılı (ve, evet, normalize) ve sadece biraz daha fazla alan pahalı tasarım, şimdi ve ihtiyaç duyabileceğiniz veya gerekmeyebileceği çok fazla şey var veya gelecekte gerekmeyebilir:

  • En yüksek ve en düşük sonucu atmak mı istiyorsunuz? Dizinizi kesip sıralamanız gerekir.

  • Ortalama alma? Kesmeniz ve toplamanız gerekecek

  • Sınav sonucunun öğrenciler arasında sınavla analizi? Dilim ve pivot yapmanız gerekecek

  • Sayım için sıralama (veya 7 As ve 2B olabileceği İngiliz GCSE'leri)? Dilimlemek ve sıralamak zorunda kalacaksınız

Tüm bu dilimleme ve sıralama işlemlerinin dizine alınmış, normalleştirilmiş bir tasarımda çok ucuz olduğunu unutmayın.


4
Ne diyecektim ama sen daha iyisini söyledin! Birden çok değeri bir dizede saklamak, herhangi bir veritabanı için mümkün olan en kötü tasarım seçeneklerinden biridir.
HLGEM

+1 Benimkinden daha fazla açıklama. Ben çok özlü lol eğilimindedir .
rfusca

12

Performans açısından, net kazanan, sayısal olarak şöyle bir şey saklıyor;

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

Kolay sorgulama, güncelleme ve ekleme kolaylığı ve süper kolay ve hızlı bir araya toplamak. "Bu bilgiyi ayırmak zorunda olduğum bir dize olarak sakla" veya "bir sütunda sakla" seçeneği göz önüne alındığında, kazanan hemen hemen her zaman bir RDBMS'deki çoğu kullanım durumu için "bir sütunda sakla" olacaktır.


Her zaman aynı 15 sınav setiyse, onları denormalize (15 sütun) saklamanın işlenmesi daha hızlı olabilir. Bir soru, bilerek bir tamsayı veri türü önerdiniz mi?
Edward Dortland

Ayrıca, 1 öğrencinin her 15 sınavı için, artık bir öğrenci kimliği ve bir test kimliği ekstra 15 kat saklayabilirsiniz.
Edward Dortland


6
@EdwardDortland olmadıkça her zaman 15 yaşında olacak.
buradan

1
@EdwardDortland: Hesaplamalar gayet iyi. Şimdi, ihtiyacınız olabilecek endeksler için bunları yapabilir misiniz?
ypercubeᵀᴹ

1

minik int (0 - 255) kullandığınız sürece bir char (15) veya 15 tinyint kullanmak aynıdır (boyut olarak). Performans perspektifinden bakıldığında, ayıklama ve dizi işleminden tasarruf ettiğiniz için 15 küçük noktaya gidin.

GÜNCELLEME

işaretler çift basamaklıysa, CHAR'a (30) ihtiyacınız olacaktır ve bu, minik bir boyutun 15 katı büyüklüğündedir.


9
Bu son derece basit tasarım göz önüne alındığında, bu gezegende modern bir RDBMS'de performans sorunlarına neden olmak için 15 sınav (işaretli) oturan yeterli öğrenci bulunan bir kurum varsa, bu gece uyumak için kendimi ağlayacağım.
Philᵀᴹ

1
İşaretler çift haneli ise? Ancak küçük int, nasıl saymayı tercih ettiğinize bağlı olarak 0 ila 255 veya -127 ila 127 puanlarını kapsar. Bu yüzden puanlar nadiren negatif olduğu için, bu bir sınav için 250+ puan verir ve çoğu sınav% 0-100 arasında puanlanır. Bence tinyint burada kesinlikle faydalı.
jcolebrand

Evet, kabul ediyoruz, tek basamaklı işaretlere açık çift haneli işaretlerle char olarak saklamanın daha da kötü hale geldiğini belirtmek basitti. O zamandan beri char (15) yerine char (30) gerekir. Çift haneli ya da olmasa da, 15 küçük bayt her zaman sadece 15 bayt olacaktır.
Edward Dortland

-1 çünkü bu cevap, her
yazı sonucunun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.