我正在建立一个类似于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 |纠正|
真是个噩梦。
答案 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 =外键