Hướng dẫn này cung cấp các bước hoàn chỉnh để thiết kế một lược đồ cơ sở dữ liệu của các hệ thống bài kiểm tra và bài kiểm tra trực tuyến để quản lý người dùng, câu đố, câu hỏi, câu trả lời và bài thi. Nó có thể được sử dụng nhiều hơn nữa để phát triển các trang web hoặc ứng dụng dựa trên bài kiểm tra hoặc câu đố trực tuyến.
Sơ đồ mối quan hệ thực thể hoặc thiết kế cơ sở dữ liệu trực quan được hiển thị bên dưới.
Hình 1
Ghi chú :Nó hạn chế chỉ những người dùng đã đăng nhập mới có thể làm bài kiểm tra để tránh gửi thư rác. Các câu đố được coi là ngắn so với các bài kiểm tra.
Bạn cũng có thể xem các hướng dẫn phổ biến bao gồm Cách cài đặt MySQL 8 trên Ubuntu, Cách cài đặt MySQL 8 trên Windows, Cơ sở dữ liệu RBAC trong MySql, Cơ sở dữ liệu blog trong MySql, Tìm hiểu truy vấn SQL cơ bản trong MySQL.
Cơ sở dữ liệu câu hỏi
Bước đầu tiên là tạo Cơ sở dữ liệu câu đố. Nó có thể được tạo bằng cách sử dụng truy vấn như hình dưới đây.
CREATE SCHEMA `quiz` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Tôi đã sử dụng bộ ký tự utf8mb4 để hỗ trợ nhiều loại ký tự.
Bảng Người dùng
Trong phần này, chúng tôi sẽ thiết kế Bảng người dùng để lưu trữ thông tin người dùng. Cùng một bảng có thể được sử dụng để liên kết các máy chủ câu đố để người dùng có thể quản lý các câu hỏi của riêng họ và theo dõi việc thực hiện. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Người dùng.
Id | Id duy nhất để xác định người dùng. |
Tên | Tên của người dùng. |
Tên đệm | Tên đệm của người dùng. |
Họ | Họ của người dùng. |
Di động | Số điện thoại di động của người dùng. Nó có thể được sử dụng cho mục đích đăng nhập và đăng ký. |
Email của người dùng. Nó có thể được sử dụng cho mục đích đăng nhập và đăng ký. | |
Băm mật khẩu | Mật khẩu băm được tạo bởi thuật toán thích hợp. Chúng tôi phải tránh lưu trữ mật khẩu đơn giản. |
Máy chủ | Cờ để xác định xem người dùng có thể tổ chức một bài kiểm tra hay không. |
Đã đăng ký tại | Cột này có thể được sử dụng để tính toán tuổi thọ của người dùng với ứng dụng. |
Lần Đăng nhập Cuối cùng | Nó có thể được sử dụng để xác định thông tin đăng nhập cuối cùng của người dùng. |
Giới thiệu | Phần giới thiệu ngắn gọn về Người dùng Máy chủ sẽ được hiển thị trên Trang Kiểm tra hoặc Trắc nghiệm. |
Hồ sơ | Thông tin chi tiết về chủ sở hữu sẽ được hiển thị trên Trang Kiểm tra hoặc Trắc nghiệm. |
Bảng Người dùng với các ràng buộc thích hợp được hiển thị bên dưới.
CREATE TABLE `quiz`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`host` TINYINT(1) NOT NULL DEFAULT 0,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );
Bảng câu hỏi
Trong phần này, chúng tôi sẽ thiết kế Bảng câu đố để lưu trữ dữ liệu bài kiểm tra. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Câu đố.
Id | Id duy nhất để xác định bài kiểm tra. |
Id Máy chủ | Id máy chủ để xác định máy chủ bài kiểm tra. |
Tiêu đề | Tên bài kiểm tra sẽ được hiển thị trên Trang bài kiểm tra và các danh sách. |
Tiêu đề meta | Tiêu đề meta được sử dụng cho tiêu đề trình duyệt và SEO. |
Slug | Con sên để tạo URL. |
Tóm tắt | Bản tóm tắt để đề cập đến những điểm nổi bật chính. |
Loại | Loại để phân biệt giữa bài kiểm tra và bài kiểm tra. |
Điểm | Tổng điểm của bài kiểm tra. |
Đã xuất bản | Nó có thể được sử dụng để xác định xem bài kiểm tra / bài kiểm tra có được cung cấp công khai hay không. |
Được tạo lúc | Nó lưu trữ ngày và giờ mà bài kiểm tra / bài kiểm tra được tạo. |
Cập nhật lúc | Nó lưu trữ ngày và giờ mà bài kiểm tra / bài kiểm tra được cập nhật. |
Được xuất bản tại | Nó lưu trữ ngày và giờ mà bài kiểm tra / bài kiểm tra được xuất bản. |
Bắt đầu lúc | Nó lưu trữ ngày và giờ mà bài kiểm tra / bài kiểm tra bắt đầu và mở ra để thực hiện. |
Kết thúc lúc | Nó lưu trữ ngày và giờ mà bài kiểm tra / bài kiểm tra sẽ kết thúc trong thời gian thực hiện. |
Nội dung | Cột được sử dụng để lưu trữ dữ liệu bài kiểm tra / bài kiểm tra. |
Bảng Câu đố với các ràng buộc thích hợp như hình dưới đây.
CREATE TABLE `quiz`.`quiz` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`hostId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`startsAt` DATETIME NULL DEFAULT NULL,
`endsAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_quiz_host` (`hostId` ASC),
CONSTRAINT `fk_quiz_host`
FOREIGN KEY (`hostId`)
REFERENCES `quiz`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Meta câu đố
Bảng Meta Quiz có thể được sử dụng để lưu trữ thông tin bổ sung của các bài kiểm tra hoặc bài kiểm tra bao gồm URL biểu ngữ bài kiểm tra, v.v. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Meta Câu hỏi.
Id | Id duy nhất để xác định meta bài kiểm tra. |
Id câu hỏi | Id bài kiểm tra để xác định bài kiểm tra / bài kiểm tra chính. |
Phím | Chìa khóa xác định meta. |
Nội dung | Cột được sử dụng để lưu trữ siêu dữ liệu bài kiểm tra. |
Bảng Meta Câu đố với các ràng buộc thích hợp như được hiển thị bên dưới.
CREATE TABLE `quiz`.`quiz_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_quiz` (`quizId` ASC),
UNIQUE INDEX `uq_quiz_meta` (`quizId` ASC, `key` ASC),
CONSTRAINT `fk_meta_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Bảng câu hỏi trắc nghiệm
Bảng câu hỏi trắc nghiệm có thể được sử dụng để lưu trữ các câu hỏi liên quan đến các bài kiểm tra và câu đố. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Câu hỏi Trắc nghiệm.
Id | Id duy nhất để xác định câu hỏi đố vui. |
Id câu hỏi | Id bài kiểm tra để xác định bài kiểm tra / bài kiểm tra chính. |
Loại | Loại câu hỏi. Loại có thể là một lựa chọn (Có / Không), nhiều lựa chọn hoặc một lựa chọn. Chúng tôi cũng có thể có kiểu là đầu vào và vùng văn bản trong trường hợp kết quả bài kiểm tra cần kiểm tra thủ công. |
Đang hoạt động | Gắn cờ để xác định xem câu hỏi có đang hoạt động hay không. Một bài kiểm tra có thể có một số câu hỏi, nhưng chỉ những câu hỏi chọn lọc vẫn hoạt động tại một thời điểm. |
Cấp độ | Mức độ của câu hỏi để xác định xem nó dễ, trung bình hay khó. |
Điểm | Điểm của một câu hỏi riêng lẻ. Chúng tôi nên đảm bảo rằng chỉ có các câu hỏi chọn lọc được kích hoạt tại một thời điểm và tổng điểm của các câu hỏi đang hoạt động bằng với điểm của bài kiểm tra trước khi xuất bản bài kiểm tra. |
Được tạo lúc | Nó lưu trữ ngày và giờ mà câu hỏi được tạo. |
Cập nhật lúc | Nó lưu trữ ngày và giờ mà câu hỏi được cập nhật. |
Nội dung | Cột được sử dụng để lưu trữ câu hỏi. |
Bảng câu hỏi trắc nghiệm với các ràng buộc thích hợp như hình dưới đây.
CREATE TABLE `quiz`.`quiz_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`type` VARCHAR(50) NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`level` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_question_quiz` (`quizId` ASC),
CONSTRAINT `fk_question_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Bảng trả lời câu hỏi
Bảng trả lời câu đố có thể được sử dụng để lưu trữ các câu trả lời của một lựa chọn, nhiều lựa chọn và lựa chọn loại câu hỏi. Trong trường hợp câu hỏi có một lựa chọn, các câu trả lời có thể là Có và Không. Dưới đây là mô tả của tất cả các cột của Bảng trả lời câu hỏi.
Id | Id duy nhất để xác định câu trả lời cho bài kiểm tra. |
Id câu hỏi | Id bài kiểm tra để xác định bài kiểm tra / bài kiểm tra chính. |
Id Câu hỏi | Id câu hỏi để xác định câu hỏi chính. |
Đang hoạt động | Gắn cờ để xác định xem câu trả lời có đang hoạt động hay không. |
Đúng | Gắn cờ để xác định xem câu trả lời có đúng hay không. |
Được tạo lúc | Nó lưu trữ ngày và giờ tại đó câu trả lời được tạo. |
Cập nhật lúc | Nó lưu trữ ngày và giờ mà câu trả lời được cập nhật. |
Nội dung | Cột được sử dụng để lưu trữ câu trả lời. |
Bảng Trả lời Câu đố với các ràng buộc thích hợp được hiển thị bên dưới.
CREATE TABLE `quiz`.`quiz_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`correct` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_answer_quiz` (`quizId` ASC),
CONSTRAINT `fk_answer_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `quiz`.`quiz_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `quiz`.`quiz_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `quiz`.`quiz_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Ghi bàn
Trong phần này, chúng tôi sẽ thiết kế Bàn ăn để theo dõi việc đăng ký và thời gian người dùng thử các câu đố. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Ghi.
Id | Id duy nhất để xác định lấy. |
Id Người dùng | Id người dùng để xác định người trả lời câu hỏi. |
Id câu hỏi | Id bài kiểm tra để xác định bài kiểm tra. |
Trạng thái | Trạng thái lấy hàng. Nó có thể được đăng ký, bắt đầu, tạm dừng, kết thúc, khai báo. |
Điểm | Tổng điểm mà người dùng thu được. |
Được tạo lúc | Nó lưu trữ ngày và giờ mà tại đó ảnh được tạo. |
Cập nhật lúc | Nó lưu trữ ngày và giờ tại đó quá trình chụp được cập nhật. |
Bắt đầu lúc | Nó lưu trữ ngày và giờ bắt đầu. |
Hoàn thành lúc | Nó lưu trữ ngày và giờ hoàn thành việc lấy. |
Nội dung | Cột được sử dụng để lưu trữ các nhận xét. |
Bảng Take với các ràng buộc thích hợp như được hiển thị bên dưới.
CREATE TABLE `quiz`.`take` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`quizId` BIGINT NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`startedAt` DATETIME NULL DEFAULT NULL,
`finishedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_take_user` (`userId` ASC),
CONSTRAINT `fk_take_user`
FOREIGN KEY (`userId`)
REFERENCES `quiz`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `quiz`.`take`
ADD INDEX `idx_take_quiz` (`quizId` ASC);
ALTER TABLE `quiz`.`take`
ADD CONSTRAINT `fk_take_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Ghi bảng câu trả lời
Ghi bảng trả lời có thể được sử dụng để lưu trữ các câu trả lời do người dùng chọn trong khi làm bài kiểm tra. Trong trường hợp câu hỏi trắc nghiệm, có thể có nhiều đáp án. Dưới đây được đề cập là mô tả của tất cả các cột của Bảng Trả lời.
Id | Id duy nhất để xác định câu trả lời. |
Lấy Id | Id lấy để xác định lần thử bài kiểm tra. |
Id câu trả lời | Id câu trả lời để xác định câu trả lời cho bài kiểm tra. |
Đang hoạt động | Gắn cờ để xác định xem câu trả lời có đang hoạt động hay không. |
Được tạo lúc | Nó lưu trữ ngày và giờ tại đó câu trả lời được tạo. |
Cập nhật lúc | Nó lưu trữ ngày và giờ mà câu trả lời được cập nhật. |
Nội dung | Cột được sử dụng để lưu trữ câu trả lời trong trường hợp nhập hoặc loại câu hỏi dạng textarea. |
Bảng Trả lời Trả lời với các ràng buộc thích hợp được hiển thị bên dưới.
CREATE TABLE `quiz`.`take_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`takeId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_answer_take` (`takeId` ASC),
CONSTRAINT `fk_answer_take`
FOREIGN KEY (`takeId`)
REFERENCES `quiz`.`take` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `quiz`.`take_answer`
ADD INDEX `idx_tanswer_question` (`questionId` ASC);
ALTER TABLE `quiz`.`take_answer`
ADD CONSTRAINT `fk_tanswer_question`
FOREIGN KEY (`questionId`)
REFERENCES `quiz`.`quiz_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `quiz`.`take_answer`
ADD INDEX `idx_tanswer_answer` (`answerId` ASC);
ALTER TABLE `quiz`.`take_answer`
ADD CONSTRAINT `fk_tanswer_answer`
FOREIGN KEY (`answerId`)
REFERENCES `quiz`.`quiz_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tóm tắt
Trong hướng dẫn này, chúng ta đã thảo luận về thiết kế cơ sở dữ liệu của hệ thống Quiz để lưu trữ người dùng, câu đố, câu hỏi, câu trả lời và các lần thử câu đố dưới dạng mất công.
Bạn có thể gửi bình luận của mình để tham gia thảo luận. Bạn cũng có thể quan tâm đến việc thiết kế cơ sở dữ liệu của các ứng dụng Blog và Poll &Survey.
Lược đồ cơ sở dữ liệu hoàn chỉnh cũng có sẵn trên GitHub.