Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lưu trữ dữ liệu biểu mẫu động trong DBMS, tìm kiếm cách tiếp cận tối ưu

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ều questions . 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa một số lượng khỏi nhiều hàng trong cơ sở dữ liệu

  2. Mysqldump có hỗ trợ thanh tiến trình không?

  3. ném di chuyển nghệ nhân php [PDO Exception] Không thể tìm thấy trình điều khiển - Sử dụng Laravel

  4. Các truy vấn cập nhật mysql có được hưởng lợi từ một chỉ mục không?

  5. Cơ sở dữ liệu quan hệ có thể mở rộng quy mô theo chiều ngang