ฉันควรใช้อะไร สตริงหรือจำนวนเต็ม 15 ฟิลด์?


9

ฉันกำลังพัฒนาโปรแกรมติดตามนักเรียนที่ฉันต้องเก็บคะแนนการสอบ 15 ข้อ

ฉันสามารถเก็บเครื่องหมายเป็นสตริงและแยกออกเมื่อฉันต้องการเพื่อวัตถุประสงค์เช่นการดำเนินการเกี่ยวกับคณิตศาสตร์ อย่างไรก็ตามฉันต้องการประสิทธิภาพมากที่สุด

ไหนดีกว่ากัน เขตข้อมูลสตริงเดียวหรือ 15 แต่ละเขตข้อมูล int?


"คะแนนสอบ 15 คะแนน" - เช่นเดียวกับหลาย ๆ ทางเลือกของการสอบเดี่ยวหรือคะแนน 15 การทดสอบ?
rfusca

คะแนน 15 การทดสอบ
ไมค์

1
หากไม่มีข้อมูลเพิ่มเติมเกี่ยวกับประเภทของฐานข้อมูล (ความสัมพันธ์แบบดั้งเดิมพร้อมการจัดทำดัชนี?) และข้อกำหนดสำหรับการเข้าถึงข้อมูลและรูปแบบการใช้งานเป็นเรื่องยากที่จะพูดว่าการออกแบบใดที่คุณควรใช้และวิธีการทำงาน
เคดรูส์

คำตอบ:


27

หากคุณกำลังพูดถึงการแยกและการคำนวณอย่าเก็บสิ่งนี้ไว้ในอาร์เรย์

โดยไม่คำนึงถึงทฤษฎีเชิงสัมพันธ์และกฎการทำให้เป็นมาตรฐานแบบดั้งเดิมและความเชื่อมันเป็นเพียงการออกแบบที่ให้ความยืดหยุ่นขั้นต่ำแก่คุณ

ทำให้การสอบแต่ละครั้งเป็นผลลัพธ์

ฉันไม่ได้พยายามคาดหวังทุกอย่าง แต่มีหลายสิ่งหลายอย่างที่มีความละเอียดมากกว่านี้ (และใช่ปกติ) และการออกแบบที่มีราคาแพงกว่าเล็กน้อยเพียงเล็กน้อยก็ช่วยอำนวยความสะดวกให้คุณซึ่งคุณอาจต้องการหรือไม่ต้องการก็ได้ อาจไม่จำเป็นในอนาคต:

  • โยนคะแนนสูงสุดและต่ำสุดออกมาใช่ไหม คุณจะต้องแบ่งอาร์เรย์ของคุณออกและเรียงลำดับ

  • เฉลี่ย? คุณจะต้องเชือดมันและรวมมัน

  • การวิเคราะห์ผลการสอบโดยการสอบข้ามนักเรียน? คุณจะต้องฝานและหมุน

  • เรียงลำดับสำหรับการนับ (หรือ GCSEs อินสแตนซ์ของอังกฤษซึ่งอาจเป็น 7 As และ 2Bs) คุณจะต้องฝานและจัดเรียง

โปรดทราบว่าการแบ่งและการเรียงลำดับทั้งหมดนี้มีราคาถูกมากในการออกแบบที่มีการทำดัชนีและปรับให้เป็นมาตรฐาน


4
สิ่งที่ฉันจะพูด แต่คุณบอกว่าดีกว่า! การจัดเก็บค่า mulitiple ในหนึ่งสตริงเป็นหนึ่งในตัวเลือกการออกแบบที่แย่ที่สุดสำหรับฐานข้อมูลใด ๆ
HLGEM

+1 คำอธิบายเพิ่มเติมที่ยอดเยี่ยมจากฉัน ฉันมีแนวโน้มที่จะรัดกุมเกินไปฮ่า ๆ
rfusca

12

สำหรับคะแนนผลการปฏิบัติงานผู้ชนะที่ชัดเจนจะเก็บมันไว้เป็นตัวเลขเช่นนี้

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

