Tôi nên dùng gì? Một chuỗi hoặc 15 trường số nguyên?


9

Tôi đang phát triển một chương trình theo dõi học sinh, nơi tôi cần lưu trữ 15 điểm thi.

Tôi có thể lưu trữ các nhãn hiệu dưới dạng một chuỗi và tách chúng ra khi tôi cần, cho các mục đích như thực hiện các hoạt động đối xứng. Tuy nhiên, tôi cần càng nhiều hiệu suất càng tốt.

Cái nào tốt hơn? Một trường chuỗi đơn, hoặc 15 trường int riêng lẻ?


"15 điểm thi" - giống như nhiều lựa chọn của một bài kiểm tra hoặc điểm của 15 bài kiểm tra?
rfusca

điểm số của 15 bài kiểm tra
mike

1
Nếu không có thêm thông tin về loại cơ sở dữ liệu (quan hệ truyền thống với lập chỉ mục có sẵn?) Và các yêu cầu đối với các mẫu truy cập và sử dụng dữ liệu, rất khó để nói bạn nên sử dụng thiết kế nào và cách thức thực hiện.
Cade Roux

Câu trả lời:


27

Nếu bạn đã nói về việc chia tách và tính toán, đừng lưu trữ nó dưới dạng một mảng.

Bất kể lý thuyết quan hệ và các quy tắc chuẩn hóa truyền thống và giáo điều, nó chỉ đơn giản là một thiết kế mang lại cho bạn sự linh hoạt TỐI THIỂU.

Làm cho mỗi kết quả thi một hàng.

Tôi không cố gắng để dự đoán tất cả mọi thứ, nhưng có một số lượng rất lớn những thứ mà chi tiết hơn này (và, vâng, bình thường hóa) và chỉ có thiết kế đắt tiền hơn một chút tạo điều kiện cho bạn có thể hoặc không cần bây giờ và có thể hoặc có thể không cần trong tương lai:

  • Ném ra kết quả cao nhất và thấp nhất? Bạn sẽ phải cắt mảng của bạn và sắp xếp nó.

  • Tính trung bình? Bạn sẽ phải cắt nó ra và tổng cộng nó

  • Phân tích kết quả thi bằng kỳ thi giữa các học sinh? Bạn sẽ phải cắt và xoay

  • Sắp xếp để đếm (hoặc ví dụ các GCSE của Anh, trong đó có thể là 7 As và 2B)? Bạn sẽ phải cắt và sắp xếp

Lưu ý rằng tất cả các lát cắt và sắp xếp này đến rất rẻ trong một thiết kế được lập chỉ mục, chuẩn hóa.


4
Chỉ là những gì tôi sẽ nói nhưng bạn nói nó tốt hơn! Lưu trữ các giá trị mulitipl trong một chuỗi là một trong những lựa chọn thiết kế tồi tệ nhất có thể cho bất kỳ cơ sở dữ liệu nào.
HLGEM

+1 Giải thích thêm từ tôi. Tôi có xu hướng quá súc tích lol.
rfusca

12

Đối với điểm số, hiệu suất khôn ngoan, người chiến thắng rõ ràng đang lưu trữ số lượng như thế này;

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

Nó dễ truy vấn, dễ cập nhật và thêm vào, và siêu dễ dàng và nhanh chóng để thực hiện tổng hợp trên. Đưa ra lựa chọn "lưu trữ thông tin này dưới dạng một chuỗi mà tôi phải tách ra" hoặc "lưu trữ trong một cột" ... người chiến thắng hầu như luôn luôn là "lưu trữ trong một cột" cho hầu hết các trường hợp sử dụng trong RDBMS.


Nếu nó luôn luôn là cùng một bộ 15 bài kiểm tra, thì việc lưu trữ chúng không chuẩn hóa (15 cột) sẽ nhanh hơn để xử lý. Một câu hỏi, bạn đã cố tình đề xuất một kiểu dữ liệu số nguyên?
Edward tổng hợp

Ngoài ra, cứ 15 bài kiểm tra của 1 học sinh, bạn hiện lưu trữ 15 lần ID sinh viên và thêm ID bài kiểm tra.
Edward tổng hợp

1
fiddle ở đây - sqlfiddle.com/#!1/f7343/10
rfusca

6
@EdwardDortland nó sẽ luôn là 15 cho đến khi không.
từ đó đến

1
@EdwardDortland: Các tính toán đều ổn. Bây giờ, bạn có thể làm chúng cho các chỉ số bạn có thể cần?
ypercubeᵀᴹ

1

miễn là bạn sử dụng tiny int (0 đến 255) bằng char (15) hoặc 15 tinyint là như nhau (kích thước khôn ngoan). Vì vậy, từ góc độ hiệu suất, hãy tìm 15 gợi ý nhỏ kể từ khi bạn lưu vào phần trích xuất và xử lý chuỗi.

CẬP NHẬT

nếu các dấu là hai chữ số, bạn sẽ cần CHAR (30) và đó là gấp đôi kích thước của 15 lần một chút.


9
Với thiết kế cực kỳ đơn giản này, nếu có một tổ chức trên hành tinh này có đủ học sinh ngồi 15 bài kiểm tra (có điểm) để gây ra các vấn đề về hiệu suất trong RDBMS hiện đại, tôi sẽ khóc khi ngủ tối nay.
Philᵀᴹ

1
Nếu các dấu là hai chữ số? Nhưng int int nhỏ bao gồm điểm từ 0 đến 255, hoặc -127 đến 127 tùy thuộc vào cách bạn muốn đếm. Vì vậy, vì điểm số hiếm khi bị âm, điều đó mang lại hơn 250 điểm cho một bài kiểm tra và hầu hết các bài kiểm tra được tính theo thang điểm 0-100%. Tôi nghĩ tinyint hoàn toàn hữu ích ở đây.
jcolebrand

Vâng, chúng tôi đồng ý, tôi đã đơn giản tuyên bố rằng với các dấu hai chữ số bị mờ thành dấu một chữ số, việc lưu trữ nó dưới dạng char càng trở nên tồi tệ hơn. Kể từ đó, bạn sẽ cần char (30) thay vì char (15). Mặc dù có hai chữ số hoặc không, 15 số nguyên nhỏ sẽ luôn chỉ là 15 byte.
Edward tổng hợp

-1 bởi vì câu trả lời này đề xuất các trường trên thiết kế hàng kém hơn nhiều so với việc lưu trữ từng kết quả bài kiểm tra trong hàng riêng của nó như được đề xuất bởi các bài đăng khác
miracle173
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.