我正在使用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个问题,这会对性能产生多大的影响?

谢谢。

#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;

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

  ask by DoctorClod translate from so

未解决问题?本站智能推荐:

2回复

PHP和MySQL基于时间的测验应用程序

我正在使用PHP和MySQL进行基于时间的测验项目,并将结果存储在下表中。 表:得分 分数栏包含每个问题的分数 分数计算基于: 正确答案使用的最短时间= 100% 正确答案使用的第二个最短时间= 75% 正确答案使用的第3个最短时间= 50% 其他正确答案=
4回复

使用PHP和MySQL开发“测验”Web应用程序的数据库设计

所以,我正在尝试学习 PHP 和 MySQL(我对两者都有基本的了解;我已经阅读了 Head First SQL 和 Head First PHP & MySQL 的前半部分),我认为巩固知识的最佳方法是通过建造东西而不是阅读。 考虑到这一点,我想创建一个连接到服务器上的 MySQL 数据库
3回复

PHP/MySQL:连续快速防止重复操作

对于浏览器的游戏,我有一个数据库表中的战斗 : fightID fromID TOID 模拟(1 = true,0 = false) 每当用户请求页面时,我都会选择所有仍需模拟的战斗 : 然后在PHP脚本中模拟这些出色的战斗,最后, 将战斗标记为“模拟”,获胜者获
1回复

数据库设计/ERD-测验引擎

自从我开始上学以来,我一直在使用此网站作为重要资源-但是我以前从未遇到过如此具体的问题,并且希望能有所帮助。 在弄清数据库结构时,我从来都不是最好的,我的任务是创建具有一些相当特定的规范的PHP / MySQL测试引擎。 因此,您可以更好地了解我要在这里做什么-我正在尝试考虑以下因素:
2回复

PHP-尝试输入到MYSQL表中

因此,我试图插入MYSQL表数据库中,但遇到错误,并且四处搜索并没有太大帮助,所以我来这里是为了获得更多帮助。 这几乎是W3school代码的一个副本,所以我对为什么它不起作用以及试图使其发出错误的原因感到困惑。 任何帮助深表感谢!
4回复

使用MySQL或PHP防止重复条目的正确方法

我有具有songCategory和songName列的song表。 songCategory和songName的组合在数据库级别设置为唯一。 因此,基本上即使php尝试插入重复的条目数据库也不允许。 问题是,项目具有用户可以一次插入一堆歌曲的功能。 如您所知,对大数据的重复记录检查需要
1回复

PHP和MySQL:防止攻击-这些功能之间有何不同?[重复]

这个问题已经在这里有了答案: 如何防止PHP中进行SQL注入? 28个答案 我一直在研究一些用于登录数据库的示例代码,并且作者提供了两个功能,用于使输入的数据对数据库安全,而很少解释为何在何处使用。 我试图弄清楚它是否是多余的,以及是否根本不使用它们中的一个,因为它看起来很
1回复

PHP/MySQL-检查重复数据并防止插入空值

我正在学习 PHP MySQL。 我编写了一个 HTML 表单来在 mysql 数据库中插入电子邮件和国家/地区名称。 我成功。 但是有一些问题..如何检查重复数据并防止插入空数据? 这是我的 HTML 代码 这是add_entry.php代码 现在我不明白我在 add_entry.php 中编写了