Bạn đã phải đối mặt với một vấn đề chung:Cố gắng sử dụng một thứ gì đó tĩnh (cơ sở dữ liệu với cấu trúc được xác định trước) cho một thứ gì đó động (một loạt các tập dữ liệu riêng lẻ chỉ có một điểm chung:chúng đến từ các biểu mẫu). Những gì bạn muốn là có thể làm được với cơ sở dữ liệu nhưng sẽ dễ dàng hơn đáng kể nếu không có, tuy nhiên vì tôi cho rằng bạn thực sự muốn sử dụng cơ sở dữ liệu cho việc này, đây là những gì tôi cần làm:
- Bạn có một
document
(hoặc bảng câu hỏi ) chứa nhiềuquestions
. Cả hai đều đủ chung chung và cần có bảng riêng, giống như cách bạn đã làm cho đến nay. - Mỗi câu hỏi có một
type
xác định loại câu hỏi đó là gì ( nhiều lựa chọn, dạng tự do, chọn một ... ) và tất nhiên câu hỏi cũng cóoptions
. Vì vậy, đó là hai bảng nữa. Lý do ở đây là việc tách chúng khỏi câu hỏi thực tế sẽ cho phép tồn tại một số mức độ trừu tượng nhất định và các truy vấn của bạn sẽ vẫn hơi đơn giản mặc dù có thể rất khó.
Vì vậy, mỗi tài liệu có 1..n đến câu hỏi, mỗi câu hỏi có 1 loại và 1..n tùy chọn. Bỏ qua một chút, đây là những gì tôi đang nghĩ đến với các bảng liên kết, v.v.
Document
bigint id
DocumentQuestions
bigint document_id
bigint question_id
Question
bigint id
varchar question
QuestionType
bigint question_id
bigint type_id
Type [pre-filled table with id:type pairs, such as 1=freeform, 2=select one etc.]
QuestionOptions
bigint id
bigint question_id
varchar description
varchar value
Answers
bigint id
bigint document_id
[etc. such as user_id]
QuestionAnswers
bigint answer_id
bigint question_id
bigint questionoptions_id
Kiểu thiết kế này cho phép một số điều:
- Bản thân các câu hỏi đều có thể tái sử dụng, rất hữu ích nếu bạn đang đặt câu hỏi chung chung " trả lời x câu hỏi ngẫu nhiên này từ một nhóm y câu hỏi ".
- Có thể thêm các loại mới một cách dễ dàng mà không làm hỏng các loại hiện có.
- Bạn luôn có thể điều hướng qua cấu trúc một cách khá dễ dàng, ví dụ:" Tên tài liệu cho câu trả lời câu hỏi duy nhất này mà tôi có là gì? "hoặc" có bao nhiêu người trả lời sai cho một câu hỏi này? "
- Bởi vì các loại được tách biệt, bạn có thể tạo một giao diện người dùng (web) phản ánh trạng thái trong cơ sở dữ liệu một cách dễ dàng - tốt hơn nữa, nếu loại thay đổi, bạn có thể thậm chí không phải chạm vào mã giao diện người dùng của mình.
- Vì mỗi tùy chọn có thể cho một câu hỏi là hàng riêng của nó trong
QuestionOptions
, bạn có thể dễ dàng nhận được giá trị thực tế.
Vấn đề rõ ràng với điều này là nó yêu cầu khớp nối khá nghiêm ngặt giữa các bảng để có tính toàn vẹn và sẽ là một khó khăn để chạy đúng cách khi bắt đầu. Cũng vì value
trong QuestionOptions
là varchar, bạn cần có khả năng phân tích cú pháp nhiều thứ và thậm chí bạn có thể muốn giới thiệu một trường khác cho các gợi ý chuyển đổi.
Hy vọng điều này sẽ hữu ích mặc dù bạn không đồng ý với giải pháp của tôi.