0

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

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

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

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

例如:

测试 51 - “数学入门”

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

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

这导致具有 2 种不同大小的数据

问题:

| 问题 | 一个 | 乙| C | D | 正确 |

| 问题 | 正确 |

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

问题:| 测试ID | 表ID | 问题ID |

问题1: | 问题 | 一个 | 乙| C | D | 正确 |

问题2: | 问题 | 一个 | 乙| C | D | 正确 |

什么样的恶梦。

4

3 回答 3

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');
于 2012-11-11T06:55:39.963 回答
0

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

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

推荐的方法是:

请注意,四答题和是非题都是多项选择题的特例。将这些存储在数据库中。一种可能的模式:

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

PK = 主键,FK = 外键

于 2012-11-11T06:57:50.403 回答
0

把答案放在他们自己的桌子上:

answers (answer_id, question_id, description, sequence)

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

于 2012-11-11T06:51:33.680 回答