4

我正在使用 PHP 和 MySQL 编写一个基于 Web 的测验应用程序。我不想让你特别厌烦它的细节,所以这就是(我认为)你需要知道的。

问题都是多项选择,可以存储在一个包含几列的简单表中:

  1. ID:题号(主索引)
  2. 类别:此问题所属的类别(例如动物、蔬菜、矿物质)
  3. 文本:问题词干(例如什么是 1+1?)
  4. 答案 1:可能的答案(例如 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 回答