ง่ายต่อการค้นหาอัปเดตและเพิ่มและสุดยอดและรวดเร็วในการรวบรวม ให้ทางเลือกของ "เก็บข้อมูลนี้เป็นสตริงที่ฉันต้องแยก" หรือ "เก็บในคอลัมน์" ... ผู้ชนะมักจะเป็น "เก็บในคอลัมน์" สำหรับกรณีการใช้งานส่วนใหญ่ใน RDBMS


หากเป็นชุดการสอบ 15 ชุดเดียวกันเสมอไปอาจเป็นไปได้ว่าการจัดเก็บพวกเขา denormalized (15 คอลัมน์) นั้นเร็วกว่าในการประมวลผล คำถามคุณตั้งใจเสนอประเภทข้อมูลจำนวนเต็มหรือไม่?
Edward Dortland

นอกจากนี้สำหรับการสอบทุกๆ 15 ครั้งของนักเรียน 1 คนการจัดเก็บ ID นักเรียนและการทดสอบเพิ่มเติมเป็น 15 เท่า
Edward Dortland

1
ซอที่นี่ - sqlfiddle.com/#!1/f7343/10
rfusca

6
@EdwardDortland มันจะเป็น 15 เสมอจนกระทั่งไม่ใช่
จากที่นั่น

1
@EdwardDortland: การคำนวณดี ตอนนี้คุณสามารถทำตามดัชนีที่คุณต้องการได้หรือไม่?
ypercubeᵀᴹ

1

ตราบใดที่คุณใช้ int จิ๋ว (0 ถึง 255) โดยใช้ถ่าน (15) หรือ 15 จิ๋วอินก็เหมือนกัน (ขนาดฉลาด) ถ้าอย่างนั้นจากมุมมองด้านประสิทธิภาพไปที่ 15 จินต์ตั้งแต่คุณบันทึกการสกัดและการจัดการสตริง

UPDATE

หากเครื่องหมายเป็นตัวเลขสองหลักคุณจะต้อง CHAR (30) และนั่นคือสองเท่าของขนาด 15 เท่าของจิ๋ว


9
ด้วยการออกแบบที่เรียบง่ายนี้หากมีสถาบันบนโลกใบนี้ที่มีนักเรียนมากพอที่จะสอบ 15 ครั้ง (มีเครื่องหมาย) เพื่อทำให้เกิดปัญหาด้านประสิทธิภาพใน RDBMS ที่ทันสมัยฉันจะร้องไห้ด้วยตัวเองเพื่อนอนหลับคืนนี้
ฟิลᵀᴹ

1
หากเครื่องหมายเป็นเลขสองหลัก? แต่ int ขนาดเล็กครอบคลุมคะแนนจาก 0 ถึง 255 หรือ -127 ถึง 127 ขึ้นอยู่กับวิธีที่คุณต้องการนับ ดังนั้นเนื่องจากคะแนนไม่ค่อยไปติดลบซึ่งให้คะแนน 250+ สำหรับการสอบหนึ่งครั้งและการสอบส่วนใหญ่จะได้คะแนนในระดับ 0-100% ฉันคิดว่า tinyint มีประโยชน์อย่างยิ่งที่นี่
jcolebrand

ใช่เราเห็นด้วยฉันบอกได้ง่ายๆว่าด้วยเครื่องหมายสองหลักเป็นแบบที่ไม่มีเครื่องหมายเป็นหลักเดียวมันยิ่งแย่กว่าที่จะเก็บไว้ในรูปแบบถ่าน ตั้งแต่นั้นคุณจะต้องใช้ถ่าน (30) แทนที่จะเป็นถ่าน (15) ในขณะที่ตัวเลขสองหลักหรือไม่ ints เล็ก ๆ 15 ค่าจะเป็นเพียง 15 ไบต์เท่านั้น
Edward Dortland

-1 เพราะคำตอบนี้แนะนำฟิลด์ต่อการออกแบบแถวที่ต่ำกว่าการจัดเก็บการสอบแต่ละครั้งส่งผลให้แถวของตัวเองตามที่เสนอโดยโพสต์อื่น ๆ
miracle173
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.