Thiết kế cơ sở dữ liệu câu hỏi - cách nào là tốt hơn?


15

Tôi có MỘT trang html dài, một số bộ câu hỏi được chia thành các phần nhỏ (khoảng 15 phần phụ trong một trang), tổng số câu hỏi là khoảng 100 câu hỏi: thay đổi từ đầu vào, nhiều lựa chọn, hộp kiểm, nút radio, textarea, và tải lên tập tin. Một câu hỏi có thể chứa nhiều câu trả lời thu được từ nhóm các hộp kiểm, nhóm danh sách chọn, nhóm đa lựa chọn hoặc tất cả chúng được kết hợp thành một câu trả lời. Tôi nghĩ rằng tôi sẽ sử dụng thiết kế cơ sở dữ liệu này bên dưới nhưng gần đây phát hiện ra rằng đó không phải là cách tiếp cận tốt.

  1. Một khách hàng chỉ có thể có một bộ câu hỏi: một khách hàng trên 100 câu hỏi.
  2. Đối với cách tiếp cận cũ, tôi không giữ câu hỏi trong cơ sở dữ liệu mà chỉ định là hằng số trong mã hóa PHP. Vấn đề là tôi phải so sánh câu hỏi trong PHP để làm cho nó đồng bộ hóa với câu trả lời trong cơ sở dữ liệu. Nếu một câu hỏi đã bị thay đổi / xóa / chuyển khỏi PHP, tôi chắc chắn sẽ bị lạc để khớp với câu trả lời trong cơ sở dữ liệu Câu hỏi. Giải pháp tốt hơn?
  3. Tôi có thể giữ nhiều câu trả lời thu được từ nhiều yếu tố trong một trường thành một câu trả lời không? Làm cách nào tôi có thể truy xuất trường này và hiển thị lại cho khách hàng xem trên biểu mẫu?
  4. Tôi nên chọn phương án nào dưới đây?

TÙY CHỌN 1: Cách tiếp cận cũ (1 bảng)

BẢNG: Bảng câu hỏi

  • ID (PK)
  • ID khách hàng
  • Trạng thái
  • A1
  • A2
  • A3
  • .
  • .
  • .
  • A100

TÙY CHỌN 2: Cách tiếp cận mới (2 bảng)

BẢNG: Câu hỏi

  • QID (PK)
  • Câu hỏi (varchar)

BẢNG: Trả lời

  • AID (PK)
  • ID khách hàng
  • QID (int)
  • Trả lời (varchar)

Hoặc TÙY CHỌN 3?


Bạn có thể thêm thông tin về ứng dụng xin vui lòng. - Bảng câu hỏi được tạo động? IE: bảng câu hỏi này nên có những câu hỏi này trong khi bảng câu hỏi khác nên có những câu hỏi khác. - Là câu hỏi cho bảng câu hỏi năng động? IE: Khách hàng có thể thêm câu hỏi mới sau. Bất kể đó là hệ thống động hay hệ thống tĩnh, bạn sẽ phải lưu trữ kết quả Câu hỏi 1: 1 khác với Câu hỏi 1: M: Câu trả lời trong DB.
Zambonilli

Có và Không tương ứng (câu hỏi động có thể muộn hơn trong giai đoạn 2 nhưng không phải bây giờ.)
Mô-đun

Tôi đã bỏ phiếu để đóng 100 câu hỏi này: thay đổi từ đầu vào, nhiều lựa chọn, hộp kiểm, nút radio, văn bản và tải lên tệp quá rộng không hữu ích.
Evan Carroll

Câu trả lời:


17

