php - MySQL/PHP 测验引擎 - 防止多次尝试

标签 php mysql database

我正在使用 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:一个 bool 值,说明是否 第一次就正确回答了问题。
  4. 正确:问题被回答的次数 正确。
  5. 不正确:问题被回答的次数 不正确。

所以我想我想问的是,以这种方式组织数据库是否明智。有没有比为每个用户创建一个新表更好的方法?如果有 500 个用户和 2000 个问题,这会对性能造成多大的影响?

谢谢。

最佳答案

不想为每个用户创建一个新表。相反,请修改您的数据库结构。

通常,您会有一个问题表、一个选项表(可能有一个 bool 列来指示它是否是正确答案)、一个用户表以及一个关于用户和选项的连接表来存储用户的响应.示例模式:

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;

这会将选项链接到问题,以及用户对选项的回答。我还在 options_users 表中添加了一个 created 列,这样您就可以看到用户何时回答了问题并跟踪他们的进度。

关于php - MySQL/PHP 测验引擎 - 防止多次尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460271/

相关文章:

来自同一个表的 MySql 外键(2 列与一个键相关)

php - 在 Php 中以带换行符的纯文本格式发送 XML 电子邮件

php - 为什么引用使用更多内存?

php - Logo 后面的 WordPress 帖子特色图片背景标题

php - Laravel PHP向数据库插入数据时出现无效字符串问题

mysql - 插入后在另一个表上触发更新

php - Laravel:如何使用多个数据透视表关系

php - 仅在 html 表(php、mysql)中显示数组的最后结果

sql - 将字段从一个表更新到另一个,涉及 3 表连接

mysql - 填充关系数据库的抽象和架构