Phân tích và Thiết kế Cơ sở dữ liệu: Hệ thống Quiz Real-time
Bước 1: Xác định Thực thể (Entities) và Thuộc tính (Attributes)
Ẩn dụ đời sống: Bước này giống như liệt kê "nhân vật" trong một bộ phim và thông tin cá nhân của từng người. Mỗi "nhân vật" là một thực thể, mỗi "thông tin" là một thuộc tính.
Dựa trên phân tích yêu cầu nghiệp vụ, hệ thống Quiz Real-time cần quản lý 5 thực thể chính:
1.1. Thực thể: Users (Người dùng)
Nghiệp vụ: Người dùng đăng ký tài khoản để tạo và quản lý quiz (vai trò Host/Giáo viên).
| Thuộc tính | Mô tả | Khóa | Bắt buộc |
|---|---|---|---|
id | Mã định danh duy nhất | 🔑 PK | ✅ |
email | Email đăng nhập (unique) | UNIQUE | ✅ |
password_hash | Mật khẩu đã mã hóa | — | ✅ |
name | Tên hiển thị | — | ✅ |
created_at | Thời gian tạo tài khoản | — | ✅ (auto) |
1.2. Thực thể: Quizzes (Bộ câu hỏi)
Nghiệp vụ: Mỗi quiz do một User tạo ra, chứa nhiều câu hỏi và có cấu hình thời gian trả lời.
| Thuộc tính | Mô tả | Khóa | Bắt buộc |
|---|---|---|---|
id | Mã định danh duy nhất | 🔑 PK | ✅ |
title | Tiêu đề bộ quiz | — | ✅ |
description | Mô tả ngắn về bộ quiz | — | ❌ |
host_id | Mã người tạo | 🔗 FK → Users | ✅ |
time_per_question | Thời gian trả lời mỗi câu (giây) | — | ✅ (default: 20) |
is_published | Trạng thái xuất bản | — | ✅ (default: false) |
created_at | Thời gian tạo | — | ✅ (auto) |
updated_at | Thời gian cập nhật cuối | — | ✅ (auto) |
1.3. Thực thể: Questions (Câu hỏi)
Nghiệp vụ: Mỗi câu hỏi thuộc một quiz, có nội dung và các lựa chọn trả lời (text-only cho MVP).
| Thuộc tính | Mô tả | Khóa | Bắt buộc |
|---|---|---|---|
id | Mã định danh duy nhất | 🔑 PK | ✅ |
quiz_id | Mã bộ quiz chứa câu hỏi | 🔗 FK → Quizzes | ✅ |
content | Nội dung câu hỏi | — | ✅ |
options | Danh sách đáp án (JSON array) | — | ✅ |
correct_option_index | Chỉ số đáp án đúng (0-based) | — | ✅ |
order_index | Thứ tự câu hỏi trong quiz | — | ✅ (default: 0) |
created_at | Thời gian tạo | — | ✅ (auto) |
1.4. Thực thể: Game_Sessions (Phiên chơi)
Nghiệp vụ: Mỗi lần Host bắt đầu một game từ quiz sẽ tạo một phiên chơi. Phiên chơi có mã PIN để Player tham gia.
| Thuộc tính | Mô tả | Khóa | Bắt buộc |
|---|---|---|---|
id | Mã định danh duy nh ất | 🔑 PK | ✅ |
quiz_id | Mã bộ quiz được chơi | 🔗 FK → Quizzes | ✅ |
host_id | Mã người chủ phòng | 🔗 FK → Users | ✅ |
pin | Mã PIN 6 số để join phòng | UNIQUE | ✅ |
status | Trạng thái phiên | — | ✅ (default: 'waiting') |
started_at | Thời gian bắt đầu game | — | ❌ |
ended_at | Thời gian kết thúc game | — | ❌ |
created_at | Thời gian tạo phiên | — | ✅ (auto) |
Giá trị
status:'waiting'→'playing'→'finished'
1.5. Thực thể: Player_Results (Kết quả người chơi)
Nghiệp vụ: Lưu kết quả của từng Player trong mỗi phiên game. Player không cần tài khoản, chỉ cần nickname.
| Thuộc tính | Mô tả | Khóa | Bắt buộc |
|---|---|---|---|
id | Mã định danh duy nhất | 🔑 PK | ✅ |
session_id | Mã phiên chơi | 🔗 FK → Game_Sessions | ✅ |
player_nickname | Tên hiển thị của Player |