我正在使用PHP和MysqL编写基于Web的测验应用程序.我不想特别向你介绍它的细节,所以这就是(我认为)你需要知道的.
> ID:问题编号(主索引)
>类别:此问题所属的类别(例如动物,
蔬菜,矿物质)
>文字:问题干(例如什么是1?)
>答案1:可能的答案(例如2)
>答案2:可能的答案(例如3)
>答案3:可能的答案(例如4)
> CorrectAnswer:问题的正确答案(1,2或3(在这种情况下为1))
用户可以通过创建用户名和密码进行注册,然后尝试从类别中提问.
问题是我写的问题不止一次被尝试过.但是,用户需要获得有关其进度的详细反馈.对问题的第一次尝试至关重要,并有助于用户的整体’问题第一次回答’得分.因此,我需要跟踪问题的尝试次数.
由于应用程序设计灵活,我希望能够支持数百个用户尝试数千个问题.因此,尝试将此信息集成到用户表或问题表中似乎是不可能的.我想解决这个问题的方法是为每个用户在注册时为各个列创建一个新表.
>表名:用户的个人表(例如TableForUser51204)
> QuestionID:用户尝试过的问题的ID.
> CorrectFirstTime:一个布尔值,表示是否
问题第一次得到正确回答.
>正确:问题得到解答的次数
正确.
>不正确:问题已被回答的次数
不正确.
所以我想我想问的是,以这种方式组织数据库是否明智.是否有更好的方法而不是为每个用户创建一个新表?如果有500个用户和2000个问题,这会对性能造成多大影响?
谢谢.
解决方法:
通常情况下,您有一个问题表,一个选项表(可能是一个布尔列,表明它是否是正确的答案),一个用户表,一个关于用户的连接表和存储用户响应的选项.示例模式:
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表中添加了一个已创建的列,以便您可以查看用户何时回答问题并跟踪他们的进度.