gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:28:25 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com