4

PHP と MySQL を使用して Web ベースのクイズ アプリケーションを作成中です。特に詳細を説明して退屈させたくないので、知っておく必要がある (と私が思う) ことを以下に示します。

質問はすべて多肢選択式であり、いくつかの列を持つ単純なテーブルに格納できます。

  1. ID: 質問番号 (プライマリ インデックス)
  2. カテゴリ: この質問が該当するカテゴリ (動物、野菜、鉱物など)
  3. テキスト: 質問の語幹 (例: What is 1+1?)
  4. Answer1: 考えられる答え (例 2)
  5. 回答 2: 考えられる回答 (例: 3)
  6. 回答 3: 考えられる回答 (例: 4)
  7. CorrectAnswer: 質問に対する正解 (1、2、または 3 (この場合は 1))

ユーザーは、ユーザー名とパスワードを作成してサインアップし、カテゴリから質問を試みることができます。

問題は、私が書いている質問が複数回試行されるように設計されていることです。ただし、ユーザーには進捗状況に関する詳細なフィードバックを提供する必要があります。質問に対する最初の試行は重要であり、ユーザーの全体的な「初めて回答された質問」スコアに貢献します。したがって、問題が何回試行されたかを追跡する必要があります。

アプリケーションは柔軟に設計されているため、何千もの質問を試みる何百ものユーザーをサポートしたいと考えています。したがって、この情報をユーザー テーブルまたは質問テーブルに統合しようとすることは不可能に思えます。この問題に取り組みたい方法は、ユーザーがサインアップしたときに、さまざまな列を使用して、ユーザーごとに新しいテーブルを作成することです。

  1. テーブル名: ユーザーの個別のテーブル (例: TableForUser51204)
  2. QuestionID: ユーザーが試行した質問の ID。
  3. CorrectFirstTime: 質問が最初に正しく回答されたかどうかを示すブール値。
  4. 正解: 質問が正しく回答された回数。
  5. 不正解: 質問の回答が不正解だった回数。

ですから、私が聞きたいのは、このようにデータベースを整理することが賢明であるかどうかということです。ユーザーごとに新しいテーブルを作成するよりも良い方法はありますか? たとえば 500 人のユーザーと 2000 の質問がある場合、パフォーマンスはどの程度低下しますか?

ありがとう。

4

1 に答える 1

6

ユーザーごとに新しいテーブルを作成したくありません。代わりに、データベース構造を変更してください。

通常、質問用のテーブル、オプション用のテーブル (正解かどうかを示すブール値の列を含む)、ユーザー テーブル、ユーザーの結合テーブル、およびユーザーの回答を保存するオプションがあります。サンプル スキーマ:

CREATE TABLE `options` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `question_id` int(10) unsigned NOT NULL,
  `text` varchar(255) NOT NULL,
  `correct` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `question_id` (`question_id`)
) TYPE=InnoDB;

CREATE TABLE `options_users` (
  `option_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `created` timestamp NOT NULL,
  KEY `option_id` (`option_id`),
  KEY `user_id` (`user_id`)
) TYPE=InnoDB;

CREATE TABLE `questions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `question` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`,`question`)
) TYPE=InnoDB;

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(60) NOT NULL,
  `password` char(40) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) TYPE=InnoDB;


ALTER TABLE `options`
  ADD CONSTRAINT `options_ibfk_1` FOREIGN KEY (`question_id`) REFERENCES `questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `options_users`
  ADD CONSTRAINT `options_users_ibfk_2` FOREIGN KEY (`option_id`) REFERENCES `options` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `options_users_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

これにより、オプションが質問にリンクされ、ユーザーの回答がオプションにリンクされます。createdまた、表に列を追加したoptions_usersので、ユーザーがいつ質問に回答したかを確認し、時間の経過とともに進行状況を追跡できます。

于 2012-09-17T13:37:46.187 に答える