このチュートリアルでは、ユーザー、投票、質問、回答、および投票を管理するためのアンケートを介して、クローズドまたはオープンの投票と調査のデータベーススキーマを設計するための完全な手順を提供します。さらに、ポーリングおよび調査Webサイトまたはモバイルアプリケーションの開発に使用できます。
実体関連図または視覚的なデータベース設計を以下に示します。
図1
メモ :データベーススキーマをシンプルに保ち、実行可能な最小限の製品を開発するために、バージョン管理やポーリングや調査のレビューなどのより高度なオプションについては説明していません。スパムを回避するために、ログインしたユーザーのみが調査または投票に参加するように制限されているため、正当な投票のみが送信されます。
また、UbuntuにMySQL 8をインストールする方法、WindowsにMySQL 8をインストールする方法、MySqlのRBACデータベース、MySqlのブログデータベース、MySQLの基本的なSQLクエリを学ぶなどの人気のあるチュートリアルにアクセスすることもできます。
ポールデータベース
最初のステップは、投票データベースを作成することです。以下に示すクエリを使用して作成できます。
CREATE SCHEMA `poll` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
文字セットutf8mb4を使用しました 幅広いキャラクターをサポートします。
ユーザーテーブル
このセクションでは、ユーザーテーブルを設計します 投票/調査の所有者のユーザー情報を保存します。同じテーブルを使用して、投票/調査の所有者を関連付け、ユーザーが自分の投票または調査を管理し、投票活動を追跡できるようにすることができます。以下は、ユーザーテーブルのすべての列の説明です。
ユーザーを識別するための一意のID。 |
ユーザーの名。 |
ユーザーのミドルネーム。 |
ユーザーの名前。 |
ユーザーの携帯電話番号。ログインと登録の目的で使用できます。 |
ユーザーのメールアドレス。ログインと登録の目的で使用できます。 |
適切なアルゴリズムによって生成されたパスワードハッシュ。プレーンなパスワードの保存は避けなければなりません。 |
ユーザーが投票または調査をホストできるかどうかを識別するフラグ。 |
この列は、アプリケーションを使用しているユーザーの寿命を計算するために使用できます。 |
ユーザーの最後のログインを識別するために使用できます。 |
投票または調査ページに表示されるユーザーの簡単な紹介。 |
投票または調査ページに表示される所有者の詳細。 |
適切な制約のあるユーザーテーブルは次のとおりです。
CREATE TABLE `poll`.`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 `poll`.`poll` (
`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,
`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_poll_host` (`hostId` ASC),
CONSTRAINT `fk_poll_host`
FOREIGN KEY (`hostId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ポールメタ
投票メタテーブルは、投票バナーのURLなどを含む投票または調査の追加情報を保存するために使用できます。以下は、投票メタテーブルのすべての列の説明です。
投票メタを識別するための一意のID。 |
親の投票/調査を識別するための投票ID。 |
メタを識別するキー。 |
投票メタデータを保存するために使用される列。 |
適切な制約のあるポーリングメタテーブルは次のとおりです。
CREATE TABLE `poll`.`poll_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_poll` (`pollId` ASC),
UNIQUE INDEX `uq_poll_meta` (`pollId` ASC, `key` ASC),
CONSTRAINT `fk_meta_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
投票質問表
投票質問テーブルは、投票と調査に関連する質問を保存するために使用できます。理想的なシナリオは、投票用に1つの質問を持ち、調査用に複数の質問をすることです。以下は、投票質問表のすべての列の説明です。
投票の質問を識別するための一意のID。 |
親の投票/調査を識別するための投票ID。 |
質問の種類。タイプは、単一選択(はい/いいえ)、複数選択、選択、または入力にすることができます。 |
質問がアクティブかどうかを識別するためのフラグ。 |
質問が作成された日時が保存されます。 |
質問が更新された日時が保存されます。 |
質問を保存するために使用される列。 |
適切な制約のある投票質問表は次のとおりです。
CREATE TABLE `poll`.`poll_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`type` VARCHAR(50) 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_question_poll` (`pollId` ASC),
CONSTRAINT `fk_question_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
投票回答表
投票回答テーブルを使用して、単一選択、複数選択、および選択タイプの質問の回答を保存できます。選択式の質問の場合、回答は「はい」と「いいえ」になります。以下は、投票回答表のすべての列の説明です。
投票の回答を識別するための一意のID。 |
親の投票/調査を識別するための投票ID。 |
親の質問を識別するための質問ID。 |
回答がアクティブかどうかを識別するためのフラグ。 |
回答が作成された日時が保存されます。 |
回答が更新された日時が保存されます。 |
回答を保存するために使用される列。 |
適切な制約のある投票回答表は次のとおりです。
CREATE TABLE `poll`.`poll_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` 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_poll` (`pollId` ASC),
CONSTRAINT `fk_answer_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `poll`.`poll_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
投票表
投票投票テーブルは、ユーザーの選択と入力を保存するために使用できます。以下は、投票投票表のすべての列の説明です。
投票を識別するための一意のID。 |
投票/調査を識別するための投票ID。 |
質問を識別するための質問ID。 |
回答を識別するための回答ID。 |
ユーザーを識別するためのユーザーID。 |
回答が作成された日時が保存されます。 |
回答が更新された日時が保存されます。 |
ユーザー入力を格納するために使用される列。 |
適切な制約のある投票投票表は次のとおりです。
CREATE TABLE `poll`.`poll_vote` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` BIGINT DEFAULT NULL,
`userId` BIGINT NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_vote_poll` (`pollId` ASC),
CONSTRAINT `fk_vote_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_answer` (`answerId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_answer`
FOREIGN KEY (`answerId`)
REFERENCES `poll`.`poll_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_user` (`userId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_user`
FOREIGN KEY (`userId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
カテゴリテーブルと投票カテゴリテーブル
このセクションでは、カテゴリテーブルを設計します およびポールカテゴリテーブル 投票カテゴリとそのマッピングを保存します。以下は、カテゴリテーブルのすべての列の説明です。
カテゴリを識別するための一意のID。 |
親カテゴリを識別するための親ID。 |
カテゴリタイトル。 |
ブラウザのタイトルとSEOに使用されるメタタイトル。 |
URLを形成するためのカテゴリスラッグ。 |
カテゴリデータの保存に使用される列。 |
適切な制約のあるカテゴリテーブルは次のとおりです。
CREATE TABLE `poll`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));
ALTER TABLE `poll`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `poll`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
以下は、投票カテゴリテーブルのすべての列の説明です。
投票または調査を識別するための投票ID。 |
カテゴリを識別するためのカテゴリID。 |
適切な制約のある投票カテゴリテーブルは次のとおりです。
CREATE TABLE `poll`.`poll_category` (
`pollId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`pollId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_poll` (`pollId` ASC),
CONSTRAINT `fk_pc_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
タグテーブルとポーリングタグテーブル
カテゴリテーブルとポーリングカテゴリテーブルと同様に、タグテーブルを設計できます。 およびポールタグテーブル 。カテゴリとタグの主な違いを以下に示します。
- タグテーブルではparentId列は必要ありません。
- カテゴリの数は、ナビゲーション目的でメインメニューを形成するために使用できるため、低いままです。タグは、カテゴリと比較してより多くなる可能性があります。
- カテゴリとタグの両方を使用して、投票を関連付けることができます。
- 投票に割り当てるカテゴリはごくわずかですが、タグの数はもっと多くなる可能性があります。
概要
これは、世論調査および調査ベースのWebサイトおよびモバイルアプリケーションの形成として使用される世論調査データベースを設計する方法です。同じことをさらに強化して、ビデオ、支払い、サブスクリプションなどのより高度なオプションを追加することができます。
コメントを送信して、ディスカッションに参加できます。ブログアプリケーションのデータベースの設計にも興味があるかもしれません。 RBAC設計は、役割ベースのアクセス制御の実装に使用できます。
完全なデータベーススキーマはGitHubでも入手できます。