2011-02-04 35 views
7

Tôi có một dự án để tạo trang web asp.net mvc để tạo bài kiểm tra. Dưới đây là đặc điểm kỹ thuật:Thiết kế tốt của giản đồ cơ sở dữ liệu cho một công cụ trắc nghiệm trắc nghiệm là gì?

  1. Đối với mỗi người dùng truy cập trang web, cô/anh ấy nhận được một bài kiểm tra.
  2. Mỗi bài kiểm tra có một số vấn đề về trắc nghiệm.
  3. Mỗi vấn đề có chứa một câu hỏi và 5 lựa chọn loại trừ lẫn nhau.

Mô hình đơn giản nhất tôi có thể nghĩ là như sau:

public class Problem 
    { 
     public int ProblemId { get; set; } 
     public string Question { get; set; } 
     public string A { get; set; } 
     public string B { get; set; } 
     public string C { get; set; } 
     public string D { get; set; } 
     public string E { get; set; } 
    } 

Tôi không chắc chắn nó là tốt. Bạn có thể cho tôi đề xuất thiết kế tốt hơn không?

+2

"Tràn ngăn xếp"? trang web đã trở nên quen thuộc và cũng đang đặt câu hỏi? –

+0

Tôi rất ngạc nhiên khi một người nào đó không nhận được tên người dùng đó trước đó. Tôi gần như muốn bỏ phiếu cho anh ta. –

+0

Bạn có thể chọn nhiều hơn một lựa chọn cho mỗi câu trả lời không? –

Trả lời

3

Đơn giản và thiết kế trực quan luôn là tốt nhất và vì chúng thực sự đơn giản, chúng tôi bắt đầu nghi ngờ bản thân ;-). Bạn đang làm tốt ngoại trừ bạn cũng có thể lưu trữ câu trả lời đúng với chính vấn đề đó. Thế thì nó không còn là vấn đề nữa. Vì vậy, bây giờ nó là ProblemAndAnswer hoặc QuizItem.

Vì vậy, đây là tất cả OK để lưu trữ trong một bảng đơn dưới dạng nhiều cột. Nhưng bạn cũng cần hiểu ý nghĩa của nó. Điều này có nghĩa là bạn đang thực hiện một giả định giả định rằng một câu hỏi luôn có 5 lựa chọn. Nếu bạn sẽ có ít hơn 5 sau đó nó là ok như bạn có thể lưu trữ nulls. Nhưng nếu bạn sẽ có nhiều hơn? Đây là khi mô hình bảng đơn bắt đầu tách rời nhau. Bây giờ bạn sẽ bắt đầu nghĩ rằng một câu hỏi thực sự có thể có 1 hoặc nhiều lựa chọn và muốn chia thành các bảng con cha mẹ .... bây giờ bạn đã có quyết định sáng suốt ;-)

+2

Tôi không biết. Giới hạn lược đồ cho đúng năm câu trả lời có vẻ là xấu. Tất nhiên, nó có thể khớp chính xác với yêu cầu (hôm nay), nhưng nếu tính tổng quát hơn một chút không tốn quá nhiều chi phí phức tạp, tôi sẽ làm cho nó linh hoạt hơn ở đó. Giữ cho nó đơn giản như yêu cầu (modulo một chút đầu) cho phép là một nguyên tắc tốt, mặc dù. – Thilo

4

Thuộc tính A đến E? Không cám ơn! Tôi muốn bố trí bàn của tôi như sau:

Quiz (int QuizId, ...) 
Problem (int ProblemId, int QuizId, string Question) 
Answer (int AnswerId, int ProblemId, int Index, string Answer) 

Trường tên nên tự giải thích (Index là chỉ số phân loại cho các câu trả lời của một câu hỏi duy nhất, nếu vấn đề trật tự của họ)

3

Bảng Questioniddescription, là văn bản của câu hỏi ("Mèo là những con chó bí mật?").

Chỉnh sửa: Ngoài ra, bảng Questioncorrect_answer_id, tương ứng với hàng chính xác trong bảng Answer.

Bảng Answerquestion_id, liên kết nó trở lại Question của nó, và một description, đó là nội dung của câu trả lời ("Nó phụ thuộc vào màu sắc của con mèo của bạn.").

Với giản đồ này, các câu hỏi không có số câu trả lời được mã hóa cứng.

+1

Thêm trường trên Câu hỏi để có câu trả lời đúng. Hoặc nó có thể được mã hóa cứng để có câu trả lời đầu tiên luôn đúng, nếu bạn định xáo trộn chúng khi hiển thị chúng (nhưng sau đó không sử dụng câu hỏi trực tiếp trong trường ẩn hoặc người dùng sẽ bắt đầu gian lận). Hoặc một trường một câu trả lời để đánh dấu nó đúng (cho phép mở rộng hệ thống cho các câu hỏi với nhiều câu trả lời đúng). – Thilo

+0

@Thilo Cảm ơn bạn đã nhắc nhở! Một thiếu sót nhỏ ... – ClosureCowboy

1

Tôi đang làm việc trên cùng một loại cấu trúc cơ sở dữ liệu. Nó là tốt hơn để có một bảng lựa chọn để chèn các lựa chọn đối với một id câu hỏi cụ thể. ID bài kiểm tra là một bảng riêng biệt bao gồm các câu hỏi và thời lượng kiểm tra.

Các vấn đề liên quan