2012-02-24 29 views
5

Tôi biết có một số bài đăng có liên quan nhưng tôi không hiểu rõ phải làm gì.Thiết kế dữ liệu cho câu hỏi và câu trả lời trong đó một số câu trả lời là văn bản và một số là nhiều lựa chọn

Tôi có ý tưởng chung về cách thực hiện việc này. Tôi không quá xa vào thiết kế cơ sở dữ liệu không may nên tôi cần sự giúp đỡ.

Đặt bảng với questions_id, có bảng cho possible_answer_id cho mỗi câu hỏi_id.

Sau đó có bảng câu hỏi liên kết với user_id, question_id, answer_id, dấu thời gian để đăng ký biểu mẫu đã gửi.

Nhưng vấn đề của tôi là một số câu hỏi được trả lời chỉ bằng một chuỗi nên tôi gặp khó khăn khi khái niệm phải làm gì với nó.

 
e,g 
for some I need: question_id string_answer (any answer is allowed) 
for others:  question_id answer_id  (out of set of allowed answers) 
and perhaps:  question_id bool_answer (true/false) 

Tôi có thêm question_type vào đâu đó để tôi có hai bảng khác nhau không?

Nếu câu hỏi không rõ ràng, vui lòng cho tôi biết.

+3

Đó thực sự là một vấn đề thiết kế hơi phức tạp. Không phải là một câu hỏi của N00B. – JohnFx

Trả lời

4

Được chỉnh sửa để xem xét các câu hỏi của Eugene.

Dưới đây là các bảng mà hệ thống của bạn sẽ cần và giải thích từng bảng.

1. Người

Bảng này sẽ chứa tất cả các thông tin về người tham gia một thử nghiệm. Chìa khóa cho bảng là một id người, là một số nguyên tự động tăng cho mỗi hàng người được thêm vào bảng. Hầu hết các cơ sở dữ liệu hiện tại có một số nguyên nhận dạng hoặc số nguyên tăng dần tự động, thường là khóa chính của bảng.

2. Câu hỏi

Bảng này chứa tất cả các câu hỏi mà bạn đã từng nghĩ đến việc yêu cầu.

Bảng câu hỏi sẽ chứa một cờ (số nguyên hoặc ký tự) sẽ cho biết loại câu hỏi, như bạn đã phác thảo.

  • Bất kỳ chuỗi câu trả lời
  • Set các câu trả lời được phân bổ
  • Đúng/sai

3. trả lời

Bảng này chứa các bộ câu trả lời cho các câu hỏi trong câu hỏi bảng yêu cầu một bộ câu trả lời được phân bổ. Khóa nhóm cho tập hợp các câu trả lời là khóa chính của câu hỏi.

Có lập trình, bạn sẽ chọn một hàng từ bảng câu hỏi. Chỉ khi cờ được đặt các câu trả lời được phân bổ thì bạn sẽ duyệt bảng câu trả lời trong một truy vấn SQL riêng biệt.

4. Kiểm tra

Bảng này chứa ngày và thời gian thử nghiệm đã được tạo ra.

5. Kiểm tra Câu hỏi

Bảng này chứa các câu hỏi được chọn từ bảng câu hỏi cho một bài kiểm tra cụ thể. Khóa nhóm cho tập các câu hỏi kiểm tra là id bảng Kiểm tra.

Lý do có bảng Câu hỏi kiểm tra là các câu hỏi và câu trả lời có thể được thêm, thay đổi hoặc xóa khỏi bảng Câu hỏi và trả lời. Bảng Câu hỏi kiểm tra là một bảng lịch sử trong đó một khi các hàng được thêm vào, chúng không bao giờ bị thay đổi hoặc bị loại bỏ.

6. Kiểm tra Taken

Bảng này chứa id Nhân vật của người đó đã kiểm tra, id thử nghiệm của Test, và ngày và thời gian thử nghiệm đã được thực hiện.

7. Kiểm tra trả lời

Bảng này chứa câu trả lời cho các bài kiểm tra. Khóa nhóm cho tập hợp các câu trả lời kiểm tra là id Test Taken và id Câu hỏi kiểm tra.

+0

Chỉ cần rõ ràng, tôi sẽ có ba bảng user_question_answer_timestamp riêng biệt cho từng loại? Làm thế nào sau đó tôi sẽ đi đến bảng đúng dựa trên loại? – Eugene

+0

Có cách nào để có một bảng liên kết question_type với một correct_table không? Có những thứ như id bảng? Tôi hơi bối rối:) Xin lỗi vì sự cố, tôi sẽ đánh giá cao sự giúp đỡ của bạn. – Eugene

+0

@Eugene: Bạn chỉ cần một bảng nếu bạn đang lưu trữ một cái gì đó ở đó. Câu trả lời duy nhất cần thêm dữ liệu là tập hợp các câu trả lời được phân bổ. Bạn sẽ phải có nhiều bảng hơn để lưu trữ các bài kiểm tra được đưa ra và câu trả lời kiểm tra do người dùng cung cấp. Có, bạn có thể có một bảng liên kết tập hợp các câu trả lời được phân bổ gắn cờ với tên bảng nếu bạn muốn. –

2

Hãy thử ba bảng này.

QUESTION_MASTER 

QuestionID int (Primary) 
QuestionName varchar(150) 
QuestionType tinyint 
CorrectAns1 bit   -- for true/false 
CorrectAns2 varchar(500) -- for string answer 
CorrectAns3 int   -- for multiple choice 

ANSWER_MASTER 

AnswerID  int (Primary) 
QuestionID int (Foreign) 
CorrectAns bit 

EXAM_MASTER 

ExamID  int(Primary) 
QuestionID int(Foreign) 
CreatedBy  int(Foreign) --UserID 

Sử dụng điều này cho cả ba loại câu hỏi của bạn, nghĩa là chọn nhiều, điền vào các câu hỏi trống và đúng/sai.

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