用于测试网站的MySQL

时间:2012-11-11 06:36:43

标签: php mysql sql apache

我正在建立一个类似于Moodle的网站。它基本上为学生举行测试。当在测试中允许多种类型的问题以及如何创建表来存储数据时,会出现混淆。

test_info 表将包含测试ID和说明。 测试表将包含测试ID和问题ID对。 要获得测试的问题,这将需要“SELECT * FROM test WHERE testID = $ tID”,这将花费大量时间在数据库变大时执行。

最初问题表包含问题,4种可能性和答案。

如何在数据库中存储多个问题和多种类型问题的数据?

例如:

测试51 - “简介数学”

问题1:什么是2 + 2? 答:4 B:12 C:7 D:8

问题2:(0,103)是等式y = 2x /(100x)的范围? 真假

这会产生2种不同尺寸的数据

问题:

|问题| A | B | C | D |纠正|

|问题|纠正|

如果我将这些存储在1个表中,每个问题将浪费4个50Char Var-Chars,如果我将这些存储在2个单独的表中,SELECT将如何知道选择哪个表?

问题: | TestID | TableID |问题ID |

Questions1: |问题| A | B | C | D |纠正|

Questions2: |问题| A | B | C | D |纠正|

真是个噩梦。

3 个答案:

答案 0 :(得分:0)

将答案放在他们自己的表格中:

answers (answer_id, question_id, description, sequence)

并将正确的answer_id放在问题表中。

答案 1 :(得分:0)

我认为你的数据结构将是这样的:

Table1 :Test

id:
TestName:

Table2: Questions:

id:
test_id:
Question:
Answer: //say a,b,c,d

Table3:Answers

id:
question_id:
Anwser Option: //say a,b,c,d
Answer:

Sql对于包含数据的表: 这些数据将帮助您理解结构。

CREATE TABLE IF NOT EXISTS `Tests` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Test` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Dumping data for table `test2`
--

INSERT INTO `test2` (`id`, `Test`) VALUES
(1, 'Test1');


//////////////////////////////////////

CREATE TABLE IF NOT EXISTS `questions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `test_id` int(11) NOT NULL,
  `Question` varchar(255) NOT NULL,
  `Answer` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `questions`
--

INSERT INTO `questions` (`id`, `test_id`, `Question`, `Answer`) VALUES
(1, 1, 'question1', 'a'),
(2, 2, 'Question2', 'd');

////////////////////////////////////////////////////

CREATE TABLE IF NOT EXISTS `answers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `question_id` int(11) NOT NULL,
  `answer_option` varchar(10) NOT NULL,
  `Answer` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `answers`
--

INSERT INTO `answers` (`id`, `question_id`, `answer_option`, `Answer`) VALUES
(1, 1, 'a', 'True'),
(2, 1, 'b', 'False'),
(3, 2, 'a', 'Asnwer1'),
(4, 2, 'b', 'Answer2'),
(5, 2, 'c', 'Answer3'),
(6, 2, 'd', 'Answer4'),
(7, 2, 'e', 'Answer5');

答案 2 :(得分:0)

VARCHAR(50)只需要6位,这意味着它(很可能)只占用磁盘上的一个字节。 VAR中的VARCHAR表示空间使用将适应实际数据。这意味着使用一个表将“浪费”每个问题只有四个字节。

由于您在代码中以两种不同的方式处理两种类型的问题,因此您的双表方法也是可行的。

推荐的方法是:

请注意,四个答案问题和是 - 否问题都是多项选择题的特殊情况。将它们存储在数据库中。一种可能的架构:

question: question_id (PK), test_id (FK), text
answer: answer_id (PK), question_id (FK), text, is_correct

PK =主键,FK =外键