Chắc chắn không cứng mã câu hỏi của bạn. Sử dụng cơ sở dữ liệu quan hệ hoặc tệp xml. Tôi đề xuất các bảng sau

  • Questionnaire: Mô tả chung về bảng câu hỏi. Tiêu đề, tên khảo sát, ngày phát hành bảng câu hỏi, phiên bản, v.v.

  • Section: Các phần câu hỏi được tạo thành. Số phần, tiêu đề phần, mô tả.

  • Question: Các câu hỏi thuộc về một phần. Số câu hỏi, văn bản câu hỏi, mô tả, loại câu hỏi (văn bản, nhiều lựa chọn, v.v.).

  • Question_Choice: Các câu trả lời có thể thuộc về một câu hỏi tương ứng với các hộp kiểm đơn, nút radio, v.v. Văn bản của sự lựa chọn, số lựa chọn, thứ tự.

  • Respondent: Những người trả lời các câu hỏi. Dữ liệu cá nhân, số người dùng.

  • Interview: Phỏng vấn hoặc kiểm tra hoặc khảo sát (phụ thuộc vào bản chất của bảng câu hỏi) thuộc về một người trả lời và một câu hỏi. Nếu người trả lời luôn có thể chỉ trả lời một bảng câu hỏi (hoặc nếu khảo sát là ẩn danh), thì bảng này đã lỗi thời và có thể được hợp nhất với bảng Bị đơn. Ngày phỏng vấn (hoặc ngày kiểm tra hoặc ngày khảo sát), người phỏng vấn (nếu áp dụng).

  • Answer: Câu trả lời thuộc về một cuộc phỏng vấn (hoặc người trả lời, xem ở trên) và một câu hỏi. Trả lời văn bản (cho câu hỏi loại văn bản), lựa chọn (cho các nút radio).

  • Answer_Choice: Các lựa chọn thuộc về một Câu trả lời và một Câu hỏi_Chọn khi có thể chọn nhiều lựa chọn.

Đây là một cách tiếp cận rất bình thường; tuy nhiên, bạn có thể quyết định ghép các lựa chọn thành một chuỗi hoặc lưu trữ chúng dưới dạng mẫu bit hoặc đơn giản hóa nó theo một số cách khác tùy thuộc vào nhu cầu của bạn.


6

Bạn cần một vài bảng,

1 - Các câu hỏi (id câu hỏi, loại đầu vào, hiển thị, loại câu hỏi, văn bản câu hỏi, câu trả lời mong đợi ....)

2 - Câu trả lời (id câu hỏi, id người dùng, id hoạt động, câu trả lời ....)

3 - Người dùng (id người dùng, tên người dùng ......)

4 - Một bảng để giữ một hoạt động câu hỏi / câu trả lời (id hoạt động, dữ liệu / thời gian, id người dùng)

Bạn cũng có thể muốn có một bảng chỉ định các câu hỏi nên được áp dụng cho từng hoạt động - được nhóm bởi người dùng hoặc có thể là một bộ sưu tập câu hỏi. Các khóa ngoại / khóa chính sẽ là các cột có cùng tên trong nhiều bảng và nên được lập chỉ mục.

Nếu bạn sử dụng cấu trúc này, bạn sẽ có thể thêm câu hỏi hoặc người dùng hoặc thay đổi câu trả lời mà không phải thay đổi lược đồ hoặc mã bản trình bày - đảm bảo rằng mã bản trình bày được tạo động khi chạy - bạn chỉ cần thêm bản ghi ở nơi thích hợp.

Cách tiếp cận này có thể mất nhiều thời gian hơn để phát triển ban đầu so với cách tiếp cận được mã hóa cứng, nhưng sẽ đơn giản hơn nhiều để duy trì vì bạn chỉ cần thay đổi dữ liệu để thay đổi hành vi.

(Một mẹo, để tạo lớp trình bày của bạn, bạn sẽ cần một truy vấn sẽ hiển thị các câu hỏi thích hợp, sau đó lặp qua tập kết quả này và gọi một phương thức để hiển thị cho câu hỏi trên màn hình, các phương thức được chọn phù hợp với trình bày câu hỏi đó [hộp văn bản, nhóm radio, v.v.)


+1 Không chắc chắn về Bảng số 4, nhưng trả lời tốt về tổng thể. Đặc biệt tôi thích sự thay đổi từ tên bảng số ít sang số nhiều tức là Câu hỏi >> Câu hỏi.
Leigh Riffel
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.