このチュートリアルでは、ユーザー、クイズ、質問、回答、およびテイクを管理するためのオンラインテストとクイズシステムのデータベーススキーマを設計するための完全な手順を提供します。さらに、オンラインテストまたはクイズベースのWebサイトまたはアプリケーションの開発に使用できます。
実体関連図または視覚的なデータベース設計を以下に示します。
図1
メモ :スパムを回避するために、ログインしたユーザーのみがクイズに回答するように制限されています。クイズはテストと比較して短いと見なされます。
また、UbuntuにMySQL 8をインストールする方法、WindowsにMySQL 8をインストールする方法、MySqlのRBACデータベース、MySqlのブログデータベース、MySQLの基本的なSQLクエリを学ぶなどの人気のあるチュートリアルにアクセスすることもできます。
クイズデータベース
最初のステップは、クイズデータベースを作成することです。以下に示すクエリを使用して作成できます。
CREATE SCHEMA `quiz` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
文字セットutf8mb4を使用しました 幅広いキャラクターをサポートします。
ユーザーテーブル
このセクションでは、ユーザーテーブルを設計します ユーザー情報を保存します。同じテーブルを使用してクイズホストを関連付け、ユーザーが自分のクイズを管理してテイクを追跡できるようにすることができます。以下は、ユーザーテーブルのすべての列の説明です。
| ユーザーを識別するための一意のID。 |
| ユーザーの名。 |
| ユーザーのミドルネーム。 |
| ユーザーの名前。 |
| ユーザーの携帯電話番号。ログインと登録の目的で使用できます。 |
| ユーザーのメールアドレス。ログインと登録の目的で使用できます。 |
| 適切なアルゴリズムによって生成されたパスワードハッシュ。プレーンなパスワードの保存は避けなければなりません。 |
| ユーザーがクイズをホストできるかどうかを識別するフラグ。 |
| この列は、アプリケーションを使用しているユーザーの寿命を計算するために使用できます。 |
| ユーザーの最後のログインを識別するために使用できます。 |
| テストページまたはクイズページに表示されるホストユーザーの簡単な紹介。 |
| テストページまたはクイズページに表示される所有者の詳細。 |
適切な制約のあるユーザーテーブルは次のとおりです。
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) );
クイズテーブル
このセクションでは、クイズテーブルを設計します クイズデータを保存します。以下は、クイズテーブルのすべての列の説明です。
| クイズを識別するための一意のID。 |
| クイズホストを識別するためのホストID。 |
| クイズページとリストに表示されるクイズのタイトル。 |
| ブラウザのタイトルとSEOに使用されるメタタイトル。 |
| URLを形成するためのスラッグ。 |
| 主なハイライトに言及する要約。 |
| テストとクイズを区別するためのタイプ。 |
| クイズの合計スコア。 |
| テスト/クイズが公開されているかどうかを識別するために使用できます。 |
| テスト/クイズが作成された日時が保存されます。 |
| テスト/クイズが更新された日時が保存されます。 |
| テスト/クイズが公開された日時が保存されます。 |
| テスト/クイズが開始され、テイクを開く日時が保存されます。 |
| テスト/クイズが終了する日時が保存されます。 |
| テスト/クイズデータの保存に使用される列。 |
適切な制約のあるクイズ表は次のとおりです。
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);
クイズメタ
クイズメタテーブルを使用して、クイズバナーのURLなどを含むテストまたはクイズの追加情報を保存できます。以下は、クイズメタテーブルのすべての列の説明です。
| クイズメタを識別するための一意のID。 |
| 親テスト/クイズを識別するためのクイズID。 |
| メタを識別するキー。 |
| クイズのメタデータを保存するために使用される列。 |
適切な制約のあるクイズメタテーブルは次のとおりです。
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;
クイズの質問表
クイズの質問表 テストやクイズに関連する質問を保存するために使用できます。以下は、クイズの質問表のすべての列の説明です。
| クイズの質問を識別するための一意のID。 |
| 親テスト/クイズを識別するためのクイズID。 |
| 質問の種類。タイプは、単一選択(はい/いいえ)、複数選択、または選択にすることができます。クイズの結果を手動で確認する必要がある場合に備えて、typeをinputおよびtextareaとして使用することもできます。 |
| 質問がアクティブかどうかを識別するためのフラグ。クイズには複数の質問を含めることができますが、一度にアクティブなままになるのは選択した質問だけです。 |
| 簡単、中程度、難しいかを特定するための質問のレベル。 |
| 個々の質問のスコア。クイズを公開する前に、一度にアクティブな質問のみがアクティブであり、アクティブな質問の合計スコアがクイズのスコアと等しいことを確認する必要があります。 |
| 質問が作成された日時が保存されます。 |
| 質問が更新された日時が保存されます。 |
| 質問を保存するために使用される列。 |
適切な制約のあるクイズの質問表は次のとおりです。
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;
クイズ回答表
クイズ回答表 単一選択、複数選択、および選択タイプの質問の回答を保存するために使用できます。選択式の質問の場合、答えは「はい」と「いいえ」になります。以下は、クイズの回答表のすべての列の説明です。
| クイズの回答を識別するための一意のID。 |
| 親テスト/クイズを識別するためのクイズID。 |
| 親の質問を識別するための質問ID。 |
| 回答がアクティブかどうかを識別するためのフラグ。 |
| 答えが正しいかどうかを識別するためのフラグ。 |
| 回答が作成された日時が保存されます。 |
| 回答が更新された日時が保存されます。 |
| 回答を保存するために使用される列。 |
適切な制約のあるクイズ回答表は次のとおりです。
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;
テーブルを取る
このセクションでは、テイクテーブルを設計します クイズへのユーザーの試行の登録とタイミングを追跡します。以下は、テイクテーブルのすべての列の説明です。
| テイクを識別するための一意のID。 |
| クイズの受験者を識別するためのユーザーID。 |
| クイズを識別するためのクイズID。 |
| テイクのステータス。登録、開始、一時停止、終了、宣言することができます。 |
| ユーザーが取得した合計スコア。 |
| テイクが作成された日時を保存します。 |
| テイクが更新された日時を保存します。 |
| テイクが開始された日時が保存されます。 |
| テイクが終了した日時を保存します。 |
| テイクコメントを保存するために使用される列。 |
適切な制約のあるテイクテーブルは次のとおりです。
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;
回答表を作成
回答表を作成 クイズの受験中にユーザーが選択した回答を保存するために使用できます。多肢選択式の質問の場合、複数の回答が存在する可能性があります。以下は、回答テーブルのすべての列の説明です。
| テイクアンサーを識別するための一意のID。 |
| クイズの試行を識別するためのテイクID。 |
| クイズの回答を識別するための回答ID。 |
| 回答がアクティブかどうかを識別するためのフラグ。 |
| 回答が作成された日時が保存されます。 |
| 回答が更新された日時が保存されます。 |
| 入力またはテキストエリアタイプの質問の場合に回答を保存するために使用される列。 |
適切な制約のある回答表は次のとおりです。
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;
概要
このチュートリアルでは、ユーザー、クイズ、質問、回答、およびクイズの試行をテイクの形式で保存するためのクイズシステムのデータベース設計について説明しました。
コメントを送信して、ディスカッションに参加できます。 BlogおよびPoll&Surveyアプリケーションのデータベースの設計にも興味があるかもしれません。
完全なデータベーススキーマはGitHubでも入手できます。