Hướng dẫn dùng qiuzz trong PHP

Đây cũng là dự án đầu tiên tôi làm bằng PHP / MySQL khoảng 8 năm trước.

Giải pháp đầu tiên của bạn là viết mã cơ sở dữ liệu để khớp chính xác với biểu mẫu của bạn. Vì vậy, bạn muốn ghi lại người dùng và các lần gửi câu đố, vì vậy nó sẽ trông giống như sau:

CREATE TABLE users (
  username VARCHAR(16) PRIMARY KEY, 
  password VARCHAR(8), 
  email VARCHAR(255), 
  birthday DATE, 
  gender ENUM('M', 'F')
);

CREATE TABLE quiz_answers (
  username VARCHAR(16) REFERENCES users,
  question1 VARCHAR(10),
  question2 INT,
  question3 ENUM('YES', 'NO', 'MAYBE'),
  question4 BOOLEAN,
  question5 VARCHAR(25),
  submitted_at DATETIME,
  PRIMARY KEY (username, submitted_at)
);

Vì vậy, đây chỉ là ghi lại mức tối thiểu: người dùng và các bài kiểm tra gửi. Tôi đã đưa ra các loại câu trả lời mà bạn sẽ phải làm cụ thể cho bài kiểm tra thực tế của mình. Tôi cũng đã thực hiện một phản hồi từ khóa người dùng và thời điểm họ gửi nó; bạn có nhiều khả năng sử dụng phím thay thế ( AUTO_INCREMENT), nhưng tôi muốn chống lại các phím thay thế nhiều nhất có thể.

Ngay lập tức có một vi phạm 1NF: questionN. Nếu bạn làm đúng, bạn sẽ đặt tên các cột này theo ý nghĩa của chúng, không chỉ là câu hỏi mà chúng là gì. Nhưng bình thường hóa điều này thực sự là bước tiếp theo đối với các biểu mẫu có thể mở rộng, nhưng theo dõi lịch sử.

Vì vậy, điều tiếp theo bạn sẽ nhận thấy là thực sự một bài kiểm tra là một tập hợp các câu hỏi, mỗi câu hỏi có một tập hợp các câu trả lời có thể có. Và sau đó, việc gửi biểu mẫu thực sự liên quan đến một tập hợp các câu trả lời đã chọn cho các câu hỏi của họ, trên một biểu mẫu câu hỏi cụ thể, bởi một người dùng câu hỏi cụ thể. Điều này nghe có vẻ giống như một mối quan hệ bốn chiều: người dùng, câu đố, câu hỏi, câu trả lời. Bạn có thể loại bỏ một trong những câu hỏi đó nếu bạn không ngại lặp lại các câu hỏi trên các câu đố khác nhau, nhưng để hoàn thiện, chúng ta hãy đi tiếp con đường này. Thay thế quiz_answersở trên bằng cái này:

CREATE TABLE questions (
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  question TEXT
);

CREATE TABLE answers (
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  question_id INTEGER REFERENCES questions,
  answer VARCHAR(255)
);

CREATE TABLE quizzes (
  name VARCHAR(255) PRIMARY KEY,
);

Chúng tôi thực sự không có bất kỳ siêu dữ liệu đặc biệt nào cho một bài kiểm tra, vì vậy nó chỉ là một cái tên.

Vì vậy, bây giờ bạn cần một mối quan hệ một-nhiều từ câu hỏi đến câu trả lời và từ câu đố đến câu hỏi.

CREATE TABLE question_answers (
  question_id INTEGER REFERENCES questions,
  answer_id INTEGER REFERENCES answers,
  idx INTEGER,
  PRIMARY KEY (question_id, answer_id)
);

CREATE TABLE quiz_questions (
  quiz_name VARCHAR(255) REFERENCES quizzes,
  question_id INTEGER REFERENCES questions,
  idx INTEGER,
  PRIMARY KEY (quiz_name, question_id)
);

Phần khó khăn, như đã đề cập ở trên, là mối quan hệ thứ tự cao hơn giữa người dùng và người gửi biểu mẫu, và liên kết từ câu hỏi biểu mẫu đến câu trả lời của người dùng. Tôi đã quyết định tách điều này thành hai bảng để tránh một số lặp lại.

CREATE TABLE quiz_submissions (
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(16) REFERENCES users,
  quiz_name VARCHAR(255) REFERENCES quizzes,
  submitted_at DATETIME
);

CREATE TABLE submission_answer (
  submission_id INTEGER REFERENCES quiz_submissions,
  question_id INTEGER REFERENCES questions,
  answer_id INTEGER REFERENCES answers,
  PRIMARY KEY (submission_id, question_id)
);

Điều này được bình thường hóa khá tốt tại thời điểm này. Bạn có thể thấy rằng nó cũng sẽ khó hơn một chút để truy vấn. Để nhận được tất cả các câu hỏi cho một bài kiểm tra, bạn sẽ phải tham gia từ bài kiểm tra đến các câu hỏi. Bạn có thể tham gia từ đó vào các câu trả lời để thực hiện một truy vấn lớn để lấy tất cả dữ liệu bạn cần để xây dựng biểu mẫu (cùng với việc phải thực hiện thêm xử lý hậu kỳ) hoặc bạn có thể nhấn vào cơ sở dữ liệu một lần nữa cho mỗi câu hỏi và thực hiện xử lý hậu kỳ ít hơn. Tôi có thể tranh luận theo cả hai cách. Để nhận được câu trả lời của tất cả một người dùng cụ thể, bạn sẽ phải chọn từ user_submissions với ID bài kiểm tra và tên người dùng vào bảng submit_answer cho câu hỏi và câu trả lời mà người dùng đã chọn. Vì vậy, truy vấn sẽ nhanh chóng trở nên thú vị. Bạn sẽ mất đi nỗi sợ hãi khi tham gia, nếu bạn có.

Tôi hy vọng điều này sẽ không làm bạn mất cơ sở dữ liệu quan hệ quá nhiều; bằng cách làm này, trên thực tế, bạn đang thực hiện một mô hình quan hệ bên trong mô hình quan hệ, mặc dù là một dạng hạn chế.

Tôi nhận ra rằng sử dụng nhiều phím tự nhiên như tôi đã làm ở trên là một chút không chính thống trong những ngày này. Tuy nhiên, tôi khuyên bạn nên thử nó, ít nhất là trong khi bạn bắt đầu, vì nó sẽ giúp bạn dễ dàng hơn nhiều để xem các phép nối phải hoạt động như thế nào nếu chúng không phải là tất cả các số nguyên trong phạm vi 1-10.

5 hữu ích 0 bình luận chia sẻ