Bài 03 – Phân tích và thiết kế database sử dụng MySQL 5

Sharing is caring!

Xin chào các bạn Hi , hôm nay tui mới có thời gian rãnh rỗi để viết tiếp bài trong series Xây dựng hệ thống làm trắc nghiệm (Quiz) với Laravel 5. Ở bài trước tui đã hướng dẫn tạo module front-end và back-end trong Laravel 5 rồi đúng không? Tui hy vọng là các bạn cũng làm được nhé. Công việc kế tiếp sẽ là việc phân tích và thiết kế các table để lưu trữ dữ liệu cho hệ thống Quiz này.

Trước khi vào phân tích, tui sẽ cho các bạn xem qua các table tui đã làm để các bạn có cái nhìn tổng quan trước cho nó đỡ hoang mang.  Overjoy

quiz's database diagram

1. Table vl_student:

Đầu tiên, chúng ta cần có table vl_student để lưu thông tin của các học viên muốn làm bài quiz.

Field Name Mô tả
id Id cho từng student
first_name Tên
surname Họ
email email dùng để login
password
salt dãy số bất kỳ dùng để tạo password
active on/off một student nào đó

Tiếp theo, mỗi một student có thể có nhiều bài quiz khác nhau và mỗi bài quiz cũng có thể dùng cho nhiều student khác nhau. Do đó các bạn thấy, đây là quan hệ n-n giữa table vl_studentvl_quiz, vậy là ta phải có thêm một table tên là vl_student_quiz nữa để tách cái quan hệ n-n này thành quan hệ 1-n.

student quiz diagram

2. Table vl_quiz:

Field Name Mô tả
id Id cho từng quiz
quiz_name Tên cho mỗi bài quiz
duration thời gian làm bài quiz, tính bằng phút
question_count số lượng question trong mỗi bài quiz
published  dùng để mở/tắt bài quiz. Student chỉ làm những bài quiz có published = 1

3. Table vl_student_quiz:

Field Name Mô tả
id Id cho từng student_quiz
student_id Reference của mỗi student’s id
quiz_id Reference của mỗi quiz’s id
start_time Thời gian bắt đẩu. Khi Student bắt đầu làm bài thì lưu start_time lại
end_time end_time = start_time + duration của mỗi quiz tương ứng
finished Dùng để xác định xem bài quiz của mỗi student đã làm xong hay chưa (hết giờ làm bài quiz hoặc student chủ động bấm nút “finish quiz”)

4. Table vl_question:

Tiếp theo, chúng ta cần có table vl_question để lưu nhưng câu hỏi

Field Name Mô tả
id Id cho từng question
question_text Nội dung câu hỏi

5. Table vl_answer:

Do mỗi question luôn luôn có nhiều hơn 1 câu trả lời, và trong đó có 1 câu là câu trả lời đúng, nên chúng ta phải tách câu trả lời ra thành 1 table.

question and answer

Field Name Mô tả
id Id cho từng answer
question_id Reference của câu hỏi tương ứng
answer_text Nội dung câu trả lời
correct Câu nào là câu trả lời đúng thì có giá trị là 1, mặc định là 0

6. Table vl_quiz_question:

Ta đã có table vl_quizvl_question. Cũng tương tự như table vl_quizvl_student, 2 table vl_quizvl_question cũng có mối quan hệ là n-n, một quiz có nhiều question và ngược lại một question cũng có thể dùng cho nhiều quiz khác nhau. Do đó ta cần thêm table vl_quiz_question để tách quan hệ n-n thành 1-n

quiz's question

Field Name Mô tả
id Id cho từng quiz_question
quiz_id Reference của quiz tương ứng
question_json lưu các question_id vào một array, sau đó chuyển thành json để lưu nhằm tiết kiệm dung lượng

7. Table vl_quiz_result:

Cuối cùng, để lưu kết quả của từng bài quiz cho từng student, ta cần tạo thêm table vl_quiz_result để lưu lại question và câu trả lời tương ứng của từng student.

quiz's result

Field Name Mô tả
id Id cho từng quiz_result
student_id Reference của student tương ứng
question_id id câu hỏi trong bài quiz
quiz_id id của bài quiz tương ứng
answer_id danh sách các câu trả lời của từng câu hỏi
correct Dùng để lưu câu trả lời đúng
answered Lưu câu trả lời của student khi làm bài quiz

Vậy là cơ bản tui đã phân tích và tạo các table tương ứng. Có thể trong quá trình viết các bài tiếp theo, sẽ có những thêm bớt các field hoặc table, nếu có thay đổi thì tui sẽ hiệu chỉnh lại ngay trong những bài đó luôn. Cuối cùng là chúng ta sẽ xem lại tất cả các table và mối quan hệ giữa chúng nhé.

quiz's database diagram

Hẹn các bạn ở bài tiếp theo nhé.  Bye

Sharing is caring!

Bài 02 - Tạo module Frontend và Backend trong Laravel 5
Bài 04 - Config database và tạo các Model tương ứng với các table

Vincent Le

Tui là Lê Minh Đạt, tên tiếng anh là Vincent(do thích nhân vật Vincent Valentine, ai từng là fan của trò Final Fantasy VII thì sẽ biết nhân vật này, hehe). Đang tập tành làm một blogger viết về mảng lập trình, mong muốn được chia sẻ những gì đã học được, tích góp được trong 10 năm đi làm thợ code.

